【脱文标题】 PESpin V0.70简单脱壳方案
【脱文作者】 weiyi75[Dfcg]
【作者邮箱】 [email]weiyi75@sohu.com[/email]
【作者主页】 Dfcg官方大本营
【使用工具】 Peid,olldbg,Loadpe,ImportREC
【破解平台】 Win2000/XP
【软件名称】 PESpin V0.70
【软件简介】 老虎壳
【软件大小】 19k
【下载地址】
附件:PESpin.rar
【加壳方式】 PESpin 0.70 -> cyberbob
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【脱壳内容】
这个版本同0.3版本的变化主要还是IAT,加密方式略微有些变化,加入了Replace Code for IAT。如果你喜欢追根问底,那么请看loveboom的脱文,如果喜欢快,准,狠,那么往下看。
【详细内容】
首先我希望你阅读了二哥的PESpin V0.3怒而脱之并看懂调试通过,如果0.3你都不会就搞0.7,真服了你。用PESpin加密记事本(全部Anti选项),OD选项不忽略特权指令,其余全部忽略。这个壳是在最后一次特权指令SEH异常后就开始处理IAT,如果问为什么,很简单,到那里后dd 4062e4 (IAT的开始地址)往下看IAT还没有写入。然后到Stolen code
OD载入全部Anti的记事本
0040C087 N> /EB 01 jmp short NOTEPAD.0040C08A //开始就有小花,用花指令插件清除6个
0040C089 |68 60E80000 push 0E860
0040C08E 0000 add byte ptr ds:[eax],al
0040C090 8B1C24 mov ebx,dword ptr ss:[esp]
0040C093 83C3 12 add ebx,12
0040C096 812B E8B10600 sub dword ptr ds:[ebx],6B1E8
0040C09C FE4B FD dec byte ptr ds:[ebx-3]
0040C09F 822C24 83 sub byte ptr ss:[esp],-7D
0040C0A3 D5 46 aad 46
0040C0A5 000B add byte ptr ds:[ebx],cl
0040C0A7 E4 74 in al,74
0040C0A9 9E sahf
0040C0AA 75 01 jnz short NOTEPAD.0040C0AD
..............................................................
0040C087 N> 90 nop
0040C088 90 nop
0040C089 90 nop
0040C08A 60 pushad //这里hr esp,方便找Stolen code,后面的版本无效,再说。
0040C08B E8 00000000 call NOTEPAD.0040C090
0040C090 8B1C24 mov ebx,dword ptr ss:[esp]
0040C093 83C3 12 add ebx,12
0040C096 812B E8B10600 sub dword ptr ds:[ebx],6B1E8
0040C09C FE4B FD dec byte ptr ds:[ebx-3]
0040C09F 822C24 83 sub byte ptr ss:[esp],-7D
0040C0A3 D5 46 aad 46
0040C0A5 000B add byte ptr ds:[ebx],cl
0040C0A7 E4 74 in al,74
0040C0A9 9E sahf
0040C0AA 90 nop
0040C0AB 90 nop
0040C0AC 90 nop
0040C0AD 8173 04 D77AF72F xor dword ptr ds:[ebx+4],2FF77AD7
0040C0B4 8173 19 770043B7 xor dword ptr ds:[ebx+19],B7430077
..............................................................
Shfit+F9 4次(其中硬件中断一次)运行到最后一次特权指令SEH处
00400181 FFFF ??? ; 未知命令
00400183 FFFF ??? ; 未知命令
00400185 FFFF ??? ; 未知命令
00400187 FFFF ??? ; 未知命令
00400189 FFFF ??? ; 未知命令
0040018B FFFF ??? ; 未知命令
0040018D FFFF ??? ; 未知命令
0040018F FFFF ??? ; 未知命令
00400191 FFFF ??? ; 未知命令
00400193 FFFF ??? ; 未知命令
00400195 FFFF ??? ; 未知命令
00400197 FFFF ??? ; 未知命令
.......................................................
命令行
bp LoadLibraryA
Shift+F9中断
77E78023 K> 55 push ebp
77E78024 8BEC mov ebp,esp
77E78026 53 push ebx
77E78027 56 push esi
77E78028 57 push edi
77E78029 68 5480E777 push KERNEL32.77E78054 ; ASCII "twain_32.dll"
77E7802E FF75 08 push dword ptr ss:[ebp+8]
77E78031 FF15 0413E677 call dword ptr ds:[<&NTDLL._strcmpi>; ntdll._stricmp
77E78037 59 pop ecx
77E78038 85C0 test eax,eax
77E7803A 59 pop ecx
77E7803B 0F84 C7C30100 je KERNEL32.77E94408
................................................................
清除断点,Alt+F9返回
0040CE0E 85C0 test eax,eax ; SHELL32.#465
0040CE10 0F84 2F070000 je NOTEPAD.0040D545
0040CE16 E8 01000000 call NOTEPAD.0040CE1C
0040CE1B FF59 50 call far fword ptr ds:[ecx+50]
0040CE1E 51 push ecx
0040CE1F 55 push ebp
0040CE20 810424 0C2B4000 add dword ptr ss:[esp],NOTEPAD.0040>
0040CE27 814424 04 22000000 add dword ptr ss:[esp+4],22
0040CE2F C3 retn
标签1
整个区段搜索写iat指令
mov dword ptr ds:[edx],eax
找到这里
0040C98D 8902 mov dword ptr ds:[edx],eax ; wiat
0040C98F EB 25 jmp short NOTEPAD.0040C9B6
0040C991 EB 04 jmp short NOTEPAD.0040C997
0040C993 FFEB jmp far ebx ; 非法使用寄存器
加密Call 特征指令
jmp dword ptr ss:[esp-4]
依次找到,按Ctrl+L找下一个
0040CCCC FF6424 FC jmp dword ptr ss:[esp-4]
0040CDE0 FF6424 FC jmp dword ptr ss:[esp-4]
0040CE7B FF6424 FC jmp dword ptr ss:[esp-4]
0040CF0C FF6424 FC jmp dword ptr ss:[esp-4]
0040CF42 FF6424 FC jmp dword ptr ss:[esp-4] //这个就是,底下有个非法使用寄存器的花指令命令
0040CF46 FFE8 jmp far eax ; 非法使用寄存器
0040CF42 /FF6424 FC jmp dword ptr ss:[esp-4] ; NOTEPAD.0040CF47
下F2断点,F9中断清除断点
这里就可以补丁了。
修改为
0040CF42 ^\E9 46FAFFFF jmp NOTEPAD.0040C98D
0040CF47 90 nop
跟踪一下路线
0040CF42 ^\E9 46FAFFFF jmp NOTEPAD.0040C98D
0040CF47 90 nop
0040C98D 8902 mov dword ptr ds:[edx],eax ; wiat
0040C98F EB 25 jmp short NOTEPAD.0040C9B6
0040C9B6 59 pop ecx ; NOTEPAD.0040DB1D
0040C9B7 5F pop edi
0040C9B8 C3 retn //这里由于堆栈平衡等关系Over
基本思路已经确定,再来看看如何尽量让程序"平衡"
重启OD,重复上面的过程到标签1
整个区段搜索写iat指令
mov dword ptr ds:[edx],eax
找到这里
0040C98D 8902 mov dword ptr ds:[edx],eax //F2下断
0040C98F EB 25 jmp short NOTEPAD.0040C9B6
0040C991 EB 04 jmp short NOTEPAD.0040C997
0040C993 FFEB jmp far ebx ; 非法使用寄存器
Shift+F9中断后看到
EAX=76AFA5CD COMDLG32库正好是不加密的路线,尾行^-^
0040C98F /EB 25 jmp short NOTEPAD.0040C9B6
0040C9B6 59 pop ecx ; NOTEPAD.0040CE3E
0040C9B7 5F pop edi
0040C9B8 C3 retn //返回到40CF78,这就好办了。
0040C9B6 59 pop ecx ; NOTEPAD.0040CE3E
0040C9B7 5F pop edi
0040C9B8 C3 retn //如果这里修改为
0040C9B8 /E9 BB050000 jmp NOTEPAD.0040CF78 //运行立即崩溃
0040C9BD |90 nop
0040C9B6 59 pop ecx //如果选这里修改
0040C9B6 /E9 BD050000 jmp NOTEPAD.0040CF78 //IAT就全部正确写入。
0040C9BB |90 nop
0040C9B7 5F pop edi
0040C9B8 C3 retn //返回到40CF78,这就好办了。
补丁上面两个地址,F9运行到这里
去花
0040D088 55 push ebp //到这里就用Loadpe纠正镜像大小脱壳。
0040D089 90 nop
0040D08A 90 nop
0040D08B 90 nop
0040D08C 8BEC mov ebp,esp
0040D08E 90 nop
0040D08F 90 nop
0040D090 90 nop
0040D091 83EC 44 sub esp,44
0040D094 90 nop
0040D095 90 nop
0040D096 90 nop
0040D097 56 push esi
0040D098 90 nop
0040D099 90 nop
0040D09A 90 nop
0040D09B FF15 19E34000 call dword ptr ds:[40E319] ; NOTEPAD.004063E4
0040D09B FF15 19E34000 call dword ptr ds:[40E319] //这里实际使访问壳代码,具体往后看。
[40E319] 0085048A 确定区域壳位置
地址=00850000
大小=00002000 (8192.)
注意这里,
004063E4 CC int3 Replace Code for IAT,这就是CC?不是Arm才有吗?但是解码错误,待会再处理。
004063E5 ^ 71 E6 jno short NOTEPAD.004063CD
004063E7 ^ 77 F4 ja short NOTEPAD.004063DD
004063E9 B7 E6 mov bh,0E6
004063EB ^ 77 97 ja short NOTEPAD.00406384
004063ED 9B wait
004063EE E7 77 out 77,eax
004063F0 A3 CCE67700 mov dword ptr ds:[77E6CC],eax
004063F5 0000 add byte ptr ds:[eax],al
004063F7 00D6 add dh,dl
004063F9 AA stos byte ptr es:[edi]
004063FA 5F pop edi
004063FB 77 08 ja short NOTEPAD.00406405
0040D0A1 90 nop
0040D0A2 90 nop
0040D0A3 90 nop
0040D0A4 8BF0 mov esi,eax
0040D0A6 90 nop
0040D0A7 90 nop
0040D0A8 90 nop
0040D0A9 8A00 mov al,byte ptr ds:[eax]
0040D0AB 90 nop
0040D0AC 90 nop
0040D0AD 90 nop
0040D0AE 3C 22 cmp al,22
0040D0B0 90 nop
0040D0B1 90 nop
0040D0B2 90 nop
0040D0B3 - E9 2740FFFF jmp NOTEPAD.004010DF
.................................................................................
运行ImportREC,选择这个进程。把OEP改为D088,RVA 62e0,Size 248
虽然这是已知的,但也可以以理服人。
随便找个
0040D09B FF15 19E34000 call dword ptr ds:[40E319] ; NOTEPAD.004063E4
命令行dd 4063e4,向上找IAT的起点,向下找结束位置,或者找到IAT起点,Size填 1000 的懒人用大面积剪刀法,多余的垃圾全部剪掉。
点获取输入表,指针全部有效,由于CC问题先不能用现在的文件脱壳,得脱一个"干净"的文件出来。
再开一个OD
0040D088 55 push ebp //直接用Esp定律在这里脱壳。
0040D089 EB 01 jmp short NOTEPAD.0040D08C
0040D08B B4 8B mov ah,8B
0040D08D EC in al,dx
0040D08E EB 01 jmp short NOTEPAD.0040D091
0040D090 ^ E2 83 loopd short NOTEPAD.0040D015
0040D092 EC in al,dx
0040D093 44 inc esp
0040D094 EB 01 jmp short NOTEPAD.0040D097
0040D096 F756 EB not dword ptr ds:[esi-15]
0040D099 011CFF add dword ptr ds:[edi+edi*8],ebx
0040D09C 15 19E34000 adc eax,NOTEPAD.0040E319
0040D0A1 EB 01 jmp short NOTEPAD.0040D0A4
0040D0A3 C6 ??? ; 未知命令
0040D0A4 8BF0 mov esi,eax
0040D0A6 EB 01 jmp short NOTEPAD.0040D0A9
现在IR可以修复这个文件了。
然后是
区域脱壳,解决Replace Code for IAT
0040D09B FF15 19E34000 call dword ptr ds:[40E319] ; NOTEPAD.004063E4
0040D09B FF15 19E34000 call dword ptr ds:[40E319] //这里实际是访问壳代码
[40E319] 0085048A 确定区域壳位置
地址=00850000
大小=00002000 (8192.)
单独运行加密程序,区域脱壳
地址 00850000
大小 00002000
PE编辑器编辑脱壳修复文件,选择从磁盘载入区域脱壳文件,然后编辑刚加入的区段,虚拟地址修正为00450000,重建PE选项只保留验证PE即可,然后正常运行。
【脱壳总结】
修复实际是以下几个步骤
1, Esp定律直接到Stolen code脱壳,预先区域脱壳Replace Code for IAT
2, 用PATCH IAT 的方式修复脱壳文件
3, 组合修复文件和区域脱壳
4, 为了大家看明白原理,文章是类似Arm乱序的方式写的,有些乱。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)