吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 19392|回复: 15
收起左侧

[原创] 吾爱破解脱壳练习-----PESpin 1.32

 关闭 [复制链接]
小生我怕怕 发表于 2008-10-9 00:14
一转眼我们的脱壳练习已经第10期啦,在这其中我相信许多的朋友也学习到了东西
必能脱掉此壳
本期考核主题为:PESpin 1.32
1.脱壳后的文件大家以千脑形式上传,目的是为了便于隐藏文件和节约论坛空间
2.脱壳后的文件,请大家以脱文附带脱壳后程序打包压缩传于千脑网盘
3.对于回帖过程中千万不要出现灌水,否则BAN了ID
4.对于有优秀脱文或优秀脱壳方法的朋友,给于适当威望奖励
5.鉴于此练习是针对论坛的所有人,请大家踊跃参加,如果不是脱了壳教作业的,请不要顶帖子,方便管理查阅,及时给出评分
6.以下为需要设置威望的格式
7.脱壳一以周期计算,(周期=等于二天)
8.脱壳周期一结束,就开始公布答案让大家能有更充分的学习环境,让不懂脱的朋友去寻找你失误的地方争取早日赶上论坛的积极份子
9.我们要的是脱文,并不是脱壳机去脱的,如果用脱机脱了别拿来,请一定附带上脱文
10.我们讲对每次脱壳练习选择一个最好的脱壳分析过程,方便大家学习,每次脱壳练习结束后会说出楼数,对于被选种的朋友,我们会酌情给予CB或者威望进行奖励

11.本期看点:让大家多多了解OEP的入口特征,补回被Stolen Code的OEP代码,我们要看的是补代码的关键,请大家尽量以详细脱文送上,详细者加分加威望




练习一:(结果已经公布)
http://www.52pojie.cn/thread-10496-1-1.html
最佳分析:第10楼unpack

练习二:(结果已经公布)
http://www.52pojie.cn/thread-10607-1-1.html
最佳分析:第9楼lqiulu

练习三:(结果已经公布)
http://www.52pojie.cn/thread-10688-1-1.html
最佳分析:第11楼傻人有傻福

练习四:(结果已经公布)
http://www.52pojie.cn/thread-10850-1-1.html
最佳分析:第11楼维护世界和平

练习五:(结果已经公布)
http://www.52pojie.cn/thread-10990-1-1.html
最佳分析:第3楼维护世界和平

练习六:(结果已经公布)
http://www.52pojie.cn/thread-11112-1-1.html
最佳分析:第12楼ximo

练习七:(结果已经公布)
http://www.52pojie.cn/thread-11244-1-1.html
最佳分析:第14楼傻人有傻福

练习八:(结果已经公布)
http://www.52pojie.cn/thread-11306-1-1.html
最佳分析: 第15楼unpack

练习九:(结果已经公布)
http://www.52pojie.cn/thread-11446-1-1.html
最佳分析: 第1楼小生我怕怕

UnPackMe第10期.rar

29 KB, 下载次数: 788, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

qq513701092 发表于 2008-10-11 18:11
由于本人电脑的问题 不能在OD中复制和查找.所以一直写不了脱文...
换了好多的OD都不行..这个脱文跑到别人家里写的T-T(我好可怜...555[s:38][s:38][s:38])
所以呢..这个是我的第1篇脱文..写的不杂滴.大牛们别笑我- -
明天我就去换个系统!!!!!
(大家多加加脱壳群.可以学到很多的东西哦..)




OD载入。停在这里!
004070D4 > /EB 01 jmp short UnPackMe.004070D7
004070D6 |68 60E80000 push 0E860
004070DB0000add byte ptr ds:[eax],al
004070DD8B1C24mov ebx,dword ptr ss:[esp]
004070E083C3 12 add ebx,12
004070E3812B E8B10600 sub dword ptr ds:[ebx],6B1E8
004070E9FE4B FD dec byte ptr ds:[ebx-3]
004070EC822C24 17 sub byte ptr ss:[esp],17

--------------------------------------------------------
单步2次.使用ESP定律法后停在这(记住删除断点)
00408CB5F7D2not edx; ntdll.KiFastSystemCallRet
00408CB739C2cmp edx,eax
00408CB9F7C0 74E7F921 test eax,21F9E774
00408CBF0FACC2 48 shrd edx,eax,48
00408CC30FBDC8bsr ecx,eax
00408CC6C7C2 2431C7CD mov edx,CDC73124
00408CCC85C0test eax,eax
00408CCE0FBAEA 31 bts edx,31
00408CD2F7D2not edx
00408CD4F7C1 25C4A65C test ecx,5CA6C425

--------------------------------------------------------
经过漫长的单步后来到
00408D6F15 90214000 adc eax,UnPackMe.00402190
00408D74EB 01 jmp short UnPackMe.00408D77
00408D76B2 59 mov dl,59
00408D78EB 01 jmp short UnPackMe.00408D7B
00408D7AC8 830D2C enter 0D83,2C
00408D7E3140 00 xor dword ptr ds:[eax],eax
00408D81FFEBjmp far ebx; 非法使用寄存器
00408D83013C83add dword ptr ds:[ebx+eax*4],edi
00408D860D 30314000 or eax,403130
00408D8BFFEBjmp far ebx; 非法使用寄存器
00408D8D0151 FF add dword ptr ds:[ecx-1],edx
00408D9015 8C214000 adc eax,UnPackMe.0040218C
00408D95EB 01 jmp short UnPackMe.00408D98
00408D97A5movs dword ptr es:[edi],dword ptr ds:[es>
00408D98- E9 AB89FFFF jmp UnPackMe.00401748; 跳到OEP
00408D9D0F2B???; 未知命令
--------------------------------------------------------
到这后往上拉会发现程序被偷了好多的代码(右键→分析→从模块中删除分析)
004017300000add byte ptr ds:[eax],al
004017320000add byte ptr ds:[eax],al
004017340000add byte ptr ds:[eax],al
004017360000add byte ptr ds:[eax],al
004017380000add byte ptr ds:[eax],al
0040173A0000add byte ptr ds:[eax],al
0040173C0000add byte ptr ds:[eax],al
0040173E0000add byte ptr ds:[eax],al
004017400000add byte ptr ds:[eax],al
004017420000add byte ptr ds:[eax],al
004017440000add byte ptr ds:[eax],al
004017460000add byte ptr ds:[eax],al
004017488B0D 20314000 mov ecx,dword ptr ds:[403120];
---------------------------------------------------------
重新载入程序.然后和上面一样单步到这来
00408D0955push ebp
00408D0AEB 01 jmp short UnPackMe.00408D0D
00408D0C3D 8BECEB01 cmp eax,1EBEC8B
00408D112Fdas
00408D126A FF push -1
00408D14EB 01 jmp short UnPackMe.00408D17
00408D160C 68 or al,68
开始收集STOLEN CODE

然后
00408D1768 8890BF01 push 1BF9088
00408D1C812C24 886B7F01 sub dword ptr ss:[esp],17F6B88
00408D2368 ED8824EE push EE2488ED
00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99
00408D2F64:A1 00000000mov eax,dword ptr fs:[0]

单步到00408D23 同时观察堆栈窗口
0012FFB800402500UnPackMe.00402500 注意这里
0012FFBCFFFFFFFF
0012FFC00012FFF0
00408D17这处被偷的代码应为push 00402500
00408D23这处的实际代码为push00401886

继续找被偷代码
00408D3850push eax

00408D3C64:8925 00000000mov dword ptr fs:[0],esp

00408D4683EC 68 sub esp,68

00408D4C53push ebx

00408D5056push esi ; kernel32.7C809AC6

00408D5457push edi ; kernel32.7C800065

00408D588965 E8 mov dword ptr ss:[ebp-18],esp

00408D5E33DBxor ebx,ebx

00408D63895D FC mov dword ptr ss:[ebp-4],ebx

00408D696A 02 push 2

00408D6EFF15 90214000 call dword ptr ds:[402190] ; msvcrt.__set_app_type

00408D7759pop ecx

00408D7B830D 2C314000 FFor dword ptr ds:[40312C],FFFFFFFF

00408D85830D 30314000 FFor dword ptr ds:[403130],FFFFFFFF


00408D8FFF15 8C214000 call dword ptr ds:[40218C] ; msvcrt.__p__fmode

好了,到这代码就全找到了.^-^
push ebp
mov ebp,esp
push -1
push 402500
push 401886
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
sub esp,68
push ebx
push esi
push edi
mov dword ptr ss:[ebp-18],esp
xor ebx,ebx
mov dword ptr ss:[ebp-4],ebx
push 2
call dword ptr ds:[402190]
pop ecx
or dword ptr ds:[40312C],FFFFFFFF
or dword ptr ds:[403130],FFFFFFFF
call dword ptr ds:[40218C]
--------------------------------------------------------
来到我们的伪OEP.往上拉.将代码复制进去.并重建PE.LORDPE脱壳.IR修复.就OK了
小生我菜菜 发表于 2008-10-10 22:14
首先用查壳为PESpin 0.3x - 1.xx -> cyberbob,不知道是什么壳

用OD载入程序停止这里:
004070D4 > /EB 01 JMP SHORT UnPackMe.004070D7

F8单步来到这里
004070D760PUSHAD
004070D8E8 00000000 CALL UnPackMe.004070DD
004070DD8B1C24MOV EBX,DWORD PTR SS:[ESP] ; kernel32.7C816FD7
004070E083C3 12 ADD EBX,12
004070E3812B E8B10600 SUB DWORD PTR DS:[EBX],6B1E8

看到PUSHAD后,F8单步后运用ESP定律后程序报错,shift+F9运行程序后来到这里

00408CB5F7D2NOT EDX; ntdll.KiFastSystemCallRet
00408CB739C2CMP EDX,EAX
00408CB9F7C0 74E7F921 TEST EAX,21F9E774
00408CBF0FACC2 48 SHRD EDX,EAX,48; 位移常数超出 1..31 的范围
00408CC30FBDC8BSR ECX,EAX
00408CC6C7C2 2431C7CD MOV EDX,CDC73124
00408CCC85C0TEST EAX,EAX
00408CCE0FBAEA 31 BTS EDX,31
00408CD2F7D2NOT EDX; ntdll.KiFastSystemCallRet
00408CD4F7C1 25C4A65C TEST ECX,5CA6C425
00408CDA3BD0CMP EDX,EAX
00408CDC0FABC2BTS EDX,EAX
00408CDFEB 01 JMP SHORT UnPackMe.00408CE2


接着我们继续单步往下走。
00408D7E3140 00 XOR DWORD PTR DS:[EAX],EAX ; msvcrt._fmode
00408D81FFEBJMP FAR EBX; 非法使用寄存器
00408D83013C83ADD DWORD PTR DS:[EBX+EAX*4],EDI
00408D860D 30314000 OR EAX,403130
00408D8BFFEBJMP FAR EBX; 非法使用寄存器
00408D8D0151 FF ADD DWORD PTR DS:[ECX-1],EDX
00408D9015 8C214000 ADC EAX,UnPackMe.0040218C
00408D95EB 01 JMP SHORT UnPackMe.00408D98
00408D97A5MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
00408D98- E9 AB89FFFF JMP UnPackMe.00401748 --------------来到这里我们看到一个很大的跳转,这个就是跳向我们的OEP
好像大牛们都是这么说的。。

单步来到这里:
004017000000ADD BYTE PTR DS:[EAX],AL
004017020000ADD BYTE PTR DS:[EAX],AL
004017040000ADD BYTE PTR DS:[EAX],AL
004017060000ADD BYTE PTR DS:[EAX],AL
004017080000ADD BYTE PTR DS:[EAX],AL
0040170A0000ADD BYTE PTR DS:[EAX],AL
0040170C0000ADD BYTE PTR DS:[EAX],AL
0040170E0000ADD BYTE PTR DS:[EAX],AL
004017100000ADD BYTE PTR DS:[EAX],AL
004017120000ADD BYTE PTR DS:[EAX],AL
004017140000ADD BYTE PTR DS:[EAX],AL
004017160000ADD BYTE PTR DS:[EAX],AL
004017180000ADD BYTE PTR DS:[EAX],AL
0040171A0000ADD BYTE PTR DS:[EAX],AL
0040171C0000ADD BYTE PTR DS:[EAX],AL
0040171E0000ADD BYTE PTR DS:[EAX],AL
004017200000ADD BYTE PTR DS:[EAX],AL
004017220000ADD BYTE PTR DS:[EAX],AL
004017240000ADD BYTE PTR DS:[EAX],AL
004017260000ADD BYTE PTR DS:[EAX],AL
004017280000ADD BYTE PTR DS:[EAX],AL
0040172A0000ADD BYTE PTR DS:[EAX],AL
0040172C0000ADD BYTE PTR DS:[EAX],AL
0040172E0000ADD BYTE PTR DS:[EAX],AL
004017300000ADD BYTE PTR DS:[EAX],AL
004017320000ADD BYTE PTR DS:[EAX],AL
004017340000ADD BYTE PTR DS:[EAX],AL
004017360000ADD BYTE PTR DS:[EAX],AL
004017380000ADD BYTE PTR DS:[EAX],AL
0040173A0000ADD BYTE PTR DS:[EAX],AL
0040173C0000ADD BYTE PTR DS:[EAX],AL
0040173E0000ADD BYTE PTR DS:[EAX],AL
004017400000ADD BYTE PTR DS:[EAX],AL
004017420000ADD BYTE PTR DS:[EAX],AL
004017440000ADD BYTE PTR DS:[EAX],AL
004017460000ADD BYTE PTR DS:[EAX],AL
00401748000D 20314000 ADD BYTE PTR DS:[403120],CL -----------------光标停在这里,其实这里是假的OEP
0040174E8908MOV DWORD PTR DS:[EAX],ECX
00401750FF15 88214000 CALL DWORD PTR DS:[402188] ; msvcrt.__p__commode
004017568B0D 1C314000 MOV ECX,DWORD PTR DS:[40311C]
0040175C8908MOV DWORD PTR DS:[EAX],ECX
0040175EA1 84214000 MOV EAX,DWORD PTR DS:[402184]
004017638B00MOV EAX,DWORD PTR DS:[EAX]
00401765A3 28314000 MOV DWORD PTR DS:[403128],EAX; msvcrt._fmode

我们看到00401748这句前面有很长的一段空代码,这些空代码是被stolen了点,我们要想让脱壳程序能运行,就得把它们补回来,真正的OEP是00401700这句

重新载入程序,按我们前面的方法还是来到这里:


00408CB5F7D2NOT EDX; ntdll.KiFastSystemCallRet
00408CB739C2CMP EDX,EAX
00408CB9F7C0 74E7F921 TEST EAX,21F9E774
00408CBF0FACC2 48 SHRD EDX,EAX,48; 位移常数超出 1..31 的范围

这回我们小心的F8单步走,把被偷取的代码找回来:
00408D0955PUSH EBP
00408D0D8BECMOV EBP,ESP
00408D126A FF PUSH -1
00408D1768 8890BF01 PUSH 1BF9088
00408D1C812C24 886B7F01 SUB DWORD PTR SS:[ESP],17F6B88---这里通过计算得push 00402500(1BF9088-17F6B88)
00408D2368 ED8824EE PUSH EE2488ED
00408D28810424 998F1B12 ADD DWORD PTR SS:[ESP],121B8F99---这里通过计算得push 00401886(EE2488ED+121B8F99)
00408D2F64:A1 00000000MOV EAX,DWORD PTR FS:[0]
00408D3850PUSH EAX
00408D3C64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00408D4683EC 68 SUB ESP,68
00408D4C53PUSH EBX
00408D5056PUSH ESI
00408D5457PUSH EDI
00408D588965 E8 MOV DWORD PTR SS:[EBP-18],ESP
00408D5E33DBXOR EBX,EBX
00408D63895D FC MOV DWORD PTR SS:[EBP-4],EBX
00408D696A 02 PUSH 2
00408D6EFF15 90214000 CALL DWORD PTR DS:[402190] ; msvcrt.__set_app_type
00408D7759POP ECX
00408D7B830D 2C314000 F>OR DWORD PTR DS:[40312C],FFFFFFFF
00408D85830D 30314000 F>OR DWORD PTR DS:[403130],FFFFFFFF
00408D8FFF15 8C214000 CALL DWORD PTR DS:[40218C] ; msvcrt.__p__fmode

我整里后的代码是:
558BEC6AFF6800254000688618400064A100000000506489250000000083EC685356578965E833DB895DFC6A02FF159021400059830D2C314000FF830D30314000FFFF158C214000

把上面这些代码复制到00401748这句前面的空代码处,补好被偷走的代码,其实我们真正的oep地址是:00401700

补好后成这样的:
0040CE8255 PUSH EBP
0040CE838BEC MOV EBP,ESP
0040CE856A FFPUSH -1
0040CE8768 00254000PUSH UnPackMe.00402500
0040CE8C68 86184000PUSH UnPackMe.00401886 ; JMP 到 msvcrt._except_handler3
0040CE9164:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040CE9750 PUSH EAX
0040CE9864:8925 00000000 MOV DWORD PTR FS:[0],ESP
0040CE9F83EC 68SUB ESP,68
0040CEA253 PUSH EBX
0040CEA356 PUSH ESI
0040CEA457 PUSH EDI
0040CEA58965 E8MOV DWORD PTR SS:[EBP-18],ESP
0040CEA833DB XOR EBX,EBX
0040CEAA895D FCMOV DWORD PTR SS:[EBP-4],EBX
0040CEAD6A 02PUSH 2
0040CEAFFF15 90214000CALL DWORD PTR DS:[402190] ; msvcrt.__set_app_type
0040CEB559 POP ECX; UnPackMe.00401886
0040CEB6830D 2C314000 FF OR DWORD PTR DS:[40312C],FFFFFFFF
0040CEBD830D 30314000 FF OR DWORD PTR DS:[403130],FFFFFFFF
0040CEC4FF15 8C214000CALL DWORD PTR DS:[40218C] ; msvcrt.__p__fmode

再在00401700这句处新建EIP

建好后用LodePe这个工具dump出来,再用ImportREC修复后,运行成功,到此脱壳完成,可以交作业了!

不知道脱文是不是这样写,第一次学着写脱文,希望能看懂!并附上脱壳后的文件

dumped_.rar

22 KB, 下载次数: 5, 下载积分: 吾爱币 -1 CB

kk159 发表于 2008-10-10 21:29
载入OD
F8两次,ESP定律
SHIFT+F9
00408CB5F7D2 //运行到此
00408CB739C2
00408CB9F7C0 74E7F921
00408CBF0FACC2 48
00408CC30FBDC8
-------------------------------------------
一直向下单步F8
00408D8BFFEB
00408D8D0151 FF
00408D9015 8C214000
00408D95EB 01 jmp short UnPackMe.00408D98
00408D97A5movsd
00408D98- E9 AB89FFFF jmp UnPackMe.00401748//一个大跳转
00408D9D0F2B
00408D9FAC
00408DA0A3 8E9B3181
--------------------------------
004017488B0D 20314000 //F8后,到此
0040174E8908//向上拉,看到OEP了
00401750FF15 88214000
004017568B0D 1C314000
0040175C8908
---------------------------------------
004017000000add byte ptr ds:[eax],al //伪装OEP
004017020000add byte ptr ds:[eax],al
004017040000add byte ptr ds:[eax],al
004017060000add byte ptr ds:[eax],al
004017080000add byte ptr ds:[eax],al
0040170A0000add byte ptr ds:[eax],al
0040170C0000add byte ptr ds:[eax],al
-----------------------------------------------------
寻找被盗的OEP代码
看到
00408D0955push ebp
00408D0D8BECmov ebp,esp
00408D126A FF push -1
-----------------------------------------
Microsoft Visual C++ 6.0 //VC++的入口特征
00496EB8 >/$55PUSH EBP;(初始 cpu 选择)
00496EB9|.8BECMOV EBP,ESP
00496EBB|.6A FF PUSH -1
00496EBD|.68 40375600 PUSH Screensh.00563740
00496EC2|.68 8CC74900 PUSH Screensh.0049C78C ;SE 处理程序安装
00496EC7|.64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00496ECD|.50PUSH EAX
00496ECE|.64:8925 00000>MOV DWORD PTR FS:[0],ESP
00496ED5|.83EC 58 SUB ESP,58
-------------------------------------
00408D1768 8890BF01 push 1BF9088
00408D1C812C24 886B7F01 sub dword ptr ss:[esp],17F6B88
00408D2368 ED8824EE push EE2488ED
00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99
00408D2F64:A1 00000000mov eax,dword ptr fs:[0]//这里在堆栈发现压栈的入口
---------------------------------
0012FFB4 00401886jmp to msvcrt._except_handler3//堆栈窗口显示
0012FFB8 00402500UnPackMe.00402500
0012FFBC FFFFFFFF
0012FFC0 0012FFF0
---------------------------------
看了看STOLEN CODE的字节,向下继续找
00408D3850push eax
00408D3C64:8925 0000000>mov dword ptr fs:[0],esp
00408D4683EC 68 sub esp,68
00408D4C53push ebx
00408D5056push esi
00408D5457push edi
00408D588965 E8 mov dword ptr ss:[ebp-18],esp
00408D5E33DBxor ebx,ebx
00408D63895D FC mov dword ptr ss:[ebp-4],ebx
00408D696A 02 push 2
00408D6EFF15 90214000 call dword ptr ds:[402190]
00408D7759pop ecx
00408D7B830D 2C314000 F>or dword ptr ds:[40312C],FFFFFFFF
00408D85830D 30314000 F>or dword ptr ds:[403130],FFFFFFFF
00408D8FFF15 8C214000 call dword ptr ds:[40218C]
00408D98- E9 AB89FFFF jmp UnPackMe.00401748 //就到跳转了`
CODE :
55 8B EC 6A FF 68 00 25 40 00 68 86 18 40 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 6853 56 57 89 65 E8 33 DB 89 5D FC 6A 02 FF 15 90 21 40 00 59 83 0D 2C 31 40 00 FF 83 0D 30 31 40 00 FF FF 15 8C 21 40 00
maokecheng 该用户已被删除
maokecheng 发表于 2008-10-10 13:42
提示: 作者被禁止或删除 内容自动屏蔽
枫笑九洲 发表于 2008-10-10 02:52
交作业
OD载入,停在
004070D4 U> /EB 01 jmp short UnPackMe.004070D7
004070D6|68 60E80000 push 0E860
004070DB 0000add byte ptr ds:[eax],al
004070DD 8B1C24mov ebx,dword ptr ss:[esp]
004070E0 83C3 12 add ebx,12
004070E3 812B E8B10600 sub dword ptr ds:[ebx],6B1E8
004070E9 FE4B FD dec byte ptr ds:[ebx-3]
004070EC 822C24 17 sub byte ptr ss:[esp],17

1)调试设置-->异常--->把除了无效或特权指令外,全部忽略,F9运行停在

