• 标 题:灌水-某木马初步分析
  • 作 者:kongfoo
  • 时 间:004-05-25,16:16
  • 链 接:http://bbs.pediy.com

某木马初步分析
kongfoo/2004.5.25
  今天早上把QQ挂在线上,过了一会有个人加了好友,过了一会就发了个文件
过来,“照片62.EXE”,JPG的图标,用PEiD看一下是ASPACK的壳,反正正
想要找些东西来玩玩(上个星期搞了一个星期某壳的unpacker还未成功,郁
闷中)。
  ASPACK的壳好脱啦,直接去入口+3ae的地方就是出口。

代码:
0040A3AF    61              POPAD 0040A3B0    75 08           JNZ SHORT 照片62.0040A3BA 0040A3B2    B8 01000000     MOV EAX,1 0040A3B7    C2 0C00         RETN 0C 0040A3BA    68 E2154000     PUSH 照片62.004015E2  ==去OEP 0040A3BF    C3              RETN

  有壳文件111K,脱出来56K,好像和ASPACK的压缩效率不相符。。。先不管。
  脱出来后先bpx j看看都用了什么API,心里面先有个底。没发现什么
有大杀伤力的调用,可以放心跟
  看代码是VC的程序。dump窗口数据段有80c834bc.jpg的字串,呵呵,
