朝花夕拾(3)—— 网络天空蠕虫病毒分析

 

 网络天空蠕虫病毒分析   

 

作者:青青子衿

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  调用完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值