00409FC3 FBsti
00409FC4 FFFF???; 未知命令
00409FC6 891Bmov dword ptr ds:[ebx],ebx
00409FC8 E8 95FFFFFF call UnPackMe.00409F62
00409FCD EB 01 jmp short UnPackMe.00409FD0

2)调试设置-->异常--->忽略所有,bp LoadLibraryA下断,Shift+F9运行,

7C801D7B k>/$8BFFmov edi,edi;UnPackMe.0040280C
7C801D7D |.55push ebp
7C801D7E |.8BECmov ebp,esp

3)取消断点,Alt+F9运行回到程序领空,

4)查看内存,在
内存映射,项目 20
地址=00401000
大小=00001000 (4096.)
Owner=UnPackMe 00400000
区段=
包含=code
类型=Imag 01001040
访问=RWE
初始访问=RWE
下断,F9运行
即可到程序的虚假OEP处..

接着,我们来找下stolen code
在第三步,回到程序领空后,用花指令去除器,先消掉点花指令,然后,ctrl+F 搜索push -1
应该很快就会来到.
00408D09 55push ebp
00408D0A 90nop
00408D0B 90nop
00408D0C 90nop
00408D0D 8BECmov ebp,esp
00408D0F 90nop
00408D10 90nop
00408D11 90nop
00408D12 6A FF push -1 ///来到此处
00408D14 90nop
00408D15 90nop
00408D16 90nop
00408D17 68 8890BF01 push 1BF9088
00408D1C 812C24 886B7F01 sub dword ptr ss:[esp],17F6B88
00408D23 68 ED8824EE push EE2488ED
00408D28 810424 998F1B12 add dword ptr ss:[esp],121B8F99
00408D2F 64:A1 00000000mov eax,dword ptr fs:[0]
00408D35 90nop
00408D36 90nop
00408D37 90nop
00408D38 50push eax
00408D39 90nop
00408D3A 90nop
00408D3B 90nop
00408D3C 64:8925 00000000mov dword ptr fs:[0],esp
00408D43 90nop
00408D44 90nop
00408D45 90nop
00408D46 83EC 68 sub esp,68
00408D49 90nop
00408D4A 90nop
00408D4B 90nop
00408D4C 53push ebx
00408D4D 90nop
00408D4E 90nop
00408D4F 90nop
00408D50 56push esi
00408D51 90nop
00408D52 90nop
00408D53 90nop
00408D54 57push edi
00408D55 90nop
00408D56 90nop
00408D57 90nop
00408D58 8965 E8 mov dword ptr ss:[ebp-18],esp
00408D5B 90nop
00408D5C 90nop
00408D5D 90nop
00408D5E 33DBxor ebx,ebx
00408D60 90nop
00408D61 90nop
00408D62 90nop
00408D63 895D FC mov dword ptr ss:[ebp-4],ebx
00408D66 90nop
00408D67 90nop
00408D68 90nop
00408D69 6A 02 push 2

好了,以上就是stolen code,把他们copy到虚假oep前面,并重建OEP,然后用od自带的dump,此处要把重建输入表前面的勾去掉,然后用
ImportREC修复即可

UnPack.rar (22 KB, 下载次数: 12)
unpack 发表于 2008-10-9 21:58
说明:我的第一种方法真的很失败诶,没有用到ESP定律这个好的脱壳方法,忘了用shift+f9运行,所以绕了很多弯,也浪费了很多时间!在知道用shift+f9运行后,分析也就简单多了!

首先OD载入,忽略所以异常停在:
004070D4 > /EB 01 JMP SHORT UnPackMe.004070D7; //程序停在这儿,F8单步走004070D6 |68 60E80000 PUSH 0E860004070DB0000ADD BYTE PTR DS:[EAX],AL
然后单步走,F8两次后
004070D760PUSHAD004070D8E8 00000000 CALL UnPackMe.004070DD ; //F8两次来到这儿,我们进行ESP定律!004070DD8B1C24MOV EBX,DWORD PTR SS:[ESP]004070E083C3 12 ADD EBX,12004070E3812B E8B10600 SUB DWORD PTR DS:[EBX],6B1E8004070E9FE4B FD DEC BYTE PTR DS:[EBX-3]004070EC822C24 17 SUB BYTE PTR SS:[ESP],17004070F0E6 46 OUT 46,AL; I/O 命令
下好断点hr 0012ffa4,shift+f9运行后会来到
00408CB5F7D2NOT EDX; ntdll.KiFastSystemCallRet00408CB739C2CMP EDX,EAX00408CB9F7C0 74E7F921 TEST EAX,21F9E77400408CBF0FACC2 48 SHRD EDX,EAX,48; 移位常量超出 1..31 的范围00408CC30FBDC8BSR ECX,EAX00408CC6C7C2 2431C7CD MOV EDX,CDC7312400408CCC85C0TEST EAX,EAX00408CCE0FBAEA 31 BTS EDX,3100408CD2F7D2NOT EDX

我们一直F8单步,然后会走啊走啊,一直是花指令:
00408D85830D 30314000 FFOR DWORD PTR DS:[403130],FFFFFFFF00408D8CEB 01 JMP SHORT UnPackMe.00408D8F00408D8E51PUSH ECX00408D8FFF15 8C214000 CALL DWORD PTR DS:[40218C] ; msvcrt.__p__fmode00408D95EB 01 JMP SHORT UnPackMe.00408D98; //这里跳向下面一个跳00408D97A5MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>00408D98- E9 AB89FFFF JMP UnPackMe.00401748; //这里有一个大的跳转,到OEP处
进入OEP后,我们发现是下面的样子
004017488BDB 8B004017490DDB 0D0040174A20DB 20;CHAR ' '0040174B31DB 31;CHAR '1'0040174C40DB 40;CHAR '@'
0040174D00DB 00

在这儿,我们右键----分析---删除分析
变成下面的样子
004017488B0D 20314000 MOV ECX,DWORD PTR DS:[403120]0040174E8908MOV DWORD PTR DS:[EAX],ECX00401750FF15 88214000 CALL DWORD PTR DS:[402188] ; msvcrt.__p__commode004017568B0D 1C314000 MOV ECX,DWORD PTR DS:[40311C]0040175C8908MOV DWORD PTR DS:[EAX],ECX0040175EA1 84214000 MOV EAX,DWORD PTR DS:[402184]004017638B00MOV EAX,DWORD PTR DS:[EAX]00401765A3 28314000 MOV DWORD PTR DS:[403128],EAX0040176AE8 16010000 CALL UnPackMe.004018850040176F391D 40304000 CMP DWORD PTR DS:[403040],EBX0040177575 0C JNZ SHORT UnPackMe.004017830040177768 82184000 PUSH UnPackMe.004018820040177CFF15 80214000 CALL DWORD PTR DS:[402180] ; msvcrt.__setusermatherr
不像是OEP啊!我们往上看
004017000000ADD BYTE PTR DS:[EAX],AL004017020000ADD BYTE PTR DS:[EAX],AL004017040000ADD BYTE PTR DS:[EAX],AL004017060000ADD BYTE PTR DS:[EAX],AL004017080000ADD BYTE PTR DS:[EAX],AL0040170A0000ADD BYTE PTR DS:[EAX],AL0040170C0000ADD BYTE PTR DS:[EAX],AL0040170E0000ADD BYTE PTR DS:[EAX],AL004017100000ADD BYTE PTR DS:[EAX],AL004017120000ADD BYTE PTR DS:[EAX],AL004017140000ADD BYTE PTR DS:[EAX],AL004017160000ADD BYTE PTR DS:[EAX],AL004017180000ADD BYTE PTR DS:[EAX],AL0040171A0000ADD BYTE PTR DS:[EAX],AL0040171C0000ADD BYTE PTR DS:[EAX],AL0040171E0000ADD BYTE PTR DS:[EAX],AL004017200000ADD BYTE PTR DS:[EAX],AL004017220000ADD BYTE PTR DS:[EAX],AL004017240000ADD BYTE PTR DS:[EAX],AL004017260000ADD BYTE PTR DS:[EAX],AL004017280000ADD BYTE PTR DS:[EAX],AL0040172A0000ADD BYTE PTR DS:[EAX],AL0040172C0000ADD BYTE PTR DS:[EAX],AL0040172E0000ADD BYTE PTR DS:[EAX],AL004017300000ADD BYTE PTR DS:[EAX],AL004017320000ADD BYTE PTR DS:[EAX],AL004017340000ADD BYTE PTR DS:[EAX],AL004017360000ADD BYTE PTR DS:[EAX],AL004017380000ADD BYTE PTR DS:[EAX],AL0040173A0000ADD BYTE PTR DS:[EAX],AL0040173C0000ADD BYTE PTR DS:[EAX],AL0040173E0000ADD BYTE PTR DS:[EAX],AL004017400000ADD BYTE PTR DS:[EAX],AL004017420000ADD BYTE PTR DS:[EAX],AL004017440000ADD BYTE PTR DS:[EAX],AL004017460000ADD BYTE PTR DS:[EAX],AL
发现这么多0000充斥着,看来是被抽取了代码很多行啊
从程序有的比较,应该是VC++程序,抽取了这么多行代码差点认不出来了