一定是要解一个图片出来明修栈道,暗渡陈仓啦。
代码:
00403D8D    FF15 A0D04000   CALL DWORD PTR DS:[<&kernel32.CreateFile>; kernel32.CreateFileA  ==打开自己。 00401C23    FF15 3CD04000   CALL DWORD PTR DS:[<&kernel32.SetFilePoi>; kernel32.SetFilePointer  ==去文件尾。 00403926    FF15 6CD04000   CALL DWORD PTR DS:[<&kernel32.ReadFile>] ; kernel32.ReadFile  ==读1000字节。 00401C23    FF15 3CD04000   CALL DWORD PTR DS:[<&kernel32.SetFilePoi>; kernel32.SetFilePointer  ==去文件尾(就是上面的代码啦)。 0040102E    E8 EE030000     CALL dumped_.00401421  ==可以看到401421/4013ca/4013bf都被调用了3次 00401033    53              PUSH EBX                      ==401421就是设置文件指针,4013ca读文件 00401034    8D5424 30       LEA EDX,DWORD PTR SS:[ESP+30] 00401038    6A 06           PUSH 6 0040103A    52              PUSH EDX 0040103B    E8 8A030000     CALL dumped_.004013CA 00401040    8D4424 38       LEA EAX,DWORD PTR SS:[ESP+38] 00401044    50              PUSH EAX 00401045    E8 75030000     CALL dumped_.004013BF 0040104A    6A 02           PUSH 2 0040104C    6A F4           PUSH -0C 0040104E    53              PUSH EBX 0040104F    8BE8            MOV EBP,EAX 00401051    E8 CB030000     CALL dumped_.00401421 00401056    53              PUSH EBX 00401057    8D4C24 44       LEA ECX,DWORD PTR SS:[ESP+44] 0040105B    6A 06           PUSH 6 0040105D    51              PUSH ECX 0040105E    E8 67030000     CALL dumped_.004013CA 00401063    8D5424 4C       LEA EDX,DWORD PTR SS:[ESP+4C] 00401067    52              PUSH EDX 00401068    E8 52030000     CALL dumped_.004013BF 0040106D    6A 02           PUSH 2 0040106F    6A FA           PUSH -6 00401071    53              PUSH EBX 00401072    894424 54       MOV DWORD PTR SS:[ESP+54],EAX 00401076    E8 A6030000     CALL dumped_.00401421 0040107B    83C4 44         ADD ESP,44 0040107E    8D4424 28       LEA EAX,DWORD PTR SS:[ESP+28] 00401082    53              PUSH EBX 00401083    6A 07           PUSH 7 00401085    50              PUSH EAX 00401086    E8 3F030000     CALL dumped_.004013CA 0040108B    8D4C24 34       LEA ECX,DWORD PTR SS:[ESP+34] 0040108F    51              PUSH ECX 00401090    E8 2A030000     CALL dumped_.004013BF 00401095    83C4 10         ADD ESP,10 00401098    8D5424 30       LEA EDX,DWORD PTR SS:[ESP+30] 0040109C    894424 14       MOV DWORD PTR SS:[ESP+14],EAX 004010A0    68 80000000     PUSH 80 004010A5    52              PUSH EDX 004010A6    FF15 08D04000   CALL DWORD PTR DS:[<&kernel32.GetSystemD>; kernel32.GetSystemDirectoryA  ==很明显了 004010AC    BF 5C704000     MOV EDI,dumped_.0040705C                 ; ASCII "\help3721.dll"  ==看到3721就有点&^$#$@#感觉$%^%#$ 00403D8D    FF15 A0D04000   CALL DWORD PTR DS:[<&kernel32.CreateFile>; kernel32.CreateFileA  ==生成%systemdir%\help3721.dll 00401C23    FF15 3CD04000   CALL DWORD PTR DS:[<&kernel32.SetFilePoi>; kernel32.SetFilePointer  ==去文件头 004011BE    FF15 04D04000   CALL DWORD PTR DS:[<&kernel32.GetTempPat>; kernel32.GetTempPathA  ==图片要解在临时目录 004011C4    BF 30704000     MOV EDI,dumped_.00407030                 ; ASCII "80C834BC.jpg" 00403D8D    FF15 A0D04000   CALL DWORD PTR DS:[<&kernel32.CreateFile>; kernel32.CreateFileA  ==生成图片 00401266    FF15 C0D04000   CALL DWORD PTR DS:[<&shell32.ShellExecut>; shell32.ShellExecuteA  ==打开图片 00401276    FF15 60D04000   CALL DWORD PTR DS:[<&kernel32.WinExec>]  ; kernel32.WinExec  ==用rundll32打开help3721.dll                                                                                          ==rundll32 %system%\help3721.dll,Rundll32

  之后程序结束。由于脱了壳的关系,原来附加在文件里面的图片、DLL都被脱
掉了,所以2个文件生成后,都是0byte大小的。知道了代码流程,跟踪一下有壳的
程序,生成DLL后复制出来(有壳的程序生成的图片是一个PLMM哦)。

  DLL也被加壳了。用OD打开,入口:
代码:
10007001 >  60              PUSHAD 10007002    E8 03000000     CALL help3721.1000700A 10007007  - E9 EB045D45     JMP 555D74F7   又是ASPACK,去10007001+3ae的地方找出口: 100073AF    61              POPAD 100073B0    75 08           JNZ SHORT help3721.100073BA 100073B2    B8 01000000     MOV EAX,1 100073B7    C2 0C00         RETN 0C 100073BA    68 7B230010     PUSH help3721.1000237B  ==去OEP 100073BF    C3              RETN

  LordPE,点一下OD的loaddll.exe,在下面的列表选help3721.dll,再dump full。
ImpREC选loaddll进程,Pick DLL,选help3721.dll,OEP填237b。IAT autoseach,
Get Import,Fix dump。呵呵,DLL的脱壳就这么简单。
  再看看DLL的代码:
代码:
1000128B    68 A4400010     PUSH dumped_.100040A4                    ; ASCII "help3721.dll" 10001290    A3 28460010     MOV DWORD PTR DS:[10004628],EAX 10001295    FF15 44A00010   CALL DWORD PTR DS:[<&kernel32.GetModuleH>; kernel32.GetModuleHandleA 1000129B    50              PUSH EAX 1000129C    FF15 1CA00010   CALL DWORD PTR DS:[<&kernel32.DisableThr>; kernel32.DisableThreadLibraryCalls  ==这个API我可是第一次见                                                                        ==看看API文档,原来是禁DLL_THREAD_ATTACH/DETACH通知用的,呵呵,虚惊一场

  初始化代码之后,bpx j看看用了什么API,咦,这次可是大大的有杀伤力,
用了消息钩子,用了ReadProcessMemory,用了msvcrt的文件操作函数,用了注
册表操作函数,用了ws2_32的网络操作函数。。。
  木马该用的好像都用了大概看看API调用情况后就收工啦。用rundll32载
入DLL跟用OD的loaddll载入可不一样,会真正把木马运行起来的。

  程序就不放上来了,免得变成放毒者放个图灌一下水


===================================
平台:xp  工具:OllyDBG1.10修改版
===================================