来个PolyBox的壳样(脱文已发)
先放个壳样上来,脱文已经发在了1楼,有兴趣的看看,(已经更改一个小小的错误)
学习后,请继续举一反三学会应用!
我再放一个类似的壳上来,大家再去练习一下吧!
注:和1楼放的练习壳不一样:
我在这放的练习都是双进程的(其实也不该叫双进程,算是个子母进程吧)
1楼放的样本是试验PETools的
占楼,帖脱文
可以用2种方法来进行处理,其中方法一是参考国外的教程,我只是加以整理和加了自己的理解!版权问题还是说明的好!呵呵
方法一:
1、OD载入后
00400154 >8725 60EB4000 xchg dword ptr ds:,esp //停在这里
0040015A61popad
0040015B94xchg eax,esp
0040015C55push ebp
0040015DA4movs byte ptr es:,byte ptr ds:
0040015EB6 80 mov dh,80
00400160FF13call dword ptr ds:
00400162^ 73 F9 jnb short PolyBox_.0040015D
0040016433C9xor ecx,ecx
00400166FF13call dword ptr ds:
0040016873 16 jnb short PolyBox_.00400180
0040016A33C0xor eax,eax
0040016CFF13call dword ptr ds:
0040016E73 1F jnb short PolyBox_.0040018F
看入口,很象FSG的壳,于是,我们首先尝试一下用FSG的方法来进行脱壳!
由于脱FSG不是重点,因此,我用最简单的,最快速的方法加以脱壳。
OD载入后,F82次,看堆栈窗口:
0040EB64 004001E8PolyBox_.004001E8
0040EB68 004001DCPolyBox_.004001DC
0040EB6C 004001DEPolyBox_.004001DE
0040EB70 00402F18PolyBox_.00402F18 //在这里
0040EB74 > 7C883F9Ckernel32.LoadLibraryA
0040EB78 > 7C883FECkernel32.GetProcAddress
0040EB7C 00000000
然后在第四行,右键,在反汇编窗口跟随
00402F180000add byte ptr ds:,al //来到这里
00402F1A0000add byte ptr ds:,al
00402F1C0000add byte ptr ds:,al
00402F1E0000add byte ptr ds:,al
00402F200000add byte ptr ds:,al
00402F220000add byte ptr ds:,al
00402F240000add byte ptr ds:,al
00402F260000add byte ptr ds:,al
00402F280000add byte ptr ds:,al
然后,下硬件执行断点,F9运行
00402F1855push ebp ; ntdll.7C920000
00402F198BECmov ebp,esp
00402F1B83C4 F0 add esp,-10
00402F1EB8 C02E4000 mov eax,PolyBox_.00402EC0
00402F23E8 D0EDFFFF call PolyBox_.00401CF8
00402F28E8 83FDFFFF call PolyBox_.00402CB0
00402F2DE8 56E6FFFF call PolyBox_.00401588
00402F328BC0mov eax,eax
00402F340000add byte ptr ds:,al
到这后,很多人会以为是OEP了
OK,我们来脱壳。脱壳修复后发现,程序无法运行。PEiD也误报为Borland Delphi 5.0 KOL
到此,很多人可能会以为是IAT的问题,于是,手动查找IAT后,发现程序依然没法运行,很明显,这是个伪装成FSG的壳,但其实是PolyBox的壳。
下面,正式进入脱壳过程。
首先来寻找OEP
重新用OD载入加壳程序,忽略所有的异常,然后F9运行,发现,程序正常运行起来,但是,OD的左上角提示:程序终止!
这个时候,我们就可以脱壳了,使用工具是PETools。
不过,我们发现有2个进程(汗,原来这个壳会产生一个临时进程,下面还得处理这个,麻烦!)
不过大家很容易发现,上面那个是原来的进程,下面那个是新产生的进程。于是,我们对下面那个进程进程dump!用PETools完整转存出来吧!
大家别兴奋的太早,这时候,dump出来的程序依然无法运行的!没关系,我们要的只是OEP,程序无法运行也无所谓!呵呵!
用OD载入dump出来的程序。
004271B0 > $55push ebp//真正的OEP!
004271B1 .8BECmov ebp,esp
004271B3 .6A FF push -1
004271B5 .68 600E4500 push Dumped.00450E60
004271BA .68 C8924200 push Dumped.004292C8 ;SE 句柄安装
004271BF .64:A1 0000000>mov eax,dword ptr fs:
004271C5 .50push eax
004271C6 .64:8925 00000>mov dword ptr fs:,esp
004271CD .83C4 A8 add esp,-58
004271D0 .53push ebx
004271D1 .56push esi
004271D2 .57push edi
004271D3 .8965 E8 mov dword ptr ss:,esp
004271D6 .FF15 DC0A4600 call dword ptr ds:[<&KERNEL32.GetVersion>;kernel32.GetVersion
哈,真正的OEP找到了!也很明显可以判断出来,是个VC++程序。
其实,经常在tuts4you网站进行脱壳练习的朋友应该早知道,他们脱壳练习的原程序,一般都是C++的。
好,记下真正的OEP地址吧:004271B0
并记下OEP的头2字节为:55 8B
OK, dump出来的程序已经没有什么利用价值了,删除吧!
重新载入加壳的程序
下断点:bp ResumeThread,F9
7C83284F >8BFFmov edi,edi //停在这里。然后单步往下走
7C83285155push ebp
7C8328528BECmov ebp,esp
7C8328548D45 08 lea eax,dword ptr ss:
7C83285750push eax
7C832858FF75 08 push dword ptr ss:
7C83285BFF15 3814807C call dword ptr ds:[<&ntdll.NtResumeThrea>; ntdll.ZwResumeThread
//走到这里的时候,就得处理了!
7C83286185C0test eax,eax
7C8328630F8C 311F0100 jl kernel32.7C84479A
7C8328698B45 08 mov eax,dword ptr ss:
7C83286C5Dpop ebp
7C83286DC2 0400 retn 4
7C832870F645 21 04test byte ptr ss:,4
走到上面标记的地方,打开我们的新工具pupe(这工具其实我也用的不多,只在处理以前处理ARM壳的时候用到过,想不到今天又用到了他,荣幸哈~)
打开pupe后,选择上面的那个进程,然后右键,选择Parchear
把NO de bytes 处选择为2,Introducir la direcction处填入OEP的地址:004271B0
接着点Buscar
接着在Cambiar por:处填所要替换的OEP字节:EB FE
然后点Parchear
处理完后,如图所示
接着就关闭pupe吧!
接着F9运行,OD显示终止进程.
然后,在OD里,选择附加进程,把新的那个进程附加进去(注意,颜色突出的那个是现在正在进行的进程,我们选的不是这个哦!)
注意:附加后会提示一个错误,那是正常的,点确定就行
附加后,ALT+F9返回
修改头2个字节为55 8B
OK,下面再来用PETools脱壳吧。
瞧,现在只有1个进程了吧。完整转存出来就OK了。
程序能正常运行了吧!哈
方法二:
OD载入后,忽略所有异常,
下断点:bp WriteProcessMemory,F9运行
中断后,ALT+F9返回
0040201B .85C0test eax,eax//返回到这里
0040201D .75 0A jnz short PolyBox_.00402029
0040201F .E8 3CF4FFFF call PolyBox_.00401460
00402024 .E9 FF000000 jmp PolyBox_.00402128
00402029 >8B45 E4 mov eax,dword ptr ss:
0040202C .E8 7FFEFFFF call PolyBox_.00401EB0
00402031 .8BF0mov esi,eax
00402033 .8B45 E4 mov eax,dword ptr ss:
00402036 .0FB740 06 movzx eax,word ptr ds:
0040203A .48dec eax
0040203B .85C0test eax,eax
0040203D .72 59 jb short PolyBox_.00402098
0040203F .40inc eax
00402040 .8945 D8 mov dword ptr ss:,eax
下面,我们就一直F8走吧:
004020AC .8B45 C8 mov eax,dword ptr ss:; |
004020AF .50push eax ; |hProcess
004020B0 .E8 ABFDFFFF call PolyBox_.00401E60 ; \WriteProcessMemory
004020B5 .85C0test eax,eax
004020B7 .74 28 je short PolyBox_.004020E1
004020B9 .8B45 E4 mov eax,dword ptr ss:
004020BC .8B40 28 mov eax,dword ptr ds:
004020BF .0345 EC add eax,dword ptr ss:
004020C2 .8985 68FFFFFF mov dword ptr ss:,eax;//注意一下这里,这里的eax的值就是OEP的值,记录下来吧!
004020C8 .8D85 B8FEFFFF lea eax,dword ptr ss:
004020CE .50push eax ; /pContext
004020CF .8B45 CC mov eax,dword ptr ss:; |
004020D2 .50push eax ; |hThread
004020D3 .E8 58FDFFFF call PolyBox_.00401E30 ; \SetThreadContext
004020D8 .83F8 01 cmp eax,1
004020DB .1BC0sbb eax,eax
004020DD .40inc eax
004020DE .8845 F2 mov byte ptr ss:,al
004020E1 >33C0xor eax,eax
004020E3 .5Apop edx
004020E4 .59pop ecx
004020E5 .59pop ecx
004020E6 .64:8910 mov dword ptr fs:,edx
004020E9 .68 28214000 push PolyBox_.00402128
004020EE >807D F2 00cmp byte ptr ss:,0
004020F2 .75 0D jnz short PolyBox_.00402101
004020F4 .6A 00 push 0 ; /ExitCode = 0
004020F6 .8B45 C8 mov eax,dword ptr ss:; |
004020F9 .50push eax ; |hProcess
004020FA .E8 39FDFFFF call PolyBox_.00401E38 ; \TerminateProcess
004020FF .EB 0D jmp short PolyBox_.0040210E
00402101 >8B45 CC mov eax,dword ptr ss:
00402104 .50push eax ; /hThread
00402105 .E8 16FDFFFF call PolyBox_.00401E20 ; \ResumeThread//注意下这个函数,直接在这F4吧!
0040210A .C645 F3 00mov byte ptr ss:,0
0040210E >8B45 C8 mov eax,dword ptr ss:
00402111 .50push eax ; /hObject
00402112 .E8 A1FCFFFF call PolyBox_.00401DB8 ; \CloseHandle
00402117 .8B45 CC mov eax,dword ptr ss:
OK,下面的处理就和方法一一样啦!
总结一下:PETools真是一个好工具哈~有些壳用它来处理就非常方便了!
我附件里在放几个要PETools处理的壳样本,大家练习下吧!
Have Fun!
作者徐超,转载著名出处!谢谢!
附件中包括完整的脱文,脱壳后的文件,所需要的工具,以及让大家练习的壳的样本!
由于家有壳,所以有的杀毒软件会报毒,请大家放心下载吧! 牛人来讲课了,赶紧搬个凳子来学习。 貌似我没听过这个壳. 女王写的壳袄?外面怎么那么像FSG?俺不会脱,等待超人大牛的教程~ FSG我还是会手脱的,楼主这个就没脱过。 FSG 2.0 -> bart/xt我的显这个 FSG的变形吗?
00402F1855PUSH EBP ; ntdll.7C920000 // oep?
Borland Delphi 5.0 KOL 查下出来这个 等待大牛的教程
学习下了
不搞了,还是等楼主的教程吧。 听课,学习学习