下在我们来找回被抽取的代码,我们还记得我们是怎么跳到这个oep的吧,那么在跳向OEP前肯定有代码被抽取了,我们记得vc++的第一行代码是 push ebp,我么就以这个为起点找找看:
首先,我们还是ESP定律
00408CB5F7D2NOT EDX; ESP定律来到这儿后,我们F8单步走00408CB739C2CMP EDX,EAX00408CB9F7C0 74E7F921 TEST EAX,21F9E77400408CBF0FACC2 48 SHRD EDX,EAX,48; 移位常量超出 1..31 的范围00408CC30FBDC8BSR ECX,EAX00408CC6C7C2 2431C7CD MOV EDX,CDC7312400408CCC85C0TEST EAX,EAX00408CCE0FBAEA 31 BTS EDX,3100408CD2F7D2NOT EDX
然后来到下面的地方就是开始代码被抽取的地方了
00408D0955PUSH EBP ; //注意这行了,这是第一处被抽取的代码00408D0AEB 01 JMP SHORT UnPackMe.00408D0D
然后下面有个jmp 是我们F8后会变成
00408D0D8BECMOV EBP,ESP00408D0FEB 01 JMP SHORT UnPackMe.00408D12
所以00408d0d也同样是被抽取的代码了,看来被抽取的代码基本就贴在jmp上面和下面,我们一直找,把找到的代码集合

00408D0955 PUSH EBP 00408D0D8BEC MOV EBP,ESP00408D126A FFPUSH -100408D1768 8890BF01push1BF908800408D1C812C24 886B7F01sub dword ptr [esp], 17F6B8800408D2368 ED8824EEpushEE2488ED00408D28810424 998F1B12add dword ptr [esp], 121B8F9900408D2F64:A1 00000000 mov eax, fs:[0]00408D3850 pusheax00408D3C64:8925 00000000 mov fs:[0], esp00408D4683EC 68sub esp, 6800408D4C53 pushebx00408D5056 pushesi; USER32.77D1EA8D00408D5457 pushedi00408D588965 E8mov [ebp-18], esp00408D5E33DB xor ebx, ebx00408D63895D FCmov [ebp-4], ebx00408D696A 02push200408D6EFF15 90214000call[402190] ; msvcrt.__set_app_type00408D7759 pop ecx00408D7B830D 2C314000 FF ordword ptr [40312C], FFFFFFFF00408D85830D 30314000 FF ordword ptr [403130], FFFFFFFF00408D8FFF15 8C214000call[40218C] ; msvcrt.__p__fmode
上面使我们找到的偷取的代码,但是有两个地方有运算,所以我们还有给他恢复~~
(1)00408D1768 8890BF01push1BF908800408D1C812C24 886B7F01sub dword ptr [esp], 17F6B88这里是一个减法,先把1BF9088压入堆栈,然后再带进位减去17F6B88,所以我们就要计算1BF9088-17F6B88=402500所以这就就要改成push 402500其二进制代码为:68 00 25 40 00
(2)00408D2368 ED8824EEpushEE2488ED00408D28810424 998F1B12add dword ptr [esp], 121B8F99这里却是一个带进位符号的加法,我们也要计算出来 EE2488ED+121B8F99=401886所以改成push 401886这句的二进制为:68 86 18 40 00

所以找到的二进制总的代码为:
55 8B EC 6A FF 68 00 25 40 00 68 86 18 40 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 68 53 56 57 89 65 E8 33 DB 89 5D FC 6A 02 FF 15 90 21 40 00 59 83 0D 2C 31 40 00 FF 83 0D 30 31 40 00 FF FF 15 8C 21 40 00 

然后将其偷取的代码粘贴到真正的OEP处,我们可以数数1748-1700=48(十进制为72),上面也正好有72个字了0401700就是OEP了!
然后在00401700处----右键-----此处为新的EIP,
然后用LordPE脱壳,用ImpREC进行修复,发现无无效函数,修复后,能够正常运行,PEID查自然也就是VC++了!


被偷取的代码补回的情况如下:
00401700 >/$55pushebp00401701|.8BECmov ebp, esp00401703|.6A FF push-100401705|.68 00254000 push004025000040170A|.68 86184000 push<jmp.&msvcrt._except_handler3> ;SE 处理程序安装0040170F|.64:A1 0000000>mov eax, fs:[0]00401715|.50pusheax00401716|.64:8925 00000>mov fs:[0], esp0040171D|.83EC 68 sub esp, 6800401720|.53pushebx00401721|.56pushesi00401722|.57pushedi00401723|.8965 E8 mov [ebp-18], esp00401726|.33DBxor ebx, ebx00401728|.895D FC mov [ebp-4], ebx0040172B|.6A 02 push20040172D|.FF15 90214000 call[<&msvcrt.__set_app_type>] ;msvcrt.__set_app_type00401733|.59pop ecx00401734|.830D 2C314000>ordword ptr [40312C], FFFFFFFF0040173B|.830D 30314000>ordword ptr [403130], FFFFFFFF00401742|.FF15 8C214000 call[<&msvcrt.__p__fmode>] ;msvcrt.__p__fmode


再次说下:我们用了ESP定律后,停下后,我们在内存镜像中,在0040100处下段,直接到达00401748处



dumped111_.rar
lqiulu 发表于 2008-10-9 09:33
od载入到这里。
004070D4 > /EB 01 JMP SHORT UnPackMe.004070D7//F8单步
-----------------------------------------------------------------------------
004070D760PUSHAD
004070D8E8 00000000 CALL UnPackMe.004070DD//ESP定律
004070DD8B1C24MOV EBX,DWORD PTR SS:[ESP]
-----------------------------------------------------------------------------
断在这里:

00408CB5F7D2NOT EDX //F8单步
00408CB739C2CMP EDX,EAX
00408CB9F7C0 74E7F921 TEST EAX,21F9E774
00408CBF0FACC2 48 SHRD EDX,EAX,48; Shift constant out of range 1..31
.............................................................................................

00408D0955PUSH EBP //从这里跳记录stole code
00408D0AEB 01 JMP SHORT UnPackMe.00408D0D
--------------------------------------------------------------------------------------------
00408D0D8BECMOV EBP,ESP//记录
00408D0FEB 01 JMP SHORT UnPackMe.00408D12
00408D112FDAS
00408D126A FF PUSH -1//记录
00408D14EB 01 JMP SHORT UnPackMe.00408D17
--------------------------------------------------------------------------------------------
00408D1768 8890BF01 PUSH 1BF9088
00408D1C812C24 886B7F01 SUB DWORD PTR SS:[ESP],17F6B88 //注意堆栈:记录地址:00402500
00408D2368 ED8824EE PUSH EE2488ED
00408D28810424 998F1B12 ADD DWORD PTR SS:[ESP],121B8F99//注意堆栈:记录地址:00401886
00408D2F64:A1 00000000MOV EAX,DWORD PTR FS:[0] //记录
00408D35EB 01 JMP SHORT UnPackMe.00408D38
--------------------------------------------------------------------------------------------
到这里注意堆栈:
0012FFB4 00401886JMP to msvcrt._except_handler3//第二次压入的地址
0012FFB8 00402500UnPackMe.00402500 //首先压入的地址
-----------------------------------------------------------------------------------------
00408D37CEINTO
00408D3850PUSH EAX //记录
00408D39EB 01 JMP SHORT UnPackMe.00408D3C
00408D3B4CDEC ESP
00408D3C64:8925 0000000>MOV DWORD PTR FS:[0],ESP //记录
00408D43EB 01 JMP SHORT UnPackMe.00408D46
----------------------------------------------------------------------------------------
00408D4683EC 68 SUB ESP,68 //记录
00408D49EB 01 JMP SHORT UnPackMe.00408D4C
-----------------------------------------------------------------------------------------
00408D4C53PUSH EBX //记录
00408D4DEB 01 JMP SHORT UnPackMe.00408D50
-----------------------------------------------------------------------------------------
00408D5056PUSH ESI //记录
00408D51EB 01 JMP SHORT UnPackMe.00408D54
-----------------------------------------------------------------------------------------
00408D5457PUSH EDI //记录
00408D55EB 01 JMP SHORT UnPackMe.00408D58
------------------------------------------------------------------------------------------
00408D588965 E8 MOV DWORD PTR SS:[EBP-18],ESP//记录
00408D5BEB 01 JMP SHORT UnPackMe.00408D5E
------------------------------------------------------------------------------------------
00408D5E33DBXOR EBX,EBX//记录
00408D60EB 01 JMP SHORT UnPackMe.00408D63
00408D62ADLODS DWORD PTR DS:[ESI]
00408D63895D FC MOV DWORD PTR SS:[EBP-4],EBX //记录
00408D66EB 01 JMP SHORT UnPackMe.00408D69
------------------------------------------------------------------------------------------
00408D696A 02 PUSH 2 //记录
00408D6BEB 01 JMP SHORT UnPackMe.00408D6E
------------------------------------------------------------------------------------------
00408D6EFF15 90214000 CALL DWORD PTR DS:[402190] //记录
00408D74EB 01 JMP SHORT UnPackMe.00408D77
------------------------------------------------------------------------------------------
00408D7759POP ECX//记录
00408D78EB 01 JMP SHORT UnPackMe.00408D7B
------------------------------------------------------------------------------------------
00408D7B830D 2C314000 F>OR DWORD PTR DS:[40312C],FFFFFFFF//记录
00408D82EB 01 JMP SHORT UnPackMe.00408D85
------------------------------------------------------------------------------------------
00408D85830D 30314000 F>OR DWORD PTR DS:[403130],FFFFFFFF//记录
00408D8C /EB 01 JMP SHORT UnPackMe.00408D8F
00408D8E |51PUSH ECX
00408D8F \FF15 8C214000 CALL DWORD PTR DS:[40218C] //记录
00408D95EB 01 JMP SHORT UnPackMe.00408D98
00408D97A5MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>
00408D98- E9 AB89FFFF JMP UnPackMe.00401748; 跳到伪OEP

====================================================================================
记录下如下代码:
00408D0955PUSH EBP
00408D0D8BECMOV EBP,ESP
00408D126A FF PUSH -1
00408D1768 8890BF01 PUSH00402500 //(首先压入堆栈地址)
00408D2368 ED8824EE PUSH00401886 //(第二次压入堆栈的地址)
00408D2F64:A1 00000000MOV EAX,DWORD PTR FS:[0]
00408D3850PUSH EAX
00408D3C64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00408D4683EC 68 SUB ESP,68
00408D4C53PUSH EBX
00408D5056PUSH ESI
00408D5457PUSH EDI
00408D588965 E8 MOV DWORD PTR SS:[EBP-18],ESP
00408D5E33DBXOR EBX,EBX
00408D63895D FC MOV DWORD PTR SS:[EBP-4],EBX
00408D696A 02 PUSH 2
00408D6EFF15 90214000 CALL DWORD PTR DS:[402190] ; msvcrt.__set_app_type
00408D7759POP ECX
00408D7B830D 2C314000 F>OR DWORD PTR DS:[40312C],FFFFFFFF
00408D85830D 30314000 F>OR DWORD PTR DS:[403130],FFFFFFFF
00408D8FFF15 8C214000 CALL DWORD PTR DS:[40218C] ; msvcrt.__p__fmode



=====================================================================================================

004016FFCCINT3
004017000000ADD BYTE PTR DS:[EAX],AL //从这里开始,代码被偷。补上上面记录下的代码。
004017020000ADD BYTE PTR DS:[EAX],AL
004017040000ADD BYTE PTR DS:[EAX],AL
004017060000ADD BYTE PTR DS:[EAX],AL
004017080000ADD BYTE PTR DS:[EAX],AL
0040170A0000ADD BYTE PTR DS:[EAX],AL
0040170C0000ADD BYTE PTR DS:[EAX],AL
0040170E0000ADD BYTE PTR DS:[EAX],AL
004017100000ADD BYTE PTR DS:[EAX],AL
004017120000ADD BYTE PTR DS:[EAX],AL
004017140000ADD BYTE PTR DS:[EAX],AL
004017160000ADD BYTE PTR DS:[EAX],AL
004017180000ADD BYTE PTR DS:[EAX],AL
0040171A0000ADD BYTE PTR DS:[EAX],AL
0040171C0000ADD BYTE PTR DS:[EAX],AL
0040171E0000ADD BYTE PTR DS:[EAX],AL
004017200000ADD BYTE PTR DS:[EAX],AL
004017220000ADD BYTE PTR DS:[EAX],AL
004017240000ADD BYTE PTR DS:[EAX],AL
004017260000ADD BYTE PTR DS:[EAX],AL
004017280000ADD BYTE PTR DS:[EAX],AL
0040172A0000ADD BYTE PTR DS:[EAX],AL
0040172C0000ADD BYTE PTR DS:[EAX],AL
0040172E0000ADD BYTE PTR DS:[EAX],AL
004017300000ADD BYTE PTR DS:[EAX],AL
004017320000ADD BYTE PTR DS:[EAX],AL
004017340000ADD BYTE PTR DS:[EAX],AL
004017360000ADD BYTE PTR DS:[EAX],AL
004017380000ADD BYTE PTR DS:[EAX],AL
0040173A0000ADD BYTE PTR DS:[EAX],AL
0040173C0000ADD BYTE PTR DS:[EAX],AL
0040173E0000ADD BYTE PTR DS:[EAX],AL
004017400000ADD BYTE PTR DS:[EAX],AL
004017420000ADD BYTE PTR DS:[EAX],AL
004017440000ADD BYTE PTR DS:[EAX],AL
004017460000ADD BYTE PTR DS:[EAX],AL
004017488B0D 20314000 MOV ECX,DWORD PTR DS:[403120]//跳到这里,这里是伪OEP,上面是代码被偷。
0040174E8908MOV DWORD PTR DS:[EAX],ECX
00401750FF15 88214000 CALL DWORD PTR DS:[402188] ; msvcrt.__p__commode
004017568B0D 1C314000 MOV ECX,DWORD PTR DS:[40311C]
0040175C8908MOV DWORD PTR DS:[EAX],ECX
0040175EA1 84214000 MOV EAX,DWORD PTR DS:[402184]
004017638B00MOV EAX,DWORD PTR DS:[EAX]

