网络天空蠕虫病毒分析
作者:青青子衿
email:anzijin@sina.com
第一部分 解压缩
代码位于地址41200F到4120B9部分,用于把压缩前的原始数据拷贝到恰当的地址处,共通过了四次循环执行这段代码,把不同的数据内容拷贝到了不同的地址区域中。第一次拷贝过程的目的地址和源地址由指令直接将立即数MOV给ESI 、EDI,之后的过程是从EBX指向的地址4001D2,获取一个数值,赋值给EDI,经过处理后(EDI=EDI-2;SHL EDI,0C)从而获得拷贝的目的地址,源地址在原来基础上顺延,不进行刻意改变。具体四次拷贝详情如下:
第一次拷贝。
寄存器初始值为:ESI=411C2C 、EDI=401000。实现的功能将411C2C至411DA2地址区间的数据经过处理后拷贝到401000至401201地址区间中。应该是代码段部分。
第二次拷贝
初始寄存器值为:ESI=411DA3 、EDI=403000。实现的功能将411DA3至411E40地址区间的数据经过处理后拷贝到403000至4030E0地址区间中。
第三次拷贝
初始寄存器值为:ESI=411E41 、EDI=4030E1。实现的功能将411E41至411EC5(0X84)地址区间的数据经过处理后拷贝到404000至404155(0X155)地址区间中。地址差距太大,具体原因需要进一步分析。
第四次拷贝
初始寄存器值为:ESI=411EC6 、EDI=4021CE。实现的功能将411EC6至411F74地址区间的数据经过处理后拷贝到4021CE至4022C9地址区间中。
拷贝完成之后抓取内存映射生成dump3.exe文件。
拷贝完成后,跳转到4120BE处开始处理输入函数。
第二部分 输入表重构
EIP来到4120BE处。
1. 在4120C9处执行 CALL [EBX]调用LoadLibrary函数,通过*EDI传递参数KERNEL32.DLL。返回值保存在EAX中,为77E60000,将其赋值给EBP,将在以后调用GetProcAdress时作为hModule参数的实参来使用,EAX被清零。
2. 将EDI指向紧跟在KERNEL32.DLL后的第一个函数名字符串的首字符。代码地址位4120CC到4120CF
3. 处理函数名:在加壳时加壳程序将原程序中IMAGE_IMPORT _BY_NAME里保存的所有函数名字符串的第一个字符的ASCII码进行了加三的处理
4. 例如:CloseHandle 函数的存储形式始FloseHandle,这里的还原方法是连续三次执行DEC BYTE PTR [EDI],三次执行的地址分别位于4120D1 、4120D5、4120DF 。
调用GetProcAddress函数,两个参数分别通过EDI、EBX压入栈中。返回值为77E63D43 ,存入ESI指向的地址402000处,跳回到4120CC处,重复步骤3。来获得下一个函数的地址。
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
;
5. 当处理完最后一个函数名字符串CreateMutexA,并调用GetProcAdress函数得到其地址后,此时寄存器EDI指向紧跟在CreateMutexA字符串后得03。经过三次减一操作后,变为零跳到401189处。此时抓取内存保存到dump4.exe文件中。
第三部分 生成userconfig9x.dll 和FVProtect.exe文件
用于在C:/WINNT文件夹中创建userconfig9x.dll文件并把正在运行的文件拷贝到C:/WINNT文件夹中命名为FVProtect.exe 。
调用了一系列API函数由
函数名
地址
CreateMutexA
00401189
GetLastError
0040119E
GetTickCount
004011B8
*GetModuleHandleA
004011CB
LoadLibraryA
004011E0
GetProcAddress
004011F2
*GetModuleFileNameA
004010F4
@*GetWindowDirectoryA两次
004010FA
*Lstrcat 两次
00401118
GetModuleHandleA
00401035
*FindResourceA
00401048
*LoadResource
00401052
*LockResource
00401059
*Sizeof Resource
00401068
CreateFileA
00401082
*WriteFile
004010BE
*CloseHandle
004010C7
*CopyFileA
0040117F
GetModuleHandleA
004011CB
在4011B3处调用GetTickCount( )函数之前调用函数CALL 4010DA 。
当执行到401168处,以调用函数的方式,跳转到401028地址处。
当执行到40109A处,以调用函数的方式,跳转到401000地址处。
在40
详细情况:
1.CreateMutex(0,0,*(00403008))
*403008==00403074,其指向的字符串是DroppedSkyNet
返回值是2C。
函数作用是创建一个互斥的对象,返回值为获得的互斥对象的句柄,存放在地址4030E4处。
2.GetLastError( )
当返回值为B7是表示,互斥对象已被创建,调到4011FE处,执行跳转的指令位于4011A9处。
3.Call 40101E
把00000000存到4030E8中,作用不详。
返回后执行
4.Call 4010DA 在4011B8处调用。
4.1.GetModuleFileNameA( 00,EAX ,ESI)
其中EAX==12F358;
//指向用来存放模块路径的缓冲区的指针
ESI==400 缓冲区的大小。
第一个参数hModule为空返回创建该进程的文件的路径。
返回值为31h。地址12F358处的值是C:/documents and Settings/jszx/. . . ./FVProtect.exe
4.2.GetWindowsDirectoryA( EAX,ESI )
作用获得Windows文件夹的路径,EAX==12FB9C指向存放路径字符串的缓冲区地址,ESI==400存放缓冲区的大小。
返回值为8。得到的文件夹路径为C:/WINNT
在次调用本函数,将Windows文件夹的路径存放到12F778
4.3 lstrcat(EAX,EDI)
EAX==12FB9C;EDI==4030E0
把字符串*EDI追加到字符串*EAX之后。
连续调用两次该函数的作用是将字符串/FVProtect.exe追加到12FB9C 处的字符串C:/WINNT之后。返回值为字符串的指针。
在调用两次该函数,将字符串/FVProtect.exe追加到12F778 处的字符串C:/WINNT之后。
4.4 401168 Call 401028(65,EAX)
其中EAX==12F778;
作用在C:/WINNT文件夹中创建userconfig9x.dll文件,把本进程地址空间中从40B130到411930共6800个字节经解密后存入该文件。
4.4.1 GetModuleHandleA(null)
返回创建本进程的文件的句柄,为00400000
4.4.2 FindResource (ESI,EAX,4030C8)
其中ESI==00400000为文件的句柄, EAX==65资源的标号为65,这里也可以是指向资源名字符串的指针, 4030C8为资源的类型指向的字符串为BINARY。返回值为返回值为指定资源的信息板的句柄,值为0040B0D8。
4.4.3 LoadResource(ESI,EBX)
其中ESI==00400000资源所在模块的句柄 ;EBX==0040B0D8 资源的句柄。返回值为0040B130是与资源相关联的数据的句柄
4.4.4 LockResource(EAX)
EAX==0040B130 函数锁住内存中的指定资源,返回值为???0040B130是一个指向资源第一个字节的指针。如果返回值为00,则未锁住资源执行00401064 JZ 401090。
4.4.5 SizeofResource(ESI,EBX)
其中 ESI==00400000文件的句柄,EBX==40B0D8模块的句柄。返回值为6800表示资源的长度。
4.4.6 401082 CreateFileA(EBP+0C,
40000000,
EDI,
EDI,
02,
00000080,
EDI)
EBP+0C==12F778; EDI==0000000,而*(EBP+0C)==C:/WINNT/userconfig9x.dll
返回值为30是用来打开文件的句柄,如果返回值等于-1,则跳转到4010D5,结束4.4函数。其返回值得详细含有有待于进一步查阅相关资料。
4.4.7 比较ESI 和EDI 低于等于是跳到4010B2,否则调用Call 401000,之后有一句指令 CDQ 表示EAX符号扩展到EDX。
4.4.8对二进制资源进行解密处理,指令区间在0040109A至004010B0之间.
汇编代码为:
0040209A: CALL 00401000
CDQ ;
MOV ECX , 00000100
IDIV ECX ;带符号数除法
;余数被放到EDX中
MOV EAX ,[EBP+08]
;EAX被赋值为40B130
XOR [EAX+EBX] ,DL
;EBX的初始值是00
INC EBX
CMP EBX,ESI
;ESI中为二进制资源的长度
JB 0040109A
具体的Call 401000 执行的内容用类C语言描述为:;
EAX=EAX*343FD; //初始值EAX==0
EAX=EAX+269EC3;
*4030E8=EAX;
EAX=EAX>>10 //算术右移10位
EAX=EAX & 77FF
此时用 d eax 命令查看0040B130 可见是一个完整的可执行文件。范围从40B130到411930共6800个字节。
此时抓取整个进程的内存,命名为dump5.exe, 抓取内存40B130到411930一段命名为dump6.exe 。
4.4.9 WriteFile(EBP+C,
EBP+9,
ESI,
EAX
EDI )
其中:EBP+C==30 要写入文件的句柄;EBP+9==0040B130 指向要写入的数据;ESI==6800写入数据的字节数。EAX ==00 pointer to number of bytes written ; EDI==00指向 overlapped I/O机构的指针.
执行完成后EAX变为1。
4.4.10 在4010D9处执行RET命令返回到40116D
4.5 40117F CopyFileA(EAX,EAX,00)
其中:第一个EAX== 12F358该指针指向C:Documents and Settings/jszx/…./FVProtect.exe. 第二个EAX==12FB9C该指针指向C:/WINNT/FVProtect.exe.
4.6 在401188处执行RET指令返回到4011B8处。
5.GetTickCount()获得从开机到现在为止,经过了多长时间。
6. 4011BF Call 40101E 4030E8处赋值00114348==CH
7.GetModuleHandleA(*403000)
*403000==userconfig9x.dll
返回值为零.
8.LoadLibrary(*403000)
GetmModuleHandle无法获得文件句柄,调用本函数来获得文件句柄为10000000
9. 4011F2 GetProAddress(EAX, 01)
EAX==10000000,为文件句柄,返回值为10004BE4
第四部分 病毒发作部分
位于userconfig9x.dll文件中,FVProtect.exe通过输入函数调用userconfig9x.dll文件中的代码。
Userconfig9x.dll的装入地址是1002BFA0 。
一.解压缩部分
1.解压缩部分位于1002BFA0至1002C0AC段
2.Userconfig.dll重构输入表部分
1002C0CA调用LoadLibrary( eax)函数返回值为77E60000
第一次装入 KERNEL.DLL文件
第二次装入ADVAPI.DLL文件
第三次装入user32.dll文件
第四次装入wininet.dll文件
第五次装入wininet.dll文件
1002C0E8 调用GetProcAddress()返回值为77E6FAC7。
1002C0E2 处是一个花指令,将值改为90。
二.脱壳后文件的分析
在此处抓取内存定名为dump7.exe。该文件是脱壳后的userconfig9x.dll文件在内存中的映射。
调用userconfig9x.dll的?wormMain@@YAXXZ 函数,地址是10004BE4。
1.GetTickCount() 获得开机时间。返回值EAX==11D1B7
2.Call 10001D67
将1中获得的从开机到现在所经过的时间存放到地址100276E4处。
3.Call 10004F02
调用该函数实现对注册表的修改,把机后自动运行FVProtect.exe文件的设置写入注册表。并删除一些内容。
#define HKEY_CLASSES_ROOT (( HKEY ) 0x80000000 )
#define HKEY_CURRENT_USER (( HKEY ) 0x80000001 )
#define HKEY_LOCAL_MACHINE (( HKEY ) 0x80000002 )
#define HKEY_USERS (( HKEY ) 0x80000003 )
#define HKEY_PERFORMANCE_DATA (( HKEY ) 0x80000004 )
#if(WINVER >= 0x0400)
#define HKEY_CURRENT_CONFIG (( HKEY ) 0x80000005 )
#define HKEY_DYN_DATA (( HKEY ) 0x80000006 )
补充相关笔记:
3.1 GetModuleHandleA()获得本进程所属文件的路径C:/Documents and Settings /jszx/…/FVProtect.exe。
3.2 GetWindowsDirectoryA()获得系统文件夹路径。
3.3 10004F74 Call [10008000]
实质调用的函数是RegOpenKeyA(EDI,ESI,EAX)其中EDI==80000002 由上表知表示的主键是HKEY_LOCAL_MACHINE; ESI==1000E04C指向的字符串是SOFTWARE/Micorosoft/Windows/CurrentVersion/Run; EAX==12F784,是用来存放获得的注册表句柄的地址。执行后得到的句柄是58。返回值为00,调用成功。该函数的作用是打开注册表的HKEY_LOCAL_MACHINE/SOFTWARE/Micorosoft/Windows/CurrentVersion/Run获得其句柄为后面的对该项的修改作准备。
3.4 10004F99 Call [10008004] 实质上调用的函数是RegSetValueExA ( *(ESP+24), *1000A078 , 00 ,01 EAX ) 其中*(esp+24)==58是3.3中得到的注册表的句柄。*1000A078==1000D814指向的字符串是Norton Antivirus AV;参数00保留字;01指定类型为REG_SZ型;EAX==12F788指向字符串C:/WINNT/FVProtect.exe。返回值为00显示函数调用成功。函数的作用是设置键值。
3.5 Call [10008008] 实质上是调用函数RegCloseKey(*(ESP+10)) 其中*(ESP+10)==12F784指向的数值是58,是注册表的句柄。返回值是00显示函数调用成功。该函数的作用是关闭关闭3.3中打开的注册表。
3.6 10004FB1 CALL 10005136( EDI, ESI , EBX )其中EDI==80000002; ESI==1000E04C指向字符串SOFTWARE/Micorosoft/Windows/CurrentVersion/Run ;EBX==1000E040指向字符串Explorer。
3.6.1 10005143 RegOpenKeyA(*(EBP+08), *(EBP+0C), EAX)其中*(EBP+08)==80000002,指定打开的主键是 HKEY_LOCAL_MACHINE; *(EBP+0C)==1000E04C,指向字符串SOFTWARE/Micorosoft/Windows/CurrentVersion/Run; EAX==12F76C用来存放执行后获得的句柄。返回值是58。
3.6.2 RegDlelteValueA(58,*(EBP+10))删除Explorer键值。
3.6.3 RegCloseKey(58)关闭打开的注册表。
3.7 10004FBE Call 10005136 第二个参数是80000001。表示删除HKEY_CURRENT_USER /SOFTWARE/Micorosoft/Windows/CurrentVersion/Run 键中的 Explorer键值。
3.8 10004FD6 CALL [1000800C] 实质上调用的函数是RegDeleteKeyA(80000000, 1000E004)其中参数80000000 表示主键HKEY_CLASSES_ROOT,1000E004要删除的键名的字符串CLSID/{ E6FB5E20-DE35-11CF-9C87-00AA005127ED}/InProcServer32.Explorer。本函数的作用是删除该键。
#define HKEY_CLASSES_ROOT (( HKEY ) 0x80000000 )
3.9 之后调用数次Call 10005136函数分别删除一系列键值。
4.Call 10001D71
10001D81 WSAStartup(101,EAX)
101为windows版本号,EAX==0012FE1C函数调用后该地址的值是WinSock2.0
返回值为00000000
5.10004BFE 至10004C15段的作用是将1001E684到1001F690共100C个字节以及100226B4到100236C0共100C个字节的空间清0。
6.Call 100053C0(EDI) 指向字符串lola@sexnet.com,进行了一系列的数据处理。返回值EAX==F。为字符串的长度。
7.10004C2B Call 1000546F(EAX)
作用:返回了字符串ir=C:/WINNT
7.1 10005475 Call 1000596F(ESP+8,01)
其中esp+8 处的值是F。
7.1.1 call 1000599B
7.1.1.1 call 100065D6(09)有api
7.1.1.2 call 100059E0(F)
返回值EAX指向字符串ir=C:/WINNT。
7.1.1.3 call 10006637(9)
7.1.1返回EAX=8A0F60指向字符串ir=C:/WINNT
8.Call 100052D0(EAX,EDI)
9.10004C55 CreateMutexA( )
创建互斥对象,返回的句柄为70。
10.GetLastError( )
用来判断该对象是否已经存在,如果存在返回值为
ERROR_ALREADY_EXISTS
11.Call 10004D32
11.1 10004D4E GetModuleFileNameA(ebx,eax,esi) 其中ebx==null;eax==12FBA8;esi==400;返回值为eax==31。
作用是获得当前程序的存放路径。C:/Document and Settings/jszx/…./FVProtect.exe。
11.2 GetWindowsDirectoryA( esi==10027E4 ,esi==null)
获得系统中Windows文件夹的路径。
11.3 Call 100053C0
11.4 Call 100052E0两次调用该函数的作用是获得字符串C:/WINNT/base64.tmp。
11.5 10004D93 _lopen( eax ,ebx==null)
其中EAX==12FBA8指向字符串C:/Document and Settings/jszx/…./FVProtect.exe。
作用是打开FVProtect.exe,返回的文件句柄是74。
11.6 10004D9D _lcreat( esi ,ebx )
作用打开C:/WINNT/base64.tmp 文件,返回的文件句柄是78。
11.7 Call 10004DD8(EDI,EBX,48)
11.7.1 10004DFA _hread( EBP,ESI, 01) 读取FVProtect.exe文件的第一个字符M.
其中EBP==12FB88 存放的值是74;ESI==12FB84。连续调用3次,读入"MZ "三个字符。
11.7.2 10004E27 call 10004e8f( eax==12FB84, eax==12FB74)
前者存放“MZ ”三个字符,后者指向字符串C:/WINNT/base64.tmp,调用完成后地址12FB74处存入字符串TVqQ。是通过函数那一系列于“MZ ”有关的计算得到的。
11.7.3 10043B _hwrite( EBP+C,EAX, 01 )
其中EBP+C处的值位78 为C:/WINNT/base64.tmp文件的句柄。EAX指向字符串TVqQ。四次调用该函数后,把字符串写入文件中。
11.7.4 CMP [EBO-10] ,EDI
JNZ 10004DEB
跳回到11.7.1循环执行,直到将FVProtect.exe文件中的数据全部经过处理并存入base64.tmp文件中。
11.8 _lclose() 分别关闭与base64.tmp和FVProtect.exe相关联的句柄。
12. 10004C8D Call 10005164( 1000DE18,100266E4,1000DE24 )
其中1000DE18 指向字符串zip1.tmp; 1000DE24指向字符串document.txt
12.1 1000517F GetModuleFileNameA( 00, EAX, ESI )
其中ESI==400; EAX==12F79C;返回值eax==31,函数作用是获得创建本进程的文件的路径。C:/Document and Settings/jszx/…./FVProtect.exe
12.2 10005190 GetWindowDirectoryA(EDI, ESI)
其中EDI==100266E4; ESI==400;
作用是获得Windows文件夹的路径。
12.3 Call 100053C0 (EDI)
12.4 call 100052E0( EDI, 1000D864 )两次
1000D864==5C
12.5 100051C2 GetWindowDirectoryA,之后又调用Call 100053C0一次,call 100052E0两次。
12.6 Call 10001970
12.6.1 CreateFileA(*(EBP+3),
80000000
03
ESI
03
EDI
)
作用是创建C:/Document and Settings/jszx/…./FVProtect.exe的文件句柄,句柄为78。
12.6.2 CreateFileA()
作用是创建C:/WINNT/zipped.tmp文件句柄,句柄为74。
12.6.3 100019DC Call 10005270( EAX, ESI, 1E) 其中EAX==12F734,指向的值是8。Esi==00。共调用三次
12.6.4 Call 1000BAB
12.6.4.1 GetSystemTime(EAX)作用是获得当前的时间。其中EAX的值是12F2B0,用来存放时间结构体。值为D507 0500 0300 0400
7D5h==2005d 年 05h==05d月,日期为03
大于2010年小于1999,则将值设为2004年;月份不在1至12时,月分设为1;日期超出1至31范围的定为10
12.6.4.2 以获得的时间为参数对数据进行处理。
12.6.5 Call 10001C30
12.6.5.1 SetFilePointer(EBP+8, ESI ESI ,ESI) 作用把指针设置在C:/Document and Settings/jszx/…./FVProtect.exe文件开始处。
12.6.5.2 ReadFile(EBP+8,EAX,EBX,EAX,ESI)
其中EBP+8==78是文件FVProtect.exe的句柄。EAX==12EEB4存放读入数据缓冲区的指针。EBX==400读入字节数;EAX==存放实际读入字节数的地址。ESI==00 If hFile was not opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL
作用是读入FVProtect.exe文件的前400字节的数据。
12.6.5.3 10001C83 Call10001854(EBP-08,eax, ebp -4)
其中ebp-8==12F2B4; EAX==12EEB4; EBP-4==12F2B8存的数据是400。
作用是度读入的400字节的数据进行一系列的数学上的加密处理。
跳回到12.6.5.2继续读入FVProtect.exe文件中的数据
12.6.5.4 SetFilePointer(74,00,00,00)
作用把指针设置在C:/Document and Settings/jszx/…./FVProtect.exe文件开始处。
12.6.6 GetFileSize(78,00)
作用是获得文件FVProtect.exe的长度值。返回值为7380。调用两次。把7380分别存放到地址EBP-2E;EBP-5C;EBP-2A;EBP-58四处。
12.6.7 10001A71 _lstrlen(ebp+10)
参数指向字符串document.txt…..。返回值为53。把返回值存入EBP-26和EBP-54处。
12.6.8 WriteFile(EDI ,EAX,1E, EAX==12F77C, ESI )
其中EDI==74是文件zipped.tmp的句柄,EAX==12F734指向要写入文件的数据,1E写入的字节数,EAX存放实际写入字节数的地址。
12.6.9 10001A71 _lstrlen(ebp+10)
参数指向字符串document.txt…..。返回值为53。
12.6.10 WriteFile(EBP+C ,EBP+10,EAX, EAX, ESI )作用是将document.txt…..字符串写入zipped.tmp文件。
12.6.11 SetFilePointer()设置FVProtect.exe的文件指针。
12.6.12 ReadFile()读入FVProtect.exe文件的前400h数据存放到12F300处。
12.6.13 10001AFC WriteFile写入到zipped.tmp文件中。
12.6.14 在10001B04处执行jmp 10001AC4
跳回到 12.6.12中循环执行。
经过多次调用读写函数后完成FVProtect.exe中的所有数据经处理后写入zipped.tmp文件的工作。
12.6.15 CloseHandle 调用两次分别关闭zipped.tmp和 FVProtect.exe的句柄。
12.7 _lopen( ) 打开 C:/WINNT/zipped.tmp 文件,返回的句柄是78。
12.8 _lcreat( ) 创建C:/WINNT/zip1.tmp文件对象的句柄,返回的句柄为74。
12.9 Call 10004DD8 在本文的11.7中对该函数做了详细分析。作用是zipped.tmp文件中的数据全部经过处理并存入zip1.tmp文件中。
12.10 调用_close()函数两次分别关闭文件zip1.tmp文件和zipped.tmp句柄。
13. 10004CAC Call 10005164(1000DDB4,10026AE4,1000DDC0)
其中1000DDB4指向字符串zip2.tmp; 10026AE4==00; 1000DDC0指向字符串data.rtf。
14. 10004CC7 Call 10005164(1000DD50,10026EE4,1000DD5C)
其中1000DD50指向字符串zip3.tmp; 1000DD50==00 1000DD5C指向字符串details.txt。
15. 10004CD7 到10004D1B一段
15.1 10004CE8 CreateTread(ESI,
ESI,
10002525,ESI,
ESI,
EAX)
其中ESI==00;EAX==12FFBC。返回的线程句柄是74
15.2 10004CFF CreateTread(ESI,
ESI,
1000256F,ESI,
ESI,
EDI)
其中ESI==00;EDI==100276F0。返回的线程句柄是418
15.3 Sleep(EDX)作用时挂起当前线程EDX毫秒
代码10004D01到10004D0F段通过运算产生一个EDX值,设为挂起的时间。
跳回到10004CF5,再次执行15.2,循环执行三次分别创建三个线程,句柄为418、21C、4FC。
16. 10004D1F Call 1000256F
16.1 10002584 Sleep(32) 线程挂起32毫秒。
16.2 10002592 InternetGetConnectState(EAX,00)
其中EAX==12FF94,调用函数后其值为32 ,该值用来标识当前系统的网罗连接情况。
16.3 GetLocalTime(EAX) 其中EAX==12FF98,该地址用来存放调用函数获得的当前时间结构体。其中的值是D507 0500 0400 0500 0F00 0400 3B00 C601
16.4 1000260E InternetGetConnectState(EAX,00)
其中EAX==12FF94,调用函数后,其值为32 ,该值用来标识当前系统的网络连接情况。
100026FE lstrlen(*(ebp+8)) 指向字符串unispim@thunisoft.com
返回值是15。
@@1000261C判断循环次数ESI是否小于34,不小于则跳至10025B7,继续循环。
16.5关键部分是调用Call 100026B0
1.1 10002760 call 10001642
1.1.1 1000646 call 1000165B
1.1.1.1 GetmoduleHandleA(EAX)
EAX指向ansapi.dll字符串,返回的句柄是77960000
1.1.1.2 GetProcAddress获得DnsQuery_A函数的句柄。值为77963937
1.1.1.3 DnsQuery_A ( *(EBP+8)
0F
ESI
ESI
ECX
ESI )
ESI==00; ecx==04,*(ebp+8)的地址用来存放获得的字符串入thunisoft.com
返回值是267C。
1.1.1.4 100016B2 jmp 10001728结束
1.1.2 Call 1000172C
死机部分分析数据丢失。
1.1.2.1 GetModuleHandleA() 获得iphlpapi.dll文件的句柄为77300000。
1.1.2.2 10001778 GetprocAddress()获得GetNetworkParams函数的地址。返回值是77307C69
1.1.2.3 GetProcessHeap 获得本进程的堆的句柄。返回值是00130000。
1.1.2.4 Call *10008060 实际调用地址是77FCC0EF,返回值为7801 1300。
1.1.2.5 GetNetworkParams(ECX,EAX)其中ecx; eax==1300。
1.1.2.6 htons (35) 返回值是3500
1.1.2.7 inet_addr( ESI) 把一个IPV4地址转换成IN_ADDR结构体。返回值为00。
1.1.2.7 Gethostbyname( ESI) 返回值为14B678 指向一个HOSTENT结构体
1.1.2.8 10001805 Call 10001000
1.1.2.8.1 10001011 Call 10001036
1.1.2.8.1.1 10001043 GetProcessHeap() 获得当前进程堆的句柄。值为130000。
1.1.2.8.1.2 10001071 socket (02,02,11)建立套接字返回值为224。
1.1.2.8.1.3 htons(100)返回值是1。
1.1.2.8.1.4 100010C2 Call 100012CE
(1) Call 10005270(EAX,EBX,400)其中EAX==130000,为堆的句柄;EBX==00;返回值为12F490。
(2) GetTickCount()获得开机时间。为5847F。
(3) 10001311 htons(1)返回值为100。
(4) 10001339 Call 10001387
(5) htons(F)返回值为F00。
(6) 10001373 sendto(ebp+8, eax, esi, ebx, ebp+c,10)其中ebp+8 为套接字,eax为缓冲区地址,esi为长度。
1.1.2.8.1.5 数次循环
1.1.2.8.1.6 GetProcessHeap
1.1.2.8.1.7 closesocket() 调用成功返回00。
1.1.2.8.2 10001025 Sleep(64)挂起64微秒。
1.1.2.8.3 循环两次后返回。
1.1.2.9 GetProcessHeap() 返回值是130000。
1.1.2.10 1000181F Call *1000805C
*1000805C==77FCC644。返回值为1。
1.1.2.11 10001654 Call 1000172C 调用结束
1.2 10002760 Call 10001642 调用完毕。