M**2 Trojan的完全修改—脱壳+特征码修改+PEDIY
--------------------------------------------------------------------------------
http://www.hackbase.com 阅读: 时间:2004-12-6 6:30:55 来源:www.hackbase.com
作者:tankaiha[NE365][FCG] 主页:http://www.vxer.net
声明:本文只为技术研究,鉴于其可能的危害性,讲得很笼统,且作者不提供任何程序和代码!
一、程序运行流程
由M**2生成器生成M**2 Trojan文件,运行后,程序将自身复制到Windir/system32/目录下,文件名为预先设定(假设为aaa.exe),并删除原文件。然后启动新进程,从文件内部数据提取并生成aaa.dll。同时修改注册表项HLM_SOFTWARE_Microsoft_Windows_CurrentVersion_Run。并进入正常循环,进行Hook。
二、修改目标
杀毒软件对aaa.exe和aaa.dll扫描时都会报警。我们的目标,完全躲过杀毒软件的追杀,并正常运行。
三、主文件脱壳+去除自校验
主程序(aaa.exe)用PEiD查壳为UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo [Overlay],手动脱时断点下在popad处,并用RecImport修复引入表。(详细见fly有关的脱壳文章)
00415218 FF96 E85E>call dword ptr ds:[esi+15EE8]
0041521E 61 popad
0041521F - E9 A418FF>jmp aaa.00406AC8
脱壳并修复引入表后,双击程序,程序不能正常运行。用Ollydbg进行跟踪,在如下处有跳转:
00404F4B 53 push ebx
00404F4C E8 9BF5FF>call
00404F51 85C0 test eax,eax
00404F53 75 07 jnz short mir_Unpa.00404F5C
在该指令前,程序已调用SetFilePointer将指针指向文件尾,读出文件尾部的较验数据,并进行判断。解决方法,将未脱壳文件的文件尾部分字节粘贴到已脱壳文件尾,再次运行程序,程序能正常运行。
四、dll文件的脱壳
关闭进程,对system32目录下生成的aaa.dll查壳,显示仍旧是UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo [Overlay],关于dll脱壳的详细过程请参照fly大侠的文章。用Ollydbg手动脱壳时,重定位表位于003C73FE处,大小BD2,用UPXAngela修复,修复后的文件偏移定位11000处,并在脱壳过的文件中将Relocation表的数据进行修改。
输入表修复时,跟踪到程序入口并选择一个API调用跟踪进去,得到地址003C20C8开始,大小178个字节,用RecImport修复。
程序的入口改为EFF4。至此,dll文件的修改完成。
五、对dll文件进行特征码定位并修改
用特征码定位器对dll文件定位特征码,定位和修改的方法略。
六、PEDIY
这是最关键的一步,因为每次运行aaa.exe,程序都从自身的数据里提取并生成aaa.dll,而不会使用我们修改过的dll,因此必须在aaa.exe内部将我们修改的dll嵌进去,并让aaa.exe运行时,生成的是我们修改过的没有特征码的dll文件。
将aaa.exe复制到windir/system32目录下,用Ollydbg载入并运行,设置断点bp CreateFileA。当文件名参数显示为“windir/system32/aaa.dll”时,手动跟踪,找出位置如下:
004063BA 50 push eax
004063BB E8 6CE0FF>call
004063C0 8BD8 mov ebx,eax
004063C2 6A 00 push 0
004063C4 8D45 E0 lea eax,dword ptr ss:[ebp-20]
004063C7 50 push eax
004063C8 8B45 F8 mov eax,dword ptr ss:[ebp-8];这里开始修改
004063CB 50 push eax
004063CC 8B45 FC mov eax,dword ptr ss:[ebp-4]
004063CF 50 push eax
004063D0 53 push ebx
004063D1 E8 4EE1FF>call
004063D6 53 push ebx
004063D7 E8 38E0FF>call
记下WriteFile时,写入的字节数大小,因为这是原dll数据在文件中的大小。关闭Ollydbg,用UltraEdit打开aaa.exe,搜索“MZ”,找到原dll文件的起始位置后填充为0,大小不要超过刚才记录的字节数。
再用UltraEdit打开aaa.dll(已脱壳的),将dll中的全部数据复制到exe文件偏移处00014798h处(自校验数据之前),保存并关闭。用PEInfo(by:破解勇)修改exe文件的最后一节节表的数据,RawSize大小加上1BBD2(这是dll的字节数),VirtualSize修改为新的RawSize按1000h对齐即可,ImageSize会自动修改。这样,我们已经把特征码修改过的dll放进了exe文件中,下面修改文件指令(刚才的WriteFile处,主要是lpBuffer和nBytesToWrite要修改),使它在运行时正常生成aaa.dll文件。修改方法如下:
004063C8 /E9 D42E00>jmp aaa.004092A1
004063CD |90 nop
004063CE |90 nop
004063CF |90 nop
004063D0 |90 nop
004063D1 |E8 4EE1FF>call
004063D6 |53 push ebx
空隙处(004092A1)的代码如下:
004092A1 B8 D2AB01>mov eax,1BBD2
004092A6 50 push eax
004092A7 B8 A06F41>mov eax,aaa.00416F98 ; ASCII "MZP"
004092AC 50 push eax
004092AD 53 push ebx
004092AE ^ E9 24D1FF>jmp aaa.004063D1
其中00416F98指向了文件中的新的dll数据的起始地址。保存修改后,运行程序。正常执行。
七、主程序特征码修改
这样,排除了aaa.exe中dll文件的特征码干扰(因为原来含特征码的dll已经被覆盖,新的内嵌dll已经没有特征码了),剩下对aaa.exe文件本身进行特征码定位和修改。过程略。修改完毕后,OK。已经成了一个完美的Trojan。