======================================================================================================
补完代码后如下:在401700处新建EIP。
-----------------------------------------------------------------------------------------------------
0040170055PUSH EBP //此处新建EIP,dump程序。
004017018BECMOV EBP,ESP
004017036A FF PUSH -1
0040170568 00254000 PUSH UnPackMe.00402500
0040170A68 86184000 PUSH UnPackMe.00401886 ; JMP to msvcrt._except_handler3
0040170F64:A1 00000000MOV EAX,DWORD PTR FS:[0]
0040171550PUSH EAX
0040171664:8925 0000000>MOV DWORD PTR FS:[0],ESP
0040171D83EC 68 SUB ESP,68
0040172053PUSH EBX
0040172156PUSH ESI
0040172257PUSH EDI
004017238965 E8 MOV DWORD PTR SS:[EBP-18],ESP
0040172633DBXOR EBX,EBX
00401728895D FC MOV DWORD PTR SS:[EBP-4],EBX
0040172B6A 02 PUSH 2
0040172DFF15 90214000 CALL DWORD PTR DS:[402190] ; msvcrt.__set_app_type
0040173359POP ECX
00401734830D 2C314000 F>OR DWORD PTR DS:[40312C],FFFFFFFF
0040173B830D 30314000 F>OR DWORD PTR DS:[403130],FFFFFFFF
00401742FF15 8C214000 CALL DWORD PTR DS:[40218C] ; msvcrt.__p__fmode
004017488B0D 20314000 MOV ECX,DWORD PTR DS:[403120]
0040174E8908MOV DWORD PTR DS:[EAX],ECX
00401750FF15 88214000 CALL DWORD PTR DS:[402188] ; msvcrt.__p__commode
004017568B0D 1C314000 MOV ECX,DWORD PTR DS:[40311C]
0040175C8908MOV DWORD PTR DS:[EAX],ECX
0040175EA1 84214000 MOV EAX,DWORD PTR DS:[402184]
004017638B00MOV EAX,DWORD PTR DS:[EAX]
===============================================================================================
修复后程序正常运行。
 楼主| 小生我怕怕 发表于 2008-10-9 10:44
004070D4 > /EB 01 jmp short UnPackMe.004070D7 //OD载入004070D6 |68 60E80000 push 0E860//单步一步f8004070DB0000add byte ptr ds:[eax],al004070DD8B1C24mov ebx,dword ptr ss:[esp]━━━━━━━━━━━━━━━━━━━━━━━━━━004070D760pushad//上面入口的JMP直接跳到这里004070D8E8 00000000 call UnPackMe.004070DD//这里让他们联想到ESP定律 hr esp004070DD8B1C24mov ebx,dword ptr ss:[esp]//shift+f9运行程序004070E083C3 12 add ebx,12004070E3812B E8B10600 sub dword ptr ds:[ebx],6B1E8━━━━━━━━━━━━━━━━━━━━━━━━━━00408CB5F7D2not edx//程序在此停下,我们打开内存镜像00408CB739C2cmp edx,eax//ait+m打开内存镜像00408CB9F7C0 74E7F921 test eax,21F9E77400408CBF0FACC2 48 shrd edx,eax,4800408CC30FBDC8bsr ecx,eax━━━━━━━━━━━━━━━━━━━━━━━━━━内存映射,项目 23//我们在00401000处的code段下f2访问中断 地址=00401000 //shift+f9运行程序 大小=00001000 (4096.) 物主=UnPackMe 00400000 区段= 包含=code 类型=Imag 01001040 访问=RWE 初始访问=RWE━━━━━━━━━━━━━━━━━━━━━━━━━━004017488B0D 20314000 mov ecx,dword ptr ds:[403120]//此时程序停于此处0040174E8908mov dword ptr ds:[eax],ecx //从代码看是很标准的VC++写的00401750FF15 88214000 call dword ptr ds:[402188] //我们向上看看有没有我们的OEP代码004017568B0D 1C314000 mov ecx,dword ptr ds:[40311C]0040175C8908mov dword ptr ds:[eax],ecx━━━━━━━━━━━━━━━━━━━━━━━━━━ 004017000000add byte ptr ds:[eax],al //很明显这个是我们的OEP,他上面有三排int3004017020000add byte ptr ds:[eax],al //大家练习过C++练习的都应该知道1700这个OEP004017040000add byte ptr ds:[eax],al //这样看来我们的OEP是被抽了代码啦004017060000add byte ptr ds:[eax],al //没有办法,现在开始进入我们今天的正题004017080000add byte ptr ds:[eax],al0040170A0000add byte ptr ds:[eax],al━━━━━━━━━━━━━━━━━━━━━━━━━━在寻回OEP代码的过程中是非常痛苦的,所以大家在不熟悉编写语言入口特征时,可以去看看入口特征在来寻找被抽取的OEP由于被抽字节甚多,所以连在一起的可能是绝对没有的,所以这样就得靠我们平时累积的经验来寻找回我们的OEP经过了那么多次的IAT加密分析,相信大家也有了一定的代码分析能力,什么代码该出现在什么位置应该也多少有了些了解,现在开始来寻回我们的OEP,漫长而痛苦的路程,ctrl+f2重新加载程序,代码如下━━━━━━━━━━━━━━━━━━━━━━━━━━004070D4 > /EB 01 jmp short UnPackMe.004070D7 //可怕的从头在来004070D6 |68 60E80000 push 0E860//我们单步一步f8004070DB0000add byte ptr ds:[eax],al004070DD8B1C24mov ebx,dword ptr ss:[esp]004070E083C3 12 add ebx,12━━━━━━━━━━━━━━━━━━━━━━━━━━这里要说一下通常我们的oep被抽取,都是在我们跳下伪oep之前,所以大家有时候可以采取我们到达伪oep前的步骤中寻找,也可以通过在内存镜像中,对资源段或者数据段逐下段寻找这样也是一个笨方法,而今天我们的被抽取的OEP我就用的是在我们到达伪装OEP前的步骤来进行寻找004070D760pushad//程序经过上面的JMP来到这里004070D8E8 00000000 call UnPackMe.004070DD//这里执行ESP定律 hr esp004070DD8B1C24mov ebx,dword ptr ss:[esp]//此时shift+f9运行004070E083C3 12 add ebx,12004070E3812B E8B10600 sub dword ptr ds:[ebx],6B1E8004070E9FE4B FD dec byte ptr ds:[ebx-3]━━━━━━━━━━━━━━━━━━━━━━━━━━00408CB5F7D2not edx //程序来到了这里,现在开始我们漫长而痛苦的路途00408CB739C2cmp edx,eax //f8开始走吧00408CB9F7C0 74E7F921 test eax,21F9E77400408CBF0FACC2 48 shrd edx,eax,4800408CC30FBDC8bsr ecx,eax━━━━━━━━━━━━━━━━━━━━━━━━━━00408D0955push ebp//此句为我们oep第一句00408D0AEB 01 jmp short UnPackMe.00408D0D━━━━━━━━━━━━━━━━━━━━━━━━━━00408D0D8BECmov ebp,esp //此句为第2句00408D0FEB 01 jmp short UnPackMe.00408D12━━━━━━━━━━━━━━━━━━━━━━━━━━00408D126A FF push -1 //此句第3句00408D14EB 01 jmp short UnPackMe.00408D17━━━━━━━━━━━━━━━━━━━━━━━━━━00408D1768 8890BF01 push 1BF9088//到达这里大家就会犯迷糊了吧,为什么这句是这样00408D1C812C24 886B7F01 sub dword ptr ss:[esp],17F6B88//熟悉的朋友都知道是绝对不可能这样的,这两句是被VM了的00408D2368 ED8824EE push EE2488ED //好我们在单步一步看下00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99 ━━━━━━━━━━━━━━━━━━━━━━━━━━00408D2368 ED8824EE push EE2488ED //当程序停在此句时,我们注意我们的堆栈窗口00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99 00408D2F64:A1 00000000mov eax,dword ptr fs:[0]00408D35EB 01 jmp short UnPackMe.00408D38━━━━━━━━━━━━━━━━━━━━━━━━━━0012FFB8 00402500UnPackMe.00402500//这句就是我们的第4句的地址0012FFBC FFFFFFFF //即push 004025000012FFC0 0012FFF0━━━━━━━━━━━━━━━━━━━━━━━━━━00408D2368 ED8824EE push EE2488ED //我们此时是在这里00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99 //在寻找我们的下一个push,单步一步f800408D2F64:A1 00000000mov eax,dword ptr fs:[0]//当我们到这里时同样注意我们的堆栈窗口 00408D35EB 01 jmp short UnPackMe.00408D38 //同样上面的这句mov也是我们的就是我们的第6句00408D37CEinto━━━━━━━━━━━━━━━━━━━━━━━━━━0012FFB4 00401886jmp to msvcrt._except_handler3 //我们的第5句出现0012FFB8 00402500UnPackMe.00402500//那他即我们的第二个push 004018860012FFBC FFFFFFFF0012FFC0 0012FFF0━━━━━━━━━━━━━━━━━━━━━━━━━━00408D3850push eax//这里是第7句00408D39EB 01 jmp short UnPackMe.00408D3C━━━━━━━━━━━━━━━━━━━━━━━━━━00408D3C64:8925 0000000>mov dword ptr fs:[0],esp//这里是第8句00408D43EB 01 jmp short UnPackMe.00408D46━━━━━━━━━━━━━━━━━━━━━━━━━━00408D4683EC 68 sub esp,68//这句第9句00408D49EB 01 jmp short UnPackMe.00408D4C━━━━━━━━━━━━━━━━━━━━━━━━━━00408D4C53push ebx//这句第10句00408D4DEB 01 jmp short UnPackMe.00408D50━━━━━━━━━━━━━━━━━━━━━━━━━━00408D4F26:56 push esi//这句第11句00408D51EB 01 jmp short UnPackMe.00408D54━━━━━━━━━━━━━━━━━━━━━━━━━━00408D5457push edi//这句第12句00408D55EB 01 jmp short UnPackMe.00408D58━━━━━━━━━━━━━━━━━━━━━━━━━━00408D588965 E8 mov dword ptr ss:[ebp-18],esp //这句第13句00408D5BEB 01 jmp short UnPackMe.00408D5E━━━━━━━━━━━━━━━━━━━━━━━━━━ 00408D5E33DBxor ebx,ebx //这句第14句00408D60EB 01 jmp short UnPackMe.00408D63━━━━━━━━━━━━━━━━━━━━━━━━━━00408D63895D FC mov dword ptr ss:[ebp-4],ebx//这句第15句00408D66EB 01 jmp short UnPackMe.00408D69━━━━━━━━━━━━━━━━━━━━━━━━━━00408D696A 02 push 2//这句第16句00408D6BEB 01 jmp short UnPackMe.00408D6E━━━━━━━━━━━━━━━━━━━━━━━━━━00408D6EFF15 90214000 call dword ptr ds:[402190]//这句第17句00408D74EB 01 jmp short UnPackMe.00408D77━━━━━━━━━━━━━━━━━━━━━━━━━━00408D7759pop ecx //这句第18句00408D78EB 01 jmp short UnPackMe.00408D7B━━━━━━━━━━━━━━━━━━━━━━━━━━00408D7B830D 2C314000 F>or dword ptr ds:[40312C],FFFFFFFF//这句第19句00408D82EB 01 jmp short UnPackMe.00408D85━━━━━━━━━━━━━━━━━━━━━━━━━━00408D85830D 30314000 F>or dword ptr ds:[403130],FFFFFFFF//这句第20句00408D8CEB 01 jmp short UnPackMe.00408D8F━━━━━━━━━━━━━━━━━━━━━━━━━━00408D8FFF15 8C214000 call dword ptr ds:[40218C] //这句第21句00408D95EB 01 jmp short UnPackMe.00408D9800408D97A5movs dword ptr es:[edi],dword ptr ds:[es>00408D98- E9 AB89FFFF jmp UnPackMe.00401748//这里跳向我们的假oep啦━━━━━━━━━━━━━━━━━━━━━━━━━━00408D0955push ebp //至此我们的OEP代码全部寻找完成00408D0D8BECmov ebp,esp//现在我们选择00408D126A FF push -1此两句为堆栈窗口得出push 00402500push 0040188600408D2F64:A1 00000000mov eax,dword ptr fs:[0]00408D3850push eax00408D3C64:8925 0000000>mov dword ptr fs:[0],esp00408D4683EC 68 sub esp,6800408D4C53push ebx00408D4F26:56 push esi00408D5457push edi00408D588965 E8 mov dword ptr ss:[ebp-18],esp00408D5E33DBxor ebx,ebx00408D63895D FC mov dword ptr ss:[ebp-4],ebx00408D696A 02 push 200408D6EFF15 90214000 call dword ptr ds:[402190]00408D7759pop ecx00408D7B830D 2C314000 F>or dword ptr ds:[40312C],FFFFFFFF00408D85830D 30314000 F>or dword ptr ds:[403130],FFFFFFFF00408D8FFF15 8C214000 call dword ptr ds:[40218C]━━━━━━━━━━━━━━━━━━━━━━━━━━004017000000add byte ptr ds:[eax],al//我们的OEP段,逐一汇编填写我们被抽取的OEP004017020000add byte ptr ds:[eax],al//可以选择右手键汇编或者选择直接按空格键004017040000add byte ptr ds:[eax],al004017060000add byte ptr ds:[eax],al━━━━━━━━━━━━━━━━━━━━━━━━━━0040170055push ebp//这是补好的OEP,48字节004017018BECmov ebp,esp //运行LORDPE把程序DUMP004017036A FF push -1 //在运行importRCE修复下程序即可运行0040170568 00254000 push UnPackMe.004025000040170A68 86184000 push UnPackMe.00401886 ; jmp to msvcrt._except_handler30040170F64:A1 00000000mov eax,dword ptr fs:[0]0040171550push eax0040171664:8925 0000000>mov dword ptr fs:[0],esp0040171D83EC 68 sub esp,680040172053push ebx0040172156push esi0040172257push edi004017238965 E8 mov dword ptr ss:[ebp-18],esp0040172633DBxor ebx,ebx00401728895D FC mov dword ptr ss:[ebp-4],ebx0040172B6A 02 push 20040172DFF15 90214000 call dword ptr ds:[402190] ; msvcrt.__set_app_type0040173359pop ecx00401734830D 2C314000 F>or dword ptr ds:[40312C],FFFFFFFF0040173B830D 30314000 F>or dword ptr ds:[403130],FFFFFFFF00401742FF15 8C214000 call dword ptr ds:[40218C] ; msvcrt.__p__fmode━━━━━━━━━━━━━━━━━━━━━━━━━━总结下经验,在被取字节时,不要一谓的想着这里不是OEP,不是OEP什么的,多对入口特征进行点了解这样会对补起OEP来节省不少力气而上面我也说啦,在我们被抽取OEP时,我们要在到达伪装OEP之前,而这一切就是大家的注意力和经验来判断的啦,没有任何的快捷方式,只有我们的眼睛亮一点,注意力集中点注意几个窗口的变化才可以让你更轻松的补回OEP,否则大家就象无头的苍蝇到处乱撞,是永远不可能撞到的只有多加分析代码,多加观察代码才会得出我们被抽取的OEP
wesley 发表于 2008-10-9 12:08
来晚了不好意思 下面代码写的有点乱哈 对不住
OD载入在这儿
004070D4 > /EB 01 jmp short UnPackMe.004070D7 //单步F8
004070D6 |68 60E80000 push 0E860
004070DB0000add byte ptr ds:[eax],al
004070DD8B1C24mov ebx,dword ptr ss:[esp]
004070E083C3 12 add ebx,12

