【脱文标题】 PESpin V1.0本机修复笔记
【脱文作者】 二哥weiyi75[Dfcg]
【作者邮箱】 [email]weiyi75@sohu.com[/email]
【作者主页】 Dfcg官方大本营
【使用工具】 Peid,olldbg,Loadpe,WinHex,ImportREC
【破解平台】 Win2000/XP
【软件名称】 PESpin V1.0
【软件简介】 老虎壳
【软件大小】 19k
【下载地址】 本地下载
【加壳方式】 PESpin V1.0 -> cyberbob
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【脱壳内容】
首先奉上PEID精确扩展方式扫描特征库
[PESpin v0.70 -> cyberbob]
signature = EB 01 68 60 E8 00 00 00 00 8B 1C 24 83 C3 12 81 2B E8 B1 06 00 FE 4B FD 82 2C 24 83 D5 46 00 0B E4 74 9E
ep_only = true
[PESpin v1.0 -> cyberbob]
signature = EB 01 68 60 E8 00 00 00 00 8B 1C 24 83 C3 12 81 2B E8 B1 06 00 FE 4B FD 82 2C 24 C8 DC 46 00 0B E4 74 9E
ep_only = true
[PESpin v1.1 -> cyberbob]
signature = EB 01 68 60 E8 00 00 00 00 8B 1C 24 83 C3 12 81 2B E8 B1 06 00 FE 4B FD 82 2C 24 7D DE 46 00 0B E4 74 9E
ep_only = true
snaker还是太忙了,0.7-1.1的PESpin一律用PESpin 0.3x - 0.4x -> cyberbob代替,不难看出PESpin的作者特地留下某个标记识别各个版本,只是老虎壳只适合forgot,loveboom等高手分析,对我等汇编编程都不会的菜鸟真是巨难。
这个版本同0.3版本的变化主要加入了代码重定位(变态啊,修复要累死,代码在壳中已经固化为重定位形式,全部还原除了手动就是软件作者你不加重定位这个选项,或者我们Patch了脱壳的Pespin再给软件作者用^-^。),Replace Code for IAT用以壳解壳法是无法跨机的,跨平台更不提,随着壳的升级,不断的变态方式会陆续加入,温馨提示软件作者不要用这个加密软件,fly第一个脱掉它导致共享变成免费软件^-^,作者也提示使用自己承担后果。枯燥的脱文导致辛苦的脱壳工作更辛苦,适当讲些废话中和一下。
【详细内容】
首先我希望你阅读了二哥的
PESpin V0.3怒而脱之
PESpin V0.70简单脱壳方案
并看懂调试通过,如果0.3你都不会就搞1.0,真服了你。
用PESpin加密记事本(全部Anti选项),OD选项不忽略特权指令,其余全部忽略。这个壳是在最后一次特权指令SEH异常后就开始处理IAT,如果问为什么,很简单,到那里后dd 4062e4 (IAT的开始地址)往下看IAT还没有写入。然后到Stolen code
OD载入全部Anti的记事本
0040C087 N> /EB 01 jmp short NOTEPAD2.0040C08A //开始就有小花,用花指令插件清除12个
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 C8 sub byte ptr ss:[esp],-38
0040C0A3 DC46 00 fadd qword ptr ds:[esi]
0040C0A6 0BE4 or esp,esp
0040C0A8 ^ 74 9E je short NOTEPAD2.0040C048
0040C0AA 75 01 jnz short NOTEPAD2.0040C0AD
0040C0AC C781 7304D77A F72F81>mov dword ptr ds:[ecx+7AD70473],7>
0040C0B6 1977 00 sbb dword ptr ds:[edi],esi
0040C0B9 43 inc ebx
0040C0BA B7 F6 mov bh,0F6
0040C0BC C3 retn
..............................................................
0040C087 N> 90 nop
0040C088 90 nop
0040C089 90 nop
0040C08A 60 pushad //这里hr esp,方便找Stolen code,这是最后一个可以用esp定律的pespin,聊以记念,一定要调试并写脱文。
0040C08B E8 00000000 call NOTEPAD2.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 C8 sub byte ptr ss:[esp],-38
0040C0A3 DC46 00 fadd qword ptr ds:[esi]
0040C0A6 0BE4 or esp,esp
0040C0A8 ^ 74 9E je short NOTEPAD2.0040C048
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],B743007>
0040C0BB F6C3 6B test bl,6B
..............................................................
Shfit+F9 4次(其中硬件中断一次)运行到最后一次特权指令SEH处
00400161 FFFF ??? ; 未知命令
00400163 FFFF ??? ; 未知命令
00400165 FFFF ??? ; 未知命令
00400167 FFFF ??? ; 未知命令
00400169 FFFF ??? ; 未知命令
0040016B FFFF ??? ; 未知命令
0040016D FFFF ??? ; 未知命令
0040016F FFFF ??? ; 未知命令
00400171 FFFF ??? ; 未知命令
00400173 FFFF ??? ; 未知命令
00400175 FFFF ??? ; 未知命令
00400177 FFFF ??? ; 未知命令
00400179 FFFF ??? ; 未知命令
0040017B FFFF ??? ; 未知命令
.......................................................
命令行
bp LoadLibraryA
Shift+F9中断
77E668FB K> 55 push ebp
77E668FC 8BEC mov ebp,esp
77E668FE 837D 08 00 cmp dword ptr ss:[ebp+8],0
77E66902 53 push ebx
77E66903 56 push esi
77E66904 57 push edi
77E66905 74 18 je short KERNEL32.77E6691F
77E66907 68 3469E677 push KERNEL32.77E66934 ; ASCII "twain_32.dll"
77E6690C FF75 08 push dword ptr ss:[ebp+8]
77E6690F FF15 0413E677 call dword ptr ds:[<&NTDLL._strcm>; ntdll._stricmp
................................................................
清除断点,Alt+F9返回
0040CF11 85C0 test eax,eax ; SHELL32.#468
0040CF13 0F84 31080000 je NOTEPAD2.0040D74A
0040CF19 E8 01000000 call NOTEPAD2.0040CF1F
0040CF1E FF59 50 call far fword ptr ds:[ecx+50]
0040CF21 51 push ecx
0040CF22 55 push ebp
0040CF23 810424 AE324000 add dword ptr ss:[esp],NOTEPAD2.0>
0040CF2A 814424 04 22000000 add dword ptr ss:[esp+4],22
0040CF32 C3 retn
整个区段搜索写iat指令
mov dword ptr ds:[edx],eax //PESpin的死穴1,你调试通过我前两篇文章一点知道,不再重复。
找到这里
0040CA37 8902 mov dword ptr ds:[edx],eax
0040CA39 EB 4E jmp short NOTEPAD2.0040CA89
0040CA3B EB 04 jmp short NOTEPAD2.0040CA41
0040CA3D FFEB jmp far ebx ; 非法使用寄存器
加密Call 特征指令,死穴2,不懂脑筋即可取完整的IAT
jmp dword ptr ss:[esp-4]
依次找到,按Ctrl+L找下一个
0040CDA3 FF6424 FC jmp dword ptr ss:[esp-4]
0040CEE3 FF6424 FC jmp dword ptr ss:[esp-4]
0040CF7E ^\FF6424 FC jmp dword ptr ss:[esp-4] ; NOTEPAD2.0040CF70
0040D01D FF6424 FC jmp dword ptr ss:[esp-4]
0040D05F FF6424 FC jmp dword ptr ss:[esp-4] //这个就是,识别很容易,作者精心研究的加密IAT代码是不会轻易变化的,一,黔驴技穷,二,技术原因,虽然他已经知道不可靠的,也不会去掉,只是变形而已,分别下断,F8中断后到一个Call的就是
0040D064 E8 03000000 call NOTEPAD2.0040D06C //PESpin主程序好像有两个Call,特征位置差不多。
0040D069 EB 04 jmp short NOTEPAD2.0040D06F
下F2断点,F9中断清除断点
这里就可以补丁了。
修改为
0040D05F ^\E9 D3F9FFFF jmp NOTEPAD2.0040CA37
0040D064 90 nop
0040D065 90 nop
0040D066 90 nop
0040D067 90 nop
0040D068 90 nop
0040D069 90 nop
上次就知道要找到ret的正确位置
0040CA8E C3 retn //跟踪一次知道是40D0a1
0040CA89 59 pop ecx
0040CA8A EB 01 jmp short NOTEPAD2.0040CA8D
0040CA8C 9A 5FC368FF 608B call far 8B60:FF68C35F
于是这里修改为
0040CA89 /E9 13060000 jmp NOTEPAD2.0040D0A1
0040CA8E |90 nop
0040CA8F |90 nop
0040CA90 |90 nop
0040CA91 |90 nop
0040CA92 |90 nop
Shfit+F9 运行Esp定律中断。
0040D27A 55 push ebp //现在还不能脱壳,因为简单PATCH IAT不完善,程序中存在大量解码错误,重新到这里脱个干净壳出来。
0040D27B EB 01 jmp short NOTEPAD2.0040D27E
0040D27D 698B ECEB01DA 83EC44>imul ecx,dword ptr ds:[ebx+DA01EB>
0040D287 01C7 add edi,eax
0040D289 56 push esi
0040D28A EB 01 jmp short NOTEPAD2.0040D28D
0040D28C 0AFF or bh,bh
0040D28E 15 BEE54000 adc eax,NOTEPAD2.0040E5BE
0040D293 EB 01 jmp short NOTEPAD2.0040D296
0040D295 53 push ebx
0040D296 8BF0 mov esi,eax
0040D298 EB 01 jmp short NOTEPAD2.0040D29B
0040D29A 138A 00EB01B3 adc ecx,dword ptr ds:[edx+B301EB0>
0040D2A0 3C 22 cmp al,22
0040D2A2 EB 01 jmp short NOTEPAD2.0040D2A5
.........................................................................
命令行D 4062e4
看到IAT都是好的,其它程序类似手动计算IAT地址和大小。
运行ImportREC,选择这个进程。把OEP改为D27A,RVA 62e0,Size 248,保存一个IAT树文件出来。
0040D27A 55 push ebp
0040D27B 90 nop
0040D27C 90 nop
0040D27D 90 nop
0040D27E 8BEC mov ebp,esp
0040D280 90 nop
0040D281 90 nop
0040D282 90 nop
0040D283 83EC 44 sub esp,44
0040D286 90 nop
0040D287 90 nop
0040D288 90 nop
0040D289 56 push esi
0040D28A 90 nop
0040D28B 90 nop
0040D28C 90 nop
0040D28D FF15 BEE54000 call dword ptr ds:[40E5BE] //定位区域脱壳位置。
ds:[40E5BE]=008A0490
然后是
区域脱壳,解决Replace Code for IAT,PESpin极度变态,占领了无名高地(所有高位区段),无法获取一个有效的高位区段,Xp系统居然申请到低位区段,又要重定位,所以我用2K系统调试。 Call机,手机,商务通 一个都不能少,Win98,win2k,winxpsp1
地址=008A0000
大小=00002000 (8192.)
PE编辑器编辑脱壳修复文件,选择从磁盘载入区域脱壳文件,然后编辑刚加入的区段,虚拟地址修正为004A0000,重建PE选项只保留验证PE即可,现在IR可以修复这个文件了。
如果你不选重定位代码这个选项,此时就可以正常运行了(不能跨机,只是脱壳修炼级而已,慢慢来,不知不觉二哥连续Debug已经3年了,人也胖了。)。
OD载入脱壳文件,F9运行。
不忽略内存异常,注意切换,方便Debug.
F9运行出错
堆栈友好提示
0012FF64 00401158 返回到 Unpack_.00401158 来自 Unpack_.00400178 //反汇编中跟随。
0012FF68 00400000 Unpack_.00400000
0012FF6C 00000000
0012FF70 00132A05
0012FF74 0000000A
0012FF78 00000000
0012FF7C 00000044
0012FF80 00133EE0
0012FF84 00133F00 ASCII "WinSta0\Default"
00401153 . E8 20F0FFFF call Unpack_.00400178 //这里访问40000-400FFE中的PE头代码,这些代码不能dump出来,原因有重定位问题等。
00401158 . 50 push eax
00401159 . 8BF0 mov esi,eax
0040115B . FF15 69E54000 call dword ptr ds:[40E569] ; Unpack_.008A027B
........................................................................................
往下看到
00401168 $- E9 11F0FFFF jmp Unpack_.0040017E
0040117D >-\E9 08F0FFFF jmp Unpack_.0040018A
大量访问PE头代码,手动修复几乎不可能。
现在要做的就是找一段空间代替放在PE头的代码,然后修正两处重定位代码。
分析重定位的最佳地址
00401153 . E8 20F0FFFF call Unpack_.00400178 //这里访问40000-400FFE中的PE头代码
E8 20F0FFFF 我们二进制编辑为 EB20F00000
此时代码变为
00401153 E8 20F00000 call Unpack_.00410178
进去看看。
00410178 8000 80 add byte ptr ds:[eax],80 //好一片废物利用空间,Pespin存放垃圾代码的地方,可恶的病毒校验让你无法加入区段,否则也不用那么幸苦。留意这里,后来大量要回到这里,这是个中间跳板。
0041017B 0080 800000C0 add byte ptr ds:[eax+C0000080],al
00410181 C0C0 00 rol al,0
00410184 C0DC C0 rcr ah,0C0
00410187 00F0 add al,dh
00410189 CA A600 retf 0A6
0041018C 04 04 add al,4
0041018E 04 00 add al,0
00410190 0808 or byte ptr ds:[eax],cl
00410192 0800 or byte ptr ds:[eax],al
00410194 0C 0C or al,0C
00410196 0C 00 or al,0
00410198 1111 adc dword ptr ds:[ecx],edx
0041019A 1100 adc dword ptr ds:[eax],eax
0041019C 16 push ss
0041019D 16 push ss
0041019E 16 push ss
0041019F 001C1C add byte ptr ss:[esp+ebx],bl
.............................................................................
现在就是赶往PE头,狸猫换太子。
载入加密程序,最后一次Seh异常处。
00400161 FFFF ??? ; 未知命令
00400163 FFFF ??? ; 未知命令
00400165 FFFF ??? ; 未知命令
00400167 FFFF ??? ; 未知命令
00400169 FFFF ??? ; 未知命令
0040016B FFFF ??? ; 未知命令
0040016D FFFF ??? ; 未知命令
0040016F FFFF ??? ; 未知命令
00400171 FFFF ??? ; 未知命令
Alt+M
对准PE头下内存写入断点。
内存镜像,项目 11
地址=00400000
大小=00001000 (4096.)
Owner=NOTEPAD2 00400000 (itself)
区段=
包含=PE header
类型=Imag 01001040
访问=RWE
初始访问=RWE
Shift+F9 立即中断
0040D240 F3:A4 rep movs byte ptr es:[edi],byte p> //刀下留代码,EDI=00400178,首先第一句代码写在这里,然后累加地址解码。
狸猫换太子,修改EDI为刚才找到的最佳地址 00410178
0040D242 60 pushad
0040D243 E8 03000000 call NOTEPAD2.0040D24B
Shift+F9来到脱壳入口点
0040D27A 55 push ebp
0040D27B EB 01 jmp short NOTEPAD2.0040D27E
0040D27D 698B ECEB01DA 83EC44>imul ecx,dword ptr ds:[ebx+DA01EB>
0040D287 01C7 add edi,eax
0040D289 56 push esi
0040D28A EB 01 jmp short NOTEPAD2.0040D28D
0040D28C 0AFF or bh,bh
0040D28E 15 BEE54000 adc eax,NOTEPAD2.0040E5BE
0040D293 EB 01 jmp short NOTEPAD2.0040D296
..............................................................................
Ctrl+G去410178看看太子
00410178 - E9 511F0000 jmp 004120CE
0041017D F5 cmc
0041017E 833D B8574000 00 cmp dword ptr ds:[4057B8],0
00410185 E9 E50F0000 jmp NOTEPAD2.0041116F
0041018A 833D BC574000 00 cmp dword ptr ds:[4057BC],0
.................................................................
004103EE - E9 EA2D0000 jmp 004131DD
004103F3 40 inc eax
004103F4 68 A0564000 push NOTEPAD2.004056A0
004103F9 E9 89140000 jmp NOTEPAD2.00411887
004103FE 09E9 or ecx,ebp
动脑分析那些是有效的代码,既然是跳板,很容易确定范围如上,后面都是无意义的代码。
然后看如何重定位,随便找一句。
00410178 - E9 511F0000 jmp 004120CE
这句在pe头中是这样的
00410178 - E9 511FFFFF jmp 004020CE
同理将类似代码后6为替换为xxFFFF即可,不可漏掉一个。
整理一下
00410178 - E9 511F0000 jmp 004120CE
00410185 /E9 E50F0000 jmp NOTEPAD2.0041116F
00410191 /E9 EE0F0000 jmp NOTEPAD2.00411184
0041019B /E9 18100000 jmp NOTEPAD2.004111B8
004101AE /E9 23110000 jmp NOTEPAD2.004112D6
004101B8 /E9 27110000 jmp NOTEPAD2.004112E4
004101CB /E9 5A110000 jmp NOTEPAD2.0041132A
004101D5 /E9 60110000 jmp NOTEPAD2.0041133A
004101DB /E9 68160000 jmp NOTEPAD2.00411848
004101F2 /E9 A6110000 jmp NOTEPAD2.0041139D
00410214 - E9 07360000 jmp 00413820
0041021A /E9 A8160000 jmp NOTEPAD2.004118C7
00410226 /E9 9C160000 jmp NOTEPAD2.004118C7
0041022C /E9 2F180000 jmp NOTEPAD2.00411A60
00410237 /E9 C8110000 jmp NOTEPAD2.00411404
00410242 /E9 D3110000 jmp NOTEPAD2.0041141A
0041025E /E9 00120000 jmp NOTEPAD2.00411463
0041026F /E9 21120000 jmp NOTEPAD2.00411495
0041027A /E9 21120000 jmp NOTEPAD2.004114A0
00410291 - E9 144D0000 jmp 00414FAA
00410297 - E9 71210000 jmp 0041240D
004102A8 /E9 64120000 jmp NOTEPAD2.00411511
004102AE /E9 14160000 jmp NOTEPAD2.004118C7
004102B4 - E9 B1480000 jmp 00414B6A
004102BA /E9 08160000 jmp NOTEPAD2.004118C7
004102CD /E9 7F120000 jmp NOTEPAD2.00411551
004102D9 /E9 A0120000 jmp NOTEPAD2.0041157E
004102DE - E9 2A210000 jmp 0041240D
00410314 /E9 C1120000 jmp NOTEPAD2.004115DA
00410319 - E9 0A220000 jmp 00412528
0041031F /E9 A3150000 jmp NOTEPAD2.004118C7
00410336 /E9 F2120000 jmp NOTEPAD2.0041162D
00410348 /E9 7A150000 jmp NOTEPAD2.004118C7
0041036A /E9 00140000 jmp NOTEPAD2.0041176F
00410387 - E9 2A4C0000 jmp 00414FB6
0041038D - E9 184C0000 jmp 00414FAA
00410392 /36:E9 D00D0000 jmp NOTEPAD2.00411168
0041039E /E9 1D140000 jmp NOTEPAD2.004117C0
004103B4 /E9 17140000 jmp NOTEPAD2.004117D0
004103BF /E9 11140000 jmp NOTEPAD2.004117D5
004103C5 - E9 5E210000 jmp 00412528
004103CB /E9 F7140000 jmp NOTEPAD2.004118C7
004103D1 - E9 37200000 jmp 0041240D
004103E2 /E9 76140000 jmp NOTEPAD2.0041185D
004103EE - E9 EA2D0000 jmp 004131DD
004103F9 /E9 89140000 jmp NOTEPAD2.00411887
打开Winhex,编辑内存,选定Unpackme进程。
批量修改内存得选定范围,否则错误不断,内存可不是能乱改的。
位置,转到偏移量 410178,对E9选定开始
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00410178 - E9 511F0000 jmp 004120CE
0041017D F5 cmc
0041017E 833D B8574000 00 cmp dword ptr ds:[4057B8],0
00410185 E9 E50F0000 jmp NOTEPAD2.0041116F
0041018A 833D BC574000 00 cmp dword ptr ds:[4057BC],0
.................................................................
004103EE - E9 EA2D0000 jmp 004131DD
004103F3 40 inc eax
004103F4 68 A0564000 push NOTEPAD2.004056A0
004103F9 E9 89140000 jmp NOTEPAD2.00411887
004103FE 09E9 or ecx,ebp
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
然后转到004103FE,选块结尾。然后光标指到410178
Ctrl+Alt+H 打开替换对话框
设置替换全部事件,搜索向下,仅在选块中替换打勾。
然后就是替换了,循环填入
1F0000
lFFFFF 确定,替换一次。
0F0000
0FFFFF 2次
100000
10FFFF 3次
...................................................
2D0000
2DFFFF
呼,总算壳中代替PE头重定位工作完成,可以现在脱壳了,用刚才的树文件修复IAT,组合一下区域脱壳可以得到脱壳文件1,我是OD插件在去花后直接脱壳,不选择重建输入表。
关闭先前的调试器和Winhex,OD载入脱壳文件1,F9运行出错。
00400178 FFFF ??? //代码段还是指向PE头,还需要重定位。
0040017A FFFF ??? ; 未知命令
0040017C 40 inc eax
0040017D 0000 add byte ptr ds:[eax],al
0040017F C02E 61 shr byte ptr ds:[esi],61
00400182 73 70 jnb short Unpack_.004001F4
堆栈友好提示
0012FF64 00401158 Unpack_.00401158 //右键跟踪错误地址。
0012FF68 00400000 Unpack_.00400000
0012FF6C 00000000
0012FF70 00132A05
0012FF74 0000000A
0012FF78 00000000
0012FF7C 00000044
0012FF80 001348D8
0012FF84 001348F8 ASCII "WinSta0\Default"
00401153 E8 20F0FFFF call Unpack_.00400178 //这里。
00401158 . 50 push eax
00401159 . 8BF0 mov esi,eax
整理一下代码段要重定位的代码
00401153 E8 20F0FFFF call Unpack_.00400178
00401168 $- E9 11F0FFFF jmp Unpack_.0040017E
004011B3 .- E9 DEEFFFFF jmp Unpack_.00400196
004012CA .- E9 D2EEFFFF jmp Unpack_.004001A1
004012CF >- E9 D3EEFFFF jmp Unpack_.004001A7
004012DF .- E9 CFEEFFFF jmp Unpack_.004001B3
004012E5 . E8 D4EEFFFF call Unpack_.004001BE
00401323 .- E9 9CEEFFFF jmp Unpack_.004001C4
00401335 .- E9 96EEFFFF jmp Unpack_.004001D0
00401341 .- E9 95EEFFFF jmp Unpack_.004001DB
0040137F .- E9 63EEFFFF jmp Unpack_.004001E7
00401398 .- E9 50EEFFFF jmp Unpack_.004001ED
004013AB .- E9 48EEFFFF jmp Unpack_.004001F8
004013BC .- E9 42EEFFFF jmp Unpack_.00400203
004013CE .- E9 36EEFFFF jmp Unpack_.00400209
004013D8 .- E9 3DEEFFFF jmp Unpack_.0040021A
004013E4 .- E9 3DEEFFFF jmp Unpack_.00400226
004013FF .- E9 2EEEFFFF jmp Unpack_.00400232
00401415 .- E9 23EEFFFF jmp Unpack_.0040023D
00401440 . E8 03EEFFFF call Unpack_.00400248
00401454 .- E9 F5EDFFFF jmp Unpack_.0040024E
0040145E .- E9 F6EDFFFF jmp Unpack_.00400259
00401490 .- E9 D5EDFFFF jmp Unpack_.0040026A
0040149B .- E9 D5EDFFFF jmp Unpack_.00400275
004014A0 .- E9 DBEDFFFF jmp Unpack_.00400280
004014CB .- E9 BBEDFFFF jmp Unpack_.0040028B
004014F8 .- E9 A0EDFFFF jmp Unpack_.0040029D
0040150C .- E9 92EDFFFF jmp Unpack_.004002A3
00401523 .- E9 86EDFFFF jmp Unpack_.004002AE
0040152A . E8 85EDFFFF call Unpack_.004002B4
0040152F .- E9 86EDFFFF jmp Unpack_.004002BA
00401534 . E8 87EDFFFF call Unpack_.004002C0
0040154A .- E9 77EDFFFF jmp Unpack_.004002C6
00401577 >-\E9 56EDFFFF jmp Unpack_.004002D2
0040159A . E8 3FEDFFFF call Unpack_.004002DE
0040159F .- E9 40EDFFFF jmp Unpack_.004002E4
004015AD .- E9 38EDFFFF jmp Unpack_.004002EA
004015B9 .- E9 37EDFFFF jmp Unpack_.004002F5
004015BE .- E9 38EDFFFF jmp Unpack_.004002FB
004015CA . E8 38EDFFFF call Unpack_.00400307
004015D3 .- E9 35EDFFFF jmp Unpack_.0040030D
004015E3 . E8 31EDFFFF call Unpack_.00400319
004015E8 .- E9 32EDFFFF jmp Unpack_.0040031F
00401603 . E8 1DEDFFFF call Unpack_.00400325
00401608 .- E9 1EEDFFFF jmp Unpack_.0040032B
00401628 .- E9 04EDFFFF jmp Unpack_.00400331
00401688 . E8 AFECFFFF call Unpack_.0040033C
004016E1 . E8 5CECFFFF call Unpack_.00400342
004016ED .- E9 56ECFFFF jmp Unpack_.00400348
004016FB .- E9 4EECFFFF jmp Unpack_.0040034E
0040173D .- E9 17ECFFFF jmp Unpack_.00400359
00401752 .- E9 08ECFFFF jmp Unpack_.0040035F
0040176A .- E9 F6EBFFFF jmp Unpack_.00400365
0040176F . E8 FCEBFFFF call Unpack_.00400370
00401779 .- E9 F8EBFFFF jmp Unpack_.00400376
00401780 >-/E9 F7EBFFFF jmp Unpack_.0040037C
00401785 . |E8 FDEBFFFF call Unpack_.00400387
0040178E . E8 FAEBFFFF call Unpack_.0040038D
004017A8 > \E8 E6EBFFFF call Unpack_.00400393
004017BB >-\E9 D9EBFFFF jmp Unpack_.00400399
004017C0 .- E9 DFEBFFFF jmp Unpack_.004003A4
004017CB .- E9 DFEBFFFF jmp Unpack_.004003AF
004017D0 .- E9 E5EBFFFF jmp Unpack_.004003BA
004017DB . E8 E5EBFFFF call Unpack_.004003C5
004017E0 .- E9 E6EBFFFF jmp Unpack_.004003CB
00401831 . E8 9BEBFFFF call Unpack_.004003D1
00401836 .- E9 9CEBFFFF jmp Unpack_.004003D7
00401858 .- E9 80EBFFFF jmp Unpack_.004003DD
0040185D . E8 86EBFFFF call Unpack_.004003E8
00401872 . E8 77EBFFFF call Unpack_.004003EE
00401882 .- E9 6DEBFFFF jmp Unpack_.004003F4
00401899 > \E8 61EBFFFF call Unpack_.004003FF
004018B8 . E8 48EBFFFF call Unpack_.00400405
004018F1 .- E9 15EBFFFF jmp Unpack_.0040040B
004018F6 14 db 14
同样Winhex打开脱壳文件,转到偏移量1153,选为起点,然后到18F6 终点,然后光标到1153
Ctrl+Alt+H
循环填入
F0FFFF
F00000
EFFFFF
EF0000 就是壳代码的逆过程。
中间可能有些Bug,昨夜修复正确,第二天记事本有几个功能没修复,灵感没有了,脱文是用回忆写的,调试了一天,算了,只是练兵而已,完美脱壳得看loveboom的,只是汇编差的看那些什么分配内存,脚本如同天书。
最后完成两大重定位,程序即修复为不能跨机的。
【脱壳总结】
修复实际是以下几个步骤
1, Esp定律直接到Stolen code脱壳,预先区域脱壳Replace Code for IAT,预留重地位代码位置。
2, 用PATCH IAT 的方式修复脱壳文件
3, 组合修复文件和区域脱壳
4, 代码段重定位
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[课程]FART 脱壳王!加量不加价!FART作者讲授!