来到这里
004070D760pushad
004070D8E8 00000000 call UnPackMe.004070DD //ESP定律不多说了
004070DD8B1C24mov ebx,dword ptr ss:[esp]
004070E083C3 12 add ebx,12
004070E3812B E8B10600 sub dword ptr ds:[ebx],6B1E8
004070E9FE4B FD dec byte ptr ds:[ebx-3]
004070EC822C24 17 sub byte ptr ss:[esp],17
004070F0E6 46 out 46,al
004070F2000Badd byte ptr ds:[ebx],cl
004070F4E4 74 in al,74
004070F69Esahf

ESP定律运行后到了这儿同时删除那个ESP断点
00408CB5F7D2not edx; ntdll.KiFastSystemCallRet
00408CB739C2cmp edx,eax
00408CB9F7C0 74E7F921 test eax,21F9E774
00408CBF0FACC2 48 shrd edx,eax,48
00408CC30FBDC8bsr ecx,eax
00408CC6C7C2 2431C7CD mov edx,CDC73124
00408CCC85C0test eax,eax
00408CCE0FBAEA 31 bts edx,31
00408CD2F7D2not edx
00408CD4F7C1 25C4A65C test ecx,5CA6C425
00408CDA3BD0cmp edx,eax
00408CDC0FABC2bts edx,eax
00408CDFEB 01 jmp short UnPackMe.00408CE2
00408CE1DD???; 未知命令
00408CE20FAFC8imul ecx,eax

以上全是一片花指令 玩过马的都知道 这段花的免杀效果应该不错。。。。。[s:39]
继续走到这里
00408D0955push ebp//貌似是语言的开头代码因为程序有STOLEN CODE看了后面的代码归纳出来的
00408D0AEB 01 jmp short UnPackMe.00408D0D
00408D0C3D 8BECEB01 cmp eax,1EBEC8B
00408D112Fdas
00408D126A FF push -1
00408D14EB 01 jmp short UnPackMe.00408D17
00408D160C 68 or al,68

一直单步 直到
00408D8BFFEBjmp far ebx; 非法使用寄存器
00408D8D0151 FF add dword ptr ds:[ecx-1],edx
00408D9015 8C214000 adc eax,UnPackMe.0040218C
00408D95EB 01 jmp short UnPackMe.00408D98
00408D97A5movs dword ptr es:[edi],dword ptr ds:[esi]
00408D98- E9 AB89FFFF jmp UnPackMe.00401748飞向光明之巅此处跳向OEP 跟入后把代码往上拉 发现偷了N多代码

重新载入程序
再次走到这一步
00408D0955push ebp//貌似是语言的开头代码因为程序有STOLEN CODE看了后面的代码归纳出来的
00408D0AEB 01 jmp short UnPackMe.00408D0D
00408D0C3D 8BECEB01 cmp eax,1EBEC8B
00408D112Fdas
00408D126A FF push -1
00408D14EB 01 jmp short UnPackMe.00408D17
00408D160C 68 or al,68
开始收集STOLEN CODE F7单步就行
00408D0955push ebp

00408D0D8BECmov ebp,esp

00408D126A FF push -1

接着
00408D1768 8890BF01 push 1BF9088
00408D1C812C24 886B7F01 sub dword ptr ss:[esp],17F6B88
00408D2368 ED8824EE push EE2488ED
00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99
00408D2F64:A1 00000000mov eax,dword ptr fs:[0]

这几句是动态解码的代码单步到00408D23 同时观察堆栈窗口
0012FFB800402500UnPackMe.00402500 注意这儿
0012FFBCFFFFFFFF
0012FFC00012FFF0
根据经验 00408D17 这处被偷的代码应为push 00402500
同理00408D23这处的实际代码为push00401886

继续找被偷代码

00408D3850push eax

00408D3C64:8925 00000000mov dword ptr fs:[0],esp

00408D4683EC 68 sub esp,68

00408D4C53push ebx

00408D5056push esi ; kernel32.7C809AC6

00408D5457push edi ; kernel32.7C800065

00408D588965 E8 mov dword ptr ss:[ebp-18],esp

00408D5E33DBxor ebx,ebx

00408D63895D FC mov dword ptr ss:[ebp-4],ebx

00408D696A 02 push 2

00408D6EFF15 90214000 call dword ptr ds:[402190] ; msvcrt.__set_app_type

00408D7759pop ecx

00408D7B830D 2C314000 FFor dword ptr ds:[40312C],FFFFFFFF

00408D85830D 30314000 FFor dword ptr ds:[403130],FFFFFFFF


00408D8FFF15 8C214000 call dword ptr ds:[40218C] ; msvcrt.__p__fmode

OK到这儿全部代码就已经找全了

push ebp
mov ebp,esp
push -1
push 402500
push 401886
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
sub esp,68
push ebx
push esi
push edi
mov dword ptr ss:[ebp-18],esp
xor ebx,ebx
mov dword ptr ss:[ebp-4],ebx
push 2
call dword ptr ds:[402190]
pop ecx
or dword ptr ds:[40312C],FFFFFFFF
or dword ptr ds:[403130],FFFFFFFF
call dword ptr ds:[40218C]


00408D98- E9 AB89FFFF jmp UnPackMe.00401748在这里 飞向光明之巅
进入后往上拉
在00401700 处依次复制以上代码 并在那处新建EIP LORDPE脱了 ImportREC修复 发现IAT全部有效
完成!收工
傻人有傻福 发表于 2008-10-9 13:21
004070D4 > /EB 01 jmp short UnPackMe.004070D7; OD载入到这里
004070D6 |68 60E80000 push 0E860
004070DB0000add byte ptr ds:[eax],al
004070DD8B1C24mov ebx,dword ptr ss:[esp]

F8一下
004070D760pushad ; F8一次来到这里
004070D8E8 00000000 call UnPackMe.004070DD ; ESP定律

SHIFT+F9一下
00408CB5F7D2not edx; ESP定律来到这里
00408CB739C2cmp edx,eax
00408CB9F7C0 74E7F921 test eax,21F9E774
00408CBF0FACC2 48 shrd edx,eax,48
00408CC30FBDC8bsr ecx,eax
00408CC6C7C2 2431C7CD mov edx,CDC73124


接着F8单步一直走 会有一个大跳转直接来到这里(右键分析一下)

004017488B0D 20314000 mov ecx,dword ptr ds:[403120]; 大跳转后来到这里
0040174E8908mov dword ptr ds:[eax],ecx
00401750FF15 88214000 call dword ptr ds:[402188] ; MSVCRT.__p__commode
004017568B0D 1C314000 mov ecx,dword ptr ds:[40311C]
0040175C8908mov dword ptr ds:[eax],ecx
0040175EA1 84214000 mov eax,dword ptr ds:[402184]
004017638B00mov eax,dword ptr ds:[eax]
00401765A3 28314000 mov dword ptr ds:[403128],eax
0040176AE8 16010000 call UnPackMe.00401885
0040176F391D 40304000 cmp dword ptr ds:[403040],ebx
0040177575 0C jnz short UnPackMe.00401783
0040177768 82184000 push UnPackMe.00401882
0040177CFF15 80214000 call dword ptr ds:[402180] ; MSVCRT.__setusermatherr
0040178259pop ecx
00401783E8 E8000000 call UnPackMe.00401870
0040178868 14304000 push UnPackMe.00403014
0040178D68 10304000 push UnPackMe.00403010
00401792E8 D3000000 call UnPackMe.0040186A ; jmp 到 MSVCRT._initterm
00401797A1 18314000 mov eax,dword ptr ds:[403118]

根据脱壳经验,这里应该是程序入口点部分,看代码像是MFC的,但是代码被抽了很多了,找个MFC的程

序来对比一下?其实从ESP定律到程序入口点的地方就是壳放入口点代码的地方了,当你在F8的时候仔细

看一下就可以发现端倪了,我们就从壳处理程序入口把代码给找回来,毕竟找个MFC程序来对比的话抽的

多的就比较不好办了o(∩_∩)o

我们来注意看下从ESP定律到程序入口代码的这部分代码,看看壳做了什么事情
00408CB5F7D2not edx; ESP定律来到这里
00408CB739C2cmp edx,eax
00408CB9F7C0 74E7F921 test eax,21F9E774
00408CBF0FACC2 48 shrd edx,eax,48
00408CC30FBDC8bsr ecx,eax
00408CC6C7C2 2431C7CD mov edx,CDC73124
00408CCC85C0test eax,eax
00408CCE0FBAEA 31 bts edx,31
00408CD2F7D2not edx
00408CD4F7C1 25C4A65C test ecx,5CA6C425
00408CDA3BD0cmp edx,eax
00408CDC0FABC2bts edx,eax
00408CDFEB 01 jmp short UnPackMe.00408CE2

F8一次
00408CE20FAFC8imul ecx,eax
00408CE549dec ecx
00408CE60FCAbswap edx
00408CE8B9 0A07CDFD mov ecx,FDCD070A
00408CED0BC8or ecx,eax
00408CEF31C2xor edx,eax
00408CF18D0D 945D734C lea ecx,dword ptr ds:[4C735D94]
00408CF7D1E9shr ecx,1
00408CF94Adec edx
00408CFABA CD4ABDB3 mov edx,B3BD4ACD
00408CFFD1D9rcr ecx,1
00408D010BD0or edx,eax
00408D03F7C1 2063B688 test ecx,88B66320
00408D0955push ebp ; 这里一行代码
00408D0AEB 01 jmp short UnPackMe.00408D0D

F8一次
00408D0D8BECmov ebp,esp; 这里一行代码
00408D0FEB 01 jmp short UnPackMe.00408D12

F8一次
00408D126A FF push -1; 这里一行代码
00408D14EB 01 jmp short UnPackMe.00408D17

F8一次
00408D1768 8890BF01 push 1BF9088
00408D1C812C24 886B7F01 sub dword ptr ss:[esp],17F6B88 ;这里要注意看堆栈,堆栈里

面保存就是要压栈的数据(我这里是0012FFB8 00402500UnPackMe.00402500)

00408D2368 ED8824EE push EE2488ED
00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99;同样要注意看堆栈,堆栈里

面要保存的就是要压栈的数据(我这里是 0012FFB4 00401886jmp 到 MSVCRT._except_handler3)

00408D2F64:A1 00000000mov eax,dword ptr fs:[0] ;这里一行代码
00408D35EB 01 jmp short UnPackMe.00408D38

F8一次
00408D3850push eax ;这里一行代码
00408D39EB 01 jmp short UnPackMe.00408D3C

F8一次
00408D3C64:8925 0000000>mov dword ptr fs:[0],esp ;这里一行代码
00408D43EB 01 jmp short UnPackMe.00408D46

F8一次
00408D4683EC 68 sub esp,68 ;这里一行代码
00408D49EB 01 jmp short UnPackMe.00408D4C

F8一次
00408D4C53push ebx;这里一行代码
00408D4DEB 01 jmp short UnPackMe.00408D50

F8一次
00408D5056push esi;这里一行代码
00408D51EB 01 jmp short UnPackMe.00408D54

F8一次
00408D5457push edi ; ntdll.7C930738 这里一行

代码
00408D55EB 01 jmp short UnPackMe.00408D58

F8一次
00408D588965 E8 mov dword ptr ss:[ebp-18],esp;这里一行代码
00408D5BEB 01 jmp short UnPackMe.00408D5E

F8一次
00408D5E33DBxor ebx,ebx;这里一行代码
00408D60EB 01 jmp short UnPackMe.00408D63

F8一次
00408D63895D FC mov dword ptr ss:[ebp-4],ebx;这里一行代码
00408D66EB 01 jmp short UnPackMe.00408D69

F8一次
00408D696A 02 push 2;这里一行代码
00408D6BEB 01 jmp short UnPackMe.00408D6E

F8一次
00408D6EFF15 90214000 call dword ptr ds:[402190] ; MSVCRT.__set_app_type

这里也是一行代码
00408D74EB 01 jmp short UnPackMe.00408D77

F8一次
00408D7759pop ecx ;这里一行代码
00408D78EB 01 jmp short UnPackMe.00408D7B

F8一次
00408D7B830D 2C314000 F>or dword ptr ds:[40312C],FFFFFFFF ;这里一行代码
00408D82EB 01 jmp short UnPackMe.00408D85

F8一次
00408D85830D 30314000 F>or dword ptr ds:[403130],FFFFFFFF ;这里一行代码
00408D8CEB 01 jmp short UnPackMe.00408D8F

F8一次
00408D8FFF15 8C214000 call dword ptr ds:[40218C] ; MSVCRT.__p__fmode

这里也是一行代码
00408D95EB 01 jmp short UnPackMe.00408D98

F8一次
00408D98- E9 AB89FFFF jmp UnPackMe.00401748; 跳向程序入口代码


稍微归纳一下:这个壳是把程序入口点的代码放到了壳内来处理,我是怎么发现程序入口点的代码是在
壳内的呢?当ESP定律SHIFT+F9过后,我们不是F8走了很久了吗,其中就是00408D6EFF15 90214000
call dword ptr ds:[402190] ; MSVCRT.__set_app_type
这行代码让我觉得有点奇怪,MSVCRT.__set_app_type这个不是MFC程序入口点的标志性代码吗?怎么会
在这里出现,当到了程序入口点的时候我看到程序被抽了很多代码,我找了一个MFC的程序来看了一下
MSVCRT.__set_app_type和MSVCRT.__p__fmode是程序入口的标志,我从新跟了一遍,发现很多代码都是
这样的
XXXXXXXX
JMP XXXXXXXXX
这样很可能就是壳在处理程序入口点代码 把入口点代码放到了壳里面来处理,不过伪装的不是很高明啊
,当然了MFC程序的入口一般都是这样的
push ebp
mov ebp,esp ;这行代码在这个壳处理的时候也是用了mov ebp,espJMPXXXX这样的形式
所以我们也就知道该从哪里开始了

现在我们把要补的代码先写在一起
push ebp
mov ebp,esp
push -1
push 00402500
push 00401886
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
sub esp,68
push ebx
push esi
push edi
mov dword ptr ss:[ebp-18],esp
xor ebx,ebx
mov dword ptr ss:[ebp-4],ebx
push 2
call dword ptr ds:[402190]
pop ecx
or dword ptr ds:[40312C],FFFFFFFF
or dword ptr ds:[403130],FFFFFFFF
call dword ptr ds:[40218C]

我们把以上的代码补到程序入口点前面,在补回来的OEP右键 此处新建EIP用LORDPE把程序DUMP出来,

IMPORTREC修复一下 指针全部有效 转储修复一下 可以运行
小糊涂虫 发表于 2008-10-9 17:07
00408CB5F7D2 not edx; ntdll.KiFastSystemCallRet
00408CB739C2 cmp edx,eax
00408CB9F7C0 74E7F921test eax,21F9E774
00408CBF0FACC2 48shrd edx,eax,48
00408CC30FBDC8 bsr ecx,eax
00408CC6C7C2 2431C7CDmov edx,CDC73124
00408CCC85C0 test eax,eax
00408CCE0FBAEA 31bts edx,31

来到这里....前面步骤省了.......都是以前老思路...
00408D03F7C1 2063B688test ecx,88B66320
00408D0955 push ebp这里是第一句.....
00408D0AEB 01jmp short UnPackMe.00408D0D

00408D0D8BEC mov ebp,esp这里第二句..
00408D0FEB 01jmp short UnPackMe.00408D12
00408D112F das
00408D126A FFpush -1 第三句.....
00408D14EB 01jmp short UnPackMe.00408D17

00408D1768 8890BF01push 1BF9088 到这里后,要留意一下.......我当时也没看......问题就出现在PUSH上.....
00408D1C812C24 886B7F0>sub dword ptr ss:[esp],17F6B88
00408D2368 ED8824EEpush EE2488ED
00408D28810424 998F1B1>add dword ptr ss:[esp],121B8F99 实际上留意一下堆栈也会发现.....(当然用前几期脱壳
后的对比一下更容易发现的[s:40]...)
00408D2F64:A1 00000000 mov eax,dword ptr fs:[0]

堆栈内容如下:
0013FFB400401886 jmp 到☆ ☆ ☆ ☆
0013FFB800402500 UnPackMe.00402500☆ ☆ ☆ ☆
0013FFBCFFFFFFFF

下面用同样的方法找..............................

将所有代码复制下来(以下为二进制代码).....
55 8B EC 6A FF 68 00 25 40 00 68 86 18 40 00 64
A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 68
53 56 57 89 65 E8 33 DB 89 5D FC 6A 02 FF 15 90
21 40 00 59 83 0D 2C 31 40 00 FF 83 0D 30 31 40
00 FF FF 15 8C 21 40 00

然后来到
004017460000 add byte ptr ds:[eax],al
004017488B0D 20314000mov ecx,dword ptr ds:[403120]; (初始化 cpu 选择状态)
0040174E8908 mov dword ptr ds:[eax],ecx

向上找到00401700把那些代码全部粘贴上去.....在此处新建个EIP....
然后脱壳....修复,,全部有效,OK.....................

最后说明一下..............
幸得 小生师傅 的指点.才得已脱掉此壳...罪过 罪过
同时也要感谢52POJIE这个论坛,在这里我学到了很多...........................
pcfans 发表于 2008-10-9 17:14
脱壳过程

脱壳方法:esp定律+内存镜象
OD载入
004070D4 > /EB 01 jmp short 004070D7;载入后停在这里,单步f8两次
004070D6 |68 60E80000 push0E860
004070DB0000add byte ptr [eax], al
004070DD8B1C24mov ebx, dword ptr [esp]
004070E083C3 12 add ebx, 12
004070E3812B E8B10600 sub dword ptr [ebx], 6B1E8
004070E9FE4B FD dec byte ptr [ebx-3]

------------------------------

004070D760pushad
004070D8E8 00000000 call004070DD ;单步f8两次后停在这里,用esp定律
004070DD8B1C24mov ebx, dword ptr [esp]
004070E083C3 12 add ebx, 12
004070E3812B E8B10600 sub dword ptr [ebx], 6B1E8
004070E9FE4B FD dec byte ptr [ebx-3]
004070EC822C24 17 sub byte ptr [esp], 17
------------------------------

shift+f9后来到这里

00408CB5F7D2not edx ; esp定律后停在这里
00408CB739C2cmp edx, eax
00408CB9F7C0 74E7F921 testeax, 21F9E774
00408CBF0FACC2 48 shrdedx, eax, 48
00408CC30FBDC8bsr ecx, eax
00408CC6C7C2 2431C7CD mov edx, CDC73124
00408CCC85C0testeax, eax
------------------------------
esp定律断下后,alt+m 在00401000断下f2断点f9运行

004017488B0D 20314000 mov ecx, dword ptr [403120] ; 内存镜象后停在这里,向上翻看
0040174E8908mov dword ptr [eax], ecx
00401750FF15 88214000 calldword ptr [402188] ; msvcrt.__p__commode
004017568B0D 1C314000 mov ecx, dword ptr [40311C]
0040175C8908mov dword ptr [eax], ecx
0040175EA1 84214000 mov eax, dword ptr [402184]
------------------------------
向上翻看发现大量的空字节,这些代码被抽取了
004016FECCint3
004016FFCCint3
004017000000add byte ptr [eax], al
004017020000add byte ptr [eax], al
004017040000add byte ptr [eax], al
004017060000add byte ptr [eax], al
004017080000add byte ptr [eax], al
0040170A0000add byte ptr [eax], al
0040170C0000add byte ptr [eax], al
0040170E0000add byte ptr [eax], al
004017100000add byte ptr [eax], al
004017120000add byte ptr [eax], al
004017140000add byte ptr [eax], al
004017160000add byte ptr [eax], al
004017180000add byte ptr [eax], al
0040171A0000add byte ptr [eax], al
0040171C0000add byte ptr [eax], al
0040171E0000add byte ptr [eax], al
004017200000add byte ptr [eax], al
004017220000add byte ptr [eax], al
004017240000add byte ptr [eax], al
004017260000add byte ptr [eax], al
004017280000add byte ptr [eax], al
0040172A0000add byte ptr [eax], al
0040172C0000add byte ptr [eax], al
0040172E0000add byte ptr [eax], al
004017300000add byte ptr [eax], al
004017320000add byte ptr [eax], al
004017340000add byte ptr [eax], al
004017360000add byte ptr [eax], al
004017380000add byte ptr [eax], al
0040173A0000add byte ptr [eax], al
0040173C0000add byte ptr [eax], al
0040173E0000add byte ptr [eax], al
004017400000add byte ptr [eax], al
004017420000add byte ptr [eax], al
004017440000add byte ptr [eax], al
004017460000add byte ptr [eax], al
004017488B0D 20314000 mov ecx, dword ptr [403120] ; 这里是被STOLEN CODE后的伪OEP
0040174E8908mov dword ptr [eax], ecx
00401750FF15 88214000 calldword ptr [402188] ; msvcrt.__p__commode
004017568B0D 1C314000 mov ecx, dword ptr [40311C]
0040175C8908mov dword ptr [eax], ecx

--------------------------------
看寄存器显示的函数是vc的函数,可以断定是个vc++的程序

EAX 77C3185C offset msvcrt._fmode;这里显示了是vc的程序
ECX 00000002
EDX B3BD4ACD
EBX 00000000
ESP 0012FF3C
EBP 0012FFC0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 00401748 UnPackMe.00401748
--------------------------------
我们寻找一个vc++的程序来对比下vc++程序的入口吧,随手找了个vc++写的《PYG破解计算器》的程序看看OEP的样子

,留做寻找偷窃代码比较之用。

00403831 >/$55pushebp;破解计算器的程序入口特征
00403832|.8BECmov ebp, esp
00403834|.6A FF push-1
00403836|.68 F0624000 push004062F0
0040383B|.68 A44C4000 push00404CA4 ;SE 处理程序安装
00403840|.64:A1 0000000>mov eax, dword ptr fs:[0]
00403846|.50pusheax
00403847|.64:8925 00000>mov dword ptr fs:[0], esp
0040384E|.83EC 58 sub esp, 58
00403851|.53pushebx
00403852|.56pushesi
00403853|.57pushedi
00403854|.8965 E8 mov dword ptr [ebp-18], esp
00403857|.FF15 48604000 calldword ptr [<&KERNEL32.GetVersion>;kernel32.GetVersion
0040385D|.33D2xor edx, edx
0040385F|.8AD4mov dl, ah
00403861|.8915 6C8A4000 mov dword ptr [408A6C], edx
00403867|.8BC8mov ecx, eax
00403869|.81E1 FF000000 and ecx, 0FF
0040386F|.890D 688A4000 mov dword ptr [408A68], ecx
00403875|.C1E1 08 shl ecx, 8
00403878|.03CAadd ecx, edx

-----------------------------------------


下面我们试试寻找被偷窃的代码,ctrl+f2重新载入程序,esp定律断下后,我们f8单步跟踪来分析代码

00408CB461popad
00408CB5F7D2not edx ; esp定律后停在这里了,f8跟
00408CB739C2cmp edx, eax
00408CB9F7C0 74E7F921 testeax, 21F9E774
00408CBF0FACC2 48 shrdedx, eax, 48
00408CC30FBDC8bsr ecx, eax
00408CC6C7C2 2431C7CD mov edx, CDC73124
00408CCC85C0testeax, eax
00408CCE0FBAEA 31 bts edx, 31
00408CD2F7D2not edx
00408CD4F7C1 25C4A65C testecx, 5CA6C425
00408CDA3BD0cmp edx, eax
00408CDC0FABC2bts edx, eax
00408CDFEB 01 jmp short 00408CE2
00408CE1DD???; 未知命令
00408CE20FAFC8imulecx, eax
00408CE549dec ecx
00408CE60FCAbswap edx
00408CE8B9 0A07CDFD mov ecx, FDCD070A
00408CED0BC8orecx, eax
00408CEF31C2xor edx, eax
00408CF18D0D 945D734C lea ecx, dword ptr [4C735D94]
00408CF7D1E9shr ecx, 1
00408CF94Adec edx
00408CFABA CD4ABDB3 mov edx, B3BD4ACD
00408CFFD1D9rcr ecx, 1
00408D010BD0oredx, eax
00408D03F7C1 2063B688 testecx, 88B66320
00408D0955pushebp ;程序来到这里发现了我们被偷的第一句代码
00408D0AEB 01 jmp short 00408D0D;下面这一系列的jmp就是对偷窃的代码进行解码
00408D0C3D 8BECEB01 cmp eax, 1EBEC8B
00408D112Fdas
00408D126A FF push-1;
00408D14EB 01 jmp short 00408D17
00408D160C 68 oral, 68
00408D188890 BF01812C mov byte ptr [eax+2C8101BF], dl
00408D1E24 88 and al, 88
00408D206B7F 01 68imuledi, dword ptr [edi+1], 68
00408D24EDineax, dx
00408D258824EEmov byte ptr [esi+ebp*8], ah
00408D28810424 998F1B12 add dword ptr [esp], 121B8F99
00408D2F64:A1 00000000mov eax, dword ptr fs:[0]
00408D35EB 01 jmp short 00408D38
00408D37CEinto
00408D3850pusheax
00408D39EB 01 jmp short 00408D3C
00408D3B4Cdec esp
00408D3C64:8925 0000000>mov dword ptr fs:[0], esp
00408D43EB 01 jmp short 00408D46
00408D45CD 83 int 83
00408D47ECinal, dx
00408D4868 EB01EA53 push53EA01EB
00408D4DEB 01 jmp short 00408D50
00408D4F26:56 pushesi
00408D51EB 01 jmp short 00408D54
00408D53E6 57 out 57, al
00408D55EB 01 jmp short 00408D58
00408D57B8 8965E8EB mov eax, EBE86589
00408D5C0125 33DBEB01 add dword ptr [1EBDB33], esp
00408D62ADlodsdword ptr [esi]
00408D63895D FC mov dword ptr [ebp-4], ebx
00408D66EB 01 jmp short 00408D69
00408D6824 6A and al, 6A
00408D6A02EBadd ch, bl
00408D6C0134FFadd dword ptr [edi+edi*8], esi
00408D6F15 90214000 adc eax, 00402190
00408D74EB 01 jmp short 00408D77
00408D76B2 59 mov dl, 59
00408D78EB 01 jmp short 00408D7B
00408D7AC8 830D2C enter 0D83, 2C
00408D7E3140 00 xor dword ptr [eax], eax
00408D81FFEBjmp far ebx; 非法使用寄存器
00408D83013C83add dword ptr [ebx+eax*4], edi
00408D860D 30314000 oreax, 403130
00408D8BFFEBjmp far ebx; 非法使用寄存器
00408D8D0151 FF add dword ptr [ecx-1], edx
00408D9015 8C214000 adc eax, 0040218C
00408D95EB 01 jmp short 00408D98 ;这是解码后的最后一个jmp了,它jmp到那个跳往

oep的地址了
00408D97A5movsdword ptr es:[edi], dword ptr [e>
00408D98- E9 AB89FFFF jmp 00401748 ;到这里一个远跳,就跳到刚找到的伪OEP了

-------------------------------------

偷窃的代码,就是从上面的第一句,将每次jmp后所跳到的位置的代码都复制出来就是被偷窃的代码了,复制如下:

00408D0955pushebp
00408D0D8BECmov ebp, esp
00408D126A FF push-1

00408D1768 8890BF01 push1BF9088
00408D1C812C24 886B7F01 sub dword ptr [esp], 17F6B88
00408D2368 ED8824EE pushEE2488ED
00408D28810424 998F1B12 add dword ptr [esp], 121B8F99
00408D2F64:A1 00000000mov eax, dword ptr fs:[0]

00408D3850pusheax
00408D3C64:8925 0000000>mov dword ptr fs:[0], esp
00408D4683EC 68 sub esp, 68
00408D4C53pushebx
00408D5056pushesi
00408D5457pushedi; ntdll.7C930738
00408D588965 E8 mov dword ptr [ebp-18], esp
00408D5E33DBxor ebx, ebx
00408D63895D FC mov dword ptr [ebp-4], ebx
00408D696A 02 push2
00408D6EFF15 90214000 calldword ptr [402190] ; msvcrt.__set_app_type
00408D7759pop ecx
00408D7B830D 2C314000 F>ordword ptr [40312C], FFFFFFFF
00408D85830D 30314000 F>ordword ptr [403130], FFFFFFFF
00408D8FFF15 8C214000 calldword ptr [40218C] ; msvcrt.__p__fmode
-----------------------------------
好了上面的代码复制完了,和我们刚才找的程序对比一下,这时发现00408D17到00408D28压栈的地址还没解码,如何

寻找这两句就是完整找回偷窃代码的关键了
-----------------------------------
两句的解码方法

第一句:
00408D1768 8890BF01 push1BF9088;程序将1BF9088值压入堆栈
00408D1C812C24 886B7F01 sub dword ptr [esp], 17F6B88;运行到这里将刚压入堆栈中的值减去

17F6B88这个值并放回堆栈中,这时堆栈窗中观察0012FFB8 1BF9088运算后变成了0012FFB8 00402500

UnPackMe.00402500,这时观察堆栈窗口中的00402500就是这句解码出来的真正要压入堆栈中的值,那么这句被偷的

代码我们就得到了:push 00402500
----------------
第二句:
00408D2368 ED8824EE pushEE2488ED ;方法和上面类似,程序将EE2488ED值压入堆栈
00408D28810424 998F1B12 add dword ptr [esp], 121B8F99 ;这里是将堆栈中的值加上121B8F99后再放会

堆栈,堆栈窗中的值的变化:
由0012FFB4 EE2488ED
变成0012FFB4 00401886jmp 到 msvcrt._except_handler3

这样我们就得到了解码后的第二句了:push 00401886

---------------------------------------

整理后的代码:

pushebp
mov ebp, esp
push-1
push 00402500
push 00401886
mov eax, dword ptr fs:[0]
pusheax
mov dword ptr fs:[0], esp
sub esp, 68
pushebx
pushesi
pushedi
mov dword ptr [ebp-18], esp
xor ebx, ebx
mov dword ptr [ebp-4], ebx
push2
calldword ptr [402190]
pop ecx
dword ptr [40312C], FFFFFFFF
dword ptr [403130], FFFFFFFF
calldword ptr [40218C]

-----------------------------
根据代码长度从
004017000000add byte ptr [eax], al
处开始修复回去,并且长度正好,此时我们在00401700处新建EIP

-----------------------------
下面就要开始脱壳了,LodePE脱壳,ImportREC载入修复,所有指针有效,抓取程序,运行成功,查壳为Microsoft

Visual C++ 6.0


总结下,此壳共偷取了72个字节的代码,此次脱壳虽然将偷窃代码全部找回修补成功,脱壳后程序能够运行,但是点

击按钮确无法连上网站,估计程序还有暗桩未完全修复,先交作业先,再检查到底是哪里出错了。
下雪天 发表于 2008-10-9 17:39
【文章标题】: 52破解UnPackMe第10期脱壳练习
【文章作者】: 小小菜鸟
【软件名称】: UnPackMe第10期
【下载地址】: 自己搜索下载
【保护方式】: PESpin 0.3x - 1.xx -> cyberbob
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
脱这个壳到伪OEP其实是很简单的
只是修复被偷的代码实在是太疲劳了
看脱文
首先说明下怎么到伪OEP

开OD停到这里
004070D4 > /EB 01jmp short UnPackMe.004070D7
004070D6 |68 60E80000push 0E860
004070DB0000 add byte ptr ds:[eax],al
004070DD8B1C24 mov ebx,dword ptr ss:[esp]
直接运行后出异常知道有SEH暗桩了

调试设置中设置
不忽略内存访问异常 其他都忽略
执行第一句
JMP到这里

004070D760 pushad
004070D8E8 00000000call UnPackMe.004070DD--------ESP定律 下硬件访问断点DW
004070DD8B1C24 mov ebx,dword ptr ss:[esp]

然后就是过异常了经过
四次的shift+f9之后到这里

00408CB5F7D2 not edx--------取消硬件断点 ---停在硬件断点这里 ; ntdll.KiFastSystemCallRet
00408CB739C2 cmp edx,eax
00408CB9F7C0 74E7F921test eax,21F9E774
00408CBF0FACC2 48shrd edx,eax,48
00408CC30FBDC8 bsr ecx,eax
00408CC6C7C2 2431C7CDmov edx,CDC73124

然后ALT+m
然后在 地址=401000大小=1000CODE段 下F2断点 SHIFT+F9 运行就到了

004017488B0D 20314000mov ecx,dword ptr ds:[403120]---------很古怪的入口----下面的提示是C++的程序
0040174E8908 mov dword ptr ds:[eax],ecx
00401750FF15 88214000call dword ptr ds:[402188] ; msvcrt.__p__commode
004017568B0D 1C314000mov ecx,dword ptr ds:[40311C]
向上面 一看就明白了
代码被偷了
004016FFCC int3
004017000000 add byte ptr ds:[eax],al----------本来的OEP
004017020000 add byte ptr ds:[eax],al
004017040000 add byte ptr ds:[eax],al

下面我们处理这个被偷的代码----------老大好厉害 抽了这么多 。。。害的我不得不找一个脱壳过的C++的程序对照。。。
代码被偷了一大半。。。
重新开始 找偷的代码
调试设置中设置
不忽略内存访问异常 其他都忽略JMP到这里

004070D760 pushad
004070D8E8 00000000call UnPackMe.004070DD--------ESP定律 下硬件访问断点DW
004070DD8B1C24 mov ebx,dword ptr ss:[esp]

然后就是过异常了经过
四次的shift+f9之后到这里-----单步在这里找偷换的代码。。。

00408CB5F7D2 not edx--------取消硬件断点; ntdll.KiFastSystemCallRet
00408CB739C2 cmp edx,eax
00408CB9F7C0 74E7F921test eax,21F9E774
00408CBF0FACC2 48shrd edx,eax,48
00408CC30FBDC8 bsr ecx,eax
00408CC6C7C2 2431C7CDmov edx,CDC73124
一直单步直到发现目标
第一句 在这里
00408D0955 push ebp---------------1 找到组织了 不过下面就是跳
00408D0AEB 01jmp short UnPackMe.00408D0D
00408D0C3D 8BECEB01cmp eax,1EBEC8B
00408D112F das
00408D126A FFpush -1

然后在N多 跳转中找到了 失落的代码。。。。
00408D0D8BEC mov ebp,esp--------2
00408D0FEB 01jmp short UnPackMe.00408D12

00408D126A FFpush -1----------------3
00408D14EB 01jmp short UnPackMe.00408D17

一直在这里寻找 顺便参考一下 c++的OEP的代码----被抽的太厉害了 。。。。
然后把所有的抽取代码都找到
00408D0955 push ebp---------------------1
00408D0AEB 01jmp short UnPackMe.00408D0D

00408D0D8BEC mov ebp,esp-------------------------2
00408D0FEB 01jmp short UnPackMe.00408D12

00408D126A FFpush -1-----------------------3
00408D14EB 01jmp short UnPackMe.00408D17

00408D1768 8890BF01push 1BF9088---------------------4被VM了要分析下具体地址
00408D1C812C24 886B7F01sub dword ptr ss:[esp],17F6B88
00408D2368 ED8824EEpush EE2488ED---------------------5被VM了要分析下具体地址




00408D28810424 998F1B12add dword ptr ss:[esp],121B8F99
00408D2F64:A1 00000000 mov eax,dword ptr fs:[0]------6

00408D3850 push eax--------------7



00408D39EB 01jmp short UnPackMe.00408D3C

00408D3C64:8925 00000000 mov dword ptr fs:[0],esp------8
00408D43EB 01jmp short UnPackMe.00408D46


00408D4683EC 68sub esp,68-----------9
00408D49EB 01jmp short UnPackMe.00408D4C

00408D4C53 push ebx-----------10
00408D4DEB 01jmp short UnPackMe.00408D50
00408D4F26:56push esi------------------11

00408D5457 push edi-------------12
00408D55EB 01jmp short UnPackMe.00408D58

00408D588965 E8mov dword ptr ss:[ebp-18],esp---------13
00408D5BEB 01jmp short UnPackMe.00408D5E

00408D5E33DB xor ebx,ebx---------14
00408D60EB 01jmp short UnPackMe.00408D63

00408D63895D FCmov dword ptr ss:[ebp-4],ebx---------15
00408D66EB 01jmp short UnPackMe.00408D69

00408D696A 02push 2------------16
00408D6BEB 01jmp short UnPackMe.00408D6E

00408D6EFF15 90214000call dword ptr ds:[402190]-------17 ; msvcrt.__set_app_type
00408D74EB 01jmp short UnPackMe.00408D77
00408D76B2 59mov dl,59

00408D7759 pop ecx-------18
00408D78EB 01jmp short UnPackMe.00408D7B
00408D7AC8 830D2Center 0D83,2C

00408D7B830D 2C314000 FF or dword ptr ds:[40312C],FFFFFFFF------------19
00408D82EB 01jmp short UnPackMe.00408D85

00408D85830D 30314000 FF or dword ptr ds:[403130],FFFFFFFF---------20
00408D8CEB 01jmp short UnPackMe.00408D8F

00408D8FFF15 8C214000call dword ptr ds:[40218C]----------21 ; msvcrt.__p__fmode
00408D95EB 01jmp short UnPackMe.00408D98
00408D97A5 movs dword ptr es:[edi],dword ptr ds:[>


00408D1768 8890BF01 push 1BF9088
00408D1C812C24 886B7F01 sub dword ptr ss:[esp],17F6B88----------1
00408D2368 ED8824EE push EE2488ED---------2 此时 得到第一个压入的地址看堆栈
0012FFB8 00402500UnPackMe.00402500



00408D2368 ED8824EE push EE2488ED
00408D28810424 998F1B12 add dword ptr ss:[esp],121B8F99------1
00408D2F64:A1 00000000mov eax,dword ptr fs:[0]-------2 此时得到第二个压入堆栈的地址看堆栈
0012FFB4 00401886jmp to msvcrt._except_handler3


4修改为

push 00402500
5修改为

push 00401886


00408D0955 push ebp
00408D0D8BEC movebp,esp
00408D126A FFpush -1
00408D1768 8890BF01push 00402500
00408D2368 ED8824EEpush 00401886
00408D2F64:A1 00000000 mov eax,dword ptr fs:[0]
00408D3850 push eax
00408D3C64:8925 00000000 mov dword ptr fs:[0],esp
00408D4683EC 68sub esp,68
00408D4C53 push ebx
00408D5056 push esi
00408D5457 push edi ; ntdll.7C930738
00408D588965 E8mov dword ptr ss:[ebp-18],esp
00408D5E33DB xor ebx,ebx
00408D63895D FCmov dword ptr ss:[ebp-4],ebx
00408D696A 02push 2
00408D6EFF15 90214000call dword ptr ds:[402190] ; msvcrt.__set_app_type
00408D7759 pop ecx
00408D7B830D 2C314000 FF or dword ptr ds:[40312C],FFFFFFFF
00408D85830D 30314000 FF or dword ptr ds:[403130],FFFFFFFF
00408D8FFF15 8C214000call dword ptr ds:[40218C] ; msvcrt.__p__fmode

然后JMP到 伪oep-------------------------把代码都填充到 上面的000000处
004017488B0D 20314000mov ecx,dword ptr ds:[403120]
0040174E8908 mov dword ptr ds:[eax],ecx
00401750FF15 88214000call dword ptr ds:[402188] ; msvcrt.__p__commode
---把代码都填充到 上面的000000处
004016FFCC int3
004017000000 add byte ptr ds:[eax],al--------从这里开始
004017020000 add byte ptr ds:[eax],al
004017040000 add byte ptr ds:[eax],al
004017060000 add byte ptr ds:[eax],al

填好了 就新建eip 然后就DUMP和修复IAT这里多说几句直接自动获取IAT就可以了(TAI的表实在很少 ,本来填了大小是1000然后等级一修复后不能运行,所以得出结论 ,只要自动抓取输入表就好了) 不用管其他的
然后修复好了 就能运行了。。。。













--------------------------------------------------------------------------------
【经验总结】
代码被抽的严重 但是只要仔细的对照依然可以重新找回来

--------------------------------------------------------------------------------
【版权声明】: 本文原创于小小菜鸟,小生我怕怕友情支持, 转载请注明作者并保持文章的完整, 谢谢!

2008年10月09日 17:21:36


http://www.禁止使用网挣网盘/spac ... dumpeddd_.rar/.page

http://www.禁止使用网挣网盘/spac ... %E1%C6%AA.rar/.page

终于O了很开心
nv21 发表于 2008-10-9 18:00
首行OD载入 F8两次 ESP定律 SHIFT+F9运行

00408CB5F7D2not edx; ntdll.KiFastSystemCallRet
00408CB739C2cmp edx,eax
00408CB9F7C0 74E7F921 test eax,21F9E774
00408CBF0FACC2 48 shrd edx,eax,48
00408CC30FBDC8bsr ecx,eax
00408CC6C7C2 2431C7CD mov edx,CDC73124
00408CCC85C0test eax,eax
00408CCE0FBAEA 31 bts edx,31
00408CD2F7D2not edx
00408CD4F7C1 25C4A65C test ecx,5CA6C425
00408CDA3BD0cmp edx,eax
00408CDC0FABC2bts edx,eax

然后打开内存境像 在代码段下断点Memory map, 项目 23
地址=00401000
大小=00001000 (4096.)
属主=UnPackMe 00400000
区段=
包含=代码
类型=映像 01001040
访问=RWE
初始访问=RWE
SHIFT+F9运行到达假OEP
00401748 .8B0D 20314000 mov ecx,dword ptr ds:[403120]
0040174E .8908mov dword ptr ds:[eax],ecx
00401750 .FF15 88214000 call dword ptr ds:[402188] ;msvcrt.__p__commode
00401756 .8B0D 1C314000 mov ecx,dword ptr ds:[40311C]
0040175C .8908mov dword ptr ds:[eax],ecx
0040175E .A1 84214000 mov eax,dword ptr ds:[402184]
00401763 .8B00mov eax,dword ptr ds:[eax]
00401765 .A3 28314000 mov dword ptr ds:[403128],eax
0040176A .E8 16010000 call UnPackMe.00401885

这里明显是被抽取代码的所以下一步找 Stolen code
重载 ESP 定律 来到
00408CB5F7D2not edx; ntdll.KiFastSystemCallRet
00408CB739C2cmp edx,eax
00408CB9F7C0 74E7F921 test eax,21F9E774
00408CBF0FACC2 48 shrd edx,eax,48
00408CC30FBDC8bsr ecx,eax
00408CC6C7C2 2431C7CD mov edx,CDC73124
00408CCC85C0test eax,eax
00408CCE0FBAEA 31 bts edx,31
00408CD2F7D2not edx
00408CD4F7C1 25C4A65C test ecx,5CA6C425
00408CDA3BD0cmp edx,eax
00408CDC0FABC2bts edx,eax
然后F8单步 到
00408D0955push ebp
00408D0AEB 01 jmp short UnPackMe.00408D0D
00408D0C3D 8BECEB01 cmp eax,1EBEC8B
00408D112Fdas
这里开始F7

00408D0955push ebp -----------------这是第一句被抽取的代码
接下来继续行下找就可以找每一句被抽取的代码找到
看到JMP F7进入里面的代码为stolen code
找到被抽取的代码为
00408D0955 push ebp
00408D0D8BEC mov ebp,esp
00408D126A FFpush -1
----------------------------------下面四句有异常 分析
00408D1768 8890BF01push 1BF9088
00408D1C812C24 886B7F01sub dword ptr ss:[esp],17F6B88---------这两句等于PUSH4025000 修改后程序默认为PUSH 00402500

00408D2368 ED8824EEpush EE2488ED
00408D28810424 998F1B12add dword ptr ss:[esp],121B8F99---------这两句等于PHSH 1004001886
同样 程序默认为PUSH 00401886
-----------------------------------------------------------------------------------
00408D2F64:A1 00000000 mov eax,dword ptr fs:[0]
00408D3850 push eax
00408D3C64:8925 00000000 mov dword ptr fs:[0],esp
00408D4683EC 68sub esp,68
00408D4C53 push ebx
00408D5056 push esi
00408D5457 push edi ; ntdll.7C930738
00408D588965 E8mov dword ptr ss:[ebp-18],esp
00408D5E33DB xor ebx,ebx
00408D63895D FCmov dword ptr ss:[ebp-4],ebx
00408D696A 02push 2
00408D6EFF15 90214000call dword ptr ds:[402190] ; msvcrt.__set_app_type
00408D7759 pop ecx
00408D7B830D 2C314000 FF or dword ptr ds:[40312C],FFFFFFFF
00408D85830D 30314000 FF or dword ptr ds:[403130],FFFFFFFF
00408D8FFF15 8C214000call dword ptr ds:[40218C] ; msvcrt.__p__fmode
经过分析得出代码为
55 8B EC 6A FF 68 00 25 40 00 68 86 18 40 00 64:A1 00 00 00 00 50 64:89 25 00 00 00 00
83 EC 68 53 56 57 89 65 E8 33 DB 89 5D FC 6A 02 FF 15 90 21 40 00 59 83 0D 2C 31 40 00 FF
83 0D 30 31 40 00 FF FF 15 8C 21 40 00


然后 F8几次到OEP
在上面的O区二进制粘贴这些代码
然后在下面的地址新建EIP
0040170055push ebp
004017018BECmov ebp,esp
004017036A FF push -1
0040170568 00254000 push UnPackMe.00402500
0040170A68 86184000 push UnPackMe.00401886 ;jmp 到 msvcrt._except_handler3
0040170F64:A1 0000000>mov eax,dword ptr fs:[0]
0040171550push eax
0040171664:8925 00000>mov dword ptr fs:[0],esp
0040171D83EC 68 sub esp,68
0040172053push ebx
0040172156push esi
0040172257push edi
004017238965 E8 mov dword ptr ss:[ebp-18],esp
0040172633DBxor ebx,ebx
00401728895D FC mov dword ptr ss:[ebp-4],ebx
0040172B6A 02 push 2
0040172DFF15 90214000 call dword ptr ds:[402190] ;msvcrt.__set_app_type
0040173359pop ecx
00401734830D 2C314000>or dword ptr ds:[40312C],FFFFFFFF
0040173B830D 30314000>or dword ptr ds:[403130],FFFFFFFF
00401742FF15 8C214000 call dword ptr ds:[40218C] ;msvcrt.__p__fmode
00401748 .8B0D 20314000 mov ecx,dword ptr ds:[403120]


然后就LORDPE 脱壳
无法运行
然后就REC修复 直接抓取 脱壳程序 脱壳结束
unpack 发表于 2008-10-9 21:30
说明:此方法只是我的一次费时的寻找OEP的方法,只是开始的一个想法,因为开始用ESP定律的时候犯错了,直接F9了,忘了还有运行的方法,所以此种方法贴出来也就这样了,具体方法看第二种方法,而且这种方法找偷取的代码很麻烦!
首先,打开OD,设置出来不忽略 非法访问异常和 指定的异常或范围,其余的都忽略,即其余的都勾上!

OD载入程序,然后 shift+f9运行,我们看堆栈:

第一次,堆栈情形是:
0012FF9C 0012FFE0指向下一个 SEH 记录的指针0012FFA0 0040764DSE处理程序0012FFA4 000000000012FFA8 77D1EA8D返回到 USER32.77D1EA8D 来自 USER32.77D185F0
第二次:
0012FBCC 7C9237BF返回到 ntdll.7C9237BF0012FBD0 0012FCB40012FBD4 0012FF940012FBD8 0012FCC80012FBDC 0012FC880012FBE0 0012FF94指向下一个 SEH 记录的指针0012FBE4 7C9237D8SE处理程序
第三次:
0012FF98 0012FFE0指向下一个 SEH 记录的指针0012FF9C 00407863SE处理程序0012FFA0 00003CAE0012FFA4 00000000
如果在SHIFT+F9程序就会跑飞!
此时,cpu窗口显示停在
00407C008918mov [eax], ebx ; //三次SHIFT+F9后停在这儿00407C02E9 2E170000 jmp 0040933500407C07EB 01 jmp short 00407C0A00407C0968 69D90220 push2002D96900407C0E1Epushds00407C0F00F7add bh, dh00407C11F0:64:8F00lock pop dword ptr fs:[eax]; 不允许锁定前缀


然后我们在
0012FF9C 00407863SE处理程序
上右键----数据窗口跟随

数据窗口显示:
004078630424448B//我们在这句上右键 -----断点 ------硬件执行(下内存访问断点也行,只是不知道它们的区别)004078670C244C8B0040786B5B35008B
我们在00407863这句下完硬件断点后,shift+f9运行,来到下面的地方

004078638B4424 04 mov eax, [esp+4] ; //下完硬件断点,shift+f9来到这儿004078678B4C24 0C mov ecx, [esp+C] ; //取消硬件断点,F8单步0040786B8B00mov eax, [eax]0040786D35 5B011238 xor eax, 3812015B004078723D 5E0112F8 cmp eax, F812015E0040787775 0F jnz short 00407888004078798181 B8000000 8>add dword ptr [ecx+B8], 218F00407883EB 27 jmp short 004078AC00407885EB 01 jmp short 0040788800407887FF3D???; 未知命令0040788946inc esi0040788A0112add [edx], edx0040788CF8clc0040788D75 0C jnz short 0040789B0040788F8181 B8000000 7>add dword ptr [ecx+B8], 17200407899EB 11 jmp short 004078AC0040789B3D CF0112F8 cmp eax, F81201CF004078A075 0A jnz short 004078AC004078A28181 B8000000 0>add dword ptr [ecx+B8], 1D0B004078AC33C0xor eax, eax ; //单步到这儿的时候,会进入系统领空,进入后,我们打开内存004078AEC3retn ; //然后在0040100上下断点F2,然后在SHIFT+F9运行

这个RETN后会进入系统领空
7C9237BF64:8B25 0000000>mov esp, fs:[0]; //到了系统领空,我们不要怕,打开内存ALT+M7C9237C664:8F05 0000000>pop dword ptr fs:[0]7C9237CD8BE5mov esp, ebp7C9237CF5Dpop ebp7C9237D0C2 1400 retn14
我们打开内存alt+m,然后在0040100下F2断点
Memory map, 条目 23 地址=00401000 大小=00001000 (4096.) 属主=UnPackMe 00400000 区段= 包含=代码 类型=Imag 01001002 访问=R 初始访问=RWE

下完断点后,我们SHIFT+F9运行,接着会来到下面的地方
00409D638A0439mov al, [ecx+edi]; //此时来到这儿00409D6632D0xor dl, al00409D68B0 06 mov al, 600409D6AD1EAshr edx, 100409D6C72 06 jbshort 00409D7400409D6E81F2 20292D3A xor edx, 3A2D292000409D740FBAE2 08 btedx, 800409D7873 03 jnb short 00409D7D00409D7A80E6 FE and dh, 0FE00409D7DFEC8dec al00409D7F^ 75 E9 jnz short 00409D6A00409D8149dec ecx; //F400409D82^ 75 DF jnz short 00409D6300409D8492xchgeax, edx ; //F400409D855Apop edx00409D868D6424 04 lea esp, [esp+4] ;//下面跳向00407c99,跳度还挺大的,所以要让他跳00409D8AFF6424 FC jmp [esp-4]; //这个让他往上跳,否则就会出错了
接着我们就会在jmp后跳向下面的地方
00407C992985 44814000 sub [ebp+408144], eax; //跳到这儿00407C9FEB 01 jmp short 00407CA200407CA1C7???; 未知命令00407CA20F85 EE150000 jnz 0040929600407CA8E8 03000000 call00407CB0 ; //F7
F7进入后,紧接着来到:
00407CB0^\EB FB jmp short 00407CAD ; //也跳00407CB2^ 7D 83 jge short 00407C3700407CB404 24 add al, 2400407CB60C C3 oral, 0C300407CB81C 8D sbb al, 8D
发现这样就出来一个向上跳的一个近跳,我们要不要跳呢?我们可不可以在下一句F4呢?
我们往上滚动下,发现现在还有花指令,我们通过它看到
00407CAD /EB 04 jmp short 00407CB3 ; //跳到这儿,有跳下去了00407CAF^|E0 EB loopdne short 00407C9C00407CB1 |FBsti00407CB2^|7D 83 jge short 00407C37

跳到00407cad后,他会跳向00407cb3,既然他自己回跳,我们就让他跳,如果我们直接在下句F4,又会出错了!
00407CAD /EB 04 jmp short 00407CB3 ; //跳到这儿,有跳下去了00407CAF^|E0 EB loopdne short 00407C9C00407CB1 |FBsti00407CB2^|7D 83 jge short 00407C37
来到下面的地方
00407CB3830424 0C add dword ptr [esp], 0C; //到这儿,下面又是个retn,我们还是F8单步吧00407CB7C3retn
过后来到西门的地方
00407CB98D9D 1C0D4900 lea ebx, [ebp+490D1C]; //来到这儿了00407CBF81EB 15A30800 sub ebx, 8A31500407CC5E8 01000000 call00407CCB ; //此处是个近call,我们应该是要F7跟入,但是如果我们F8的会到系统领空,这时我们还是像上次一样下断,然后shift+f9会直接到达OEP的附近00407CCA9A 58FE481F 0F8>callfar 840F:1F48FE5800407CD194xchgeax, esp00407CD20200add al, [eax]00407CD40075 01 add [ebp+1], dh00407CD7FF81 7003E898 inc dword ptr [ecx+98E80370]
在这里我就不这样,我们还是按照规矩,F7跟入
00407CB98D9D 1C0D4900 lea ebx, [ebp+490D1C]; //来到这儿了00407CBF81EB 15A30800 sub ebx, 8A31500407CC5E8 01000000 call00407CCB ; //F7跟入
这样就来到下面的地方
00407CCB58pop eax; //来到这儿00407CCCFE48 1F dec byte ptr [eax+1F]00407CCF0F84 94020000 je00407F6900407CD575 01 jnz short 00407CD8 ; //这儿跳了,是个花指令吧,我们跳后看看00407CD7FF81 7003E898 inc dword ptr [ecx+98E80370]00407CDD68 EA83C021 push21C083EA
跳了后就成这样了
00407CD88170 03 E89868E>xor dword ptr [eax+3], EA6898E8; //跳到这儿了00407CDF83C0 21 add eax, 2100407CE28040 FB EBadd byte ptr [eax-5], 0EB; //注意下面F8后会搞出一些代码,我们比较下00407CE6A2 4002FFE0 mov [E0FF0240], al00407CEBF2:65:prefix repne:00407CEDFFD3callebx00407CEF75 11 jnz short 00407D02
比较跟后
00407CD88170 03 E89868E>xor dword ptr [eax+3], EA6898E8; //跳到这儿了00407CDF83C0 21 add eax, 2100407CE28040 FB EBadd byte ptr [eax-5], 0EB; //注意下面F8后会搞出一些代码,我们比较下00407CE68D40 02 lea eax, [eax+2]00407CE9FFE0jmp eax00407CEBF2:65:prefix repne:00407CEDFFD3callebx; UnPackMe.0040A6B5
呵呵,有些不一样吧:
最下面的call ebx其实就是跳向OEP了,跳转还是比较大的啊!
我的方法是在这儿直接F8,他会进入系统领空,
7C92EAF08B1C24mov ebx, [esp] ; //再次来到系统领空7C92EAF351pushecx7C92EAF453pushebx7C92EAF5E8 C78C0200 call7C9577C17C92EAFA0AC0oral, al7C92EAFC74 0C jeshort 7C92EB0A


我们打开内存(ALT+M),在0040100下断
Memory map, 条目 23 地址=00401000 大小=00001000 (4096.) 属主=UnPackMe 00400000 区段= 包含=代码 类型=Imag 01001040 访问=RWE 初始访问=RWE
F2下断后,SHIFT+F9运行,就会来到
004017488Bdb8B004017490Ddb0D0040174A20db20 ;CHAR ' '0040174B31db31 ;CHAR '1'0040174C40db40 ;CHAR '@'
我们 右键=====分析=====删除分析
004017488B0D 20314000 mov ecx, [403120]0040174E8908mov [eax], ecx00401750FF15 88214000 call[402188] ; msvcrt.__p__commode004017568B0D 1C314000 mov ecx, [40311C]0040175C8908mov [eax], ecx0040175EA1 84214000 mov eax, [402184]004017638B00mov eax, [eax]00401765A3 28314000 mov [403128], eax0040176AE8 16010000 call004018850040176F391D 40304000 cmp [403040], ebx0040177575 0C jnz short 004017830040177768 82184000 push004018820040177CFF15 80214000 call[402180] ; msvcrt.__setusermatherr0040178259pop ecx00401783E8 E8000000 call004018700040178868 14304000 push004030140040178D68 10304000 push0040301000401792E8 D3000000 call0040186A ; jmp 到 msvcrt._initterm

这里怎么看也不是OEP啊,没有什么语言特征的看头啊
我们往上看看
004016FCCCint3004016FDCCint3004016FECCint3004016FFCCint3004017000000add [eax], al004017020000add [eax], al004017040000add [eax], al004017060000add [eax], al004017080000add [eax], al0040170A0000add [eax], al0040170C0000add [eax], al0040170E0000add [eax], al004017100000add [eax], al004017120000add [eax], al004017140000add [eax], al004017160000add [eax], al004017180000add [eax], al0040171A0000add [eax], al0040171C0000add [eax], al0040171E0000add [eax], al004017200000add [eax], al004017220000add [eax], al004017240000add [eax], al004017260000add [eax], al004017280000add [eax], al0040172A0000add [eax], al0040172C0000add [eax], al0040172E0000add [eax], al004017300000add [eax], al004017320000add [eax], al004017340000add [eax], al004017360000add [eax], al004017380000add [eax], al0040173A0000add [eax], al0040173C0000add [eax], al0040173E0000add [eax], al004017400000add [eax], al004017420000add [eax], al004017440000add [eax], al004017460000add [eax], al004017488B0D 20314000 mov ecx, [403120]0040174E8908mov [eax], ecx
晕,这么多0000,看来是被抽取代码了,分析剩下的代码,我分析了下不是DELPHI,也不是vb,其余的没有见过,我也不太了解这些,所以我找了个vc++的程序,发现留下的跟vc++的一模一样,所以我确定它是vc++了!
0041649D >/$55pushebp0041649E|.8BECmov ebp, esp004164A0|.6A FF push-1004164A2|.68 A8C34100 push0041C3A8004164A7|.68 24664100 push<jmp.&MSVCRT._except_handler3> ;SE 处理程序安装004164AC|.64:A1 0000000>mov eax, fs:[0]004164B2|.50pusheax004164B3|.64:8925 00000>mov fs:[0], esp004164BA|.83EC 68 sub esp, 68004164BD|.53pushebx004164BE|.56pushesi004164BF|.57pushedi004164C0|.8965 E8 mov [ebp-18], esp004164C3|.33DBxor ebx, ebx004164C5|.895D FC mov [ebp-4], ebx004164C8|.6A 02 push2004164CA|.FF15 F0974100 call[<&MSVCRT.__set_app_type>] ;msvcrt.__set_app_type004164D0|.59pop ecx004164D1|.830D B4324300>ordword ptr [4332B4], FFFFFFFF004164D8|.830D B8324300>ordword ptr [4332B8], FFFFFFFF004164DF|.FF15 EC974100 call[<&MSVCRT.__p__fmode>] ;msvcrt.__p__fmode004164E5|.8B0D A8324300 mov ecx, [4332A8]004164EB|.8908mov [eax], ecx004164ED|.FF15 E4974100 call[<&MSVCRT.__p__commode>] ;msvcrt.__p__commode004164F3|.8B0D A4324300 mov ecx, [4332A4]004164F9|.8908mov [eax], ecx004164FB|.A1 E0974100 mov eax, [<&MSVCRT._adjust_fdiv>]00416500|.8B00mov eax, [eax]00416502|.A3 B0324300 mov [4332B0], eax00416507|.E8 17010000 call004166230041650C|.391D D01E4200 cmp [421ED0], ebx00416512|.75 0C jnz short 0041652000416514|.68 20664100 push0041662000416519|.FF15 DC974100 call[<&MSVCRT.__setusermatherr>] ;msvcrt.__setusermatherr0041651F|.59pop ecx00416520|>E8 E9000000 call0041660E00416525|.68 38104200 push004210380041652A|.68 34104200 push004210340041652F|.E8 D4000000 call<jmp.&MSVCRT._initterm>
如果要我修改的话,我还是不会,突然我记得我们第一个壳就是VC++,入口点OEP也是00401700,所以直接搬过来来,复制那个练习的二进制:
55 8B EC 6A FF 68 00 25 40 00 68 86 18 40 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 6853 56 57 89 65 E8 33 DB 89 5D FC 6A 02 FF 15 90 21 40 00 59 83 0D 2C 31 40 00 FF 83 0D 30 31 4000 FF FF 15 8C 21 40 00
然后粘贴到这个程序被抽取的地方:

然后在
00401700 >/$55pushebp
右键----在此处新建EIP,然后用用LordPE直接dump,然后用ImpREC修复,OEP的rva填1700,然后修复,没有无效函数,这样脱壳后的程序能够运行起来!!!

这个要看偷取代码的教程,还不会如何找回偷取的代码的过程~~~~~~

dumped_1223558885134.rar
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-29 07:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表