脱壳练习1-10课 我的学习笔记
本帖最后由 小黑冰 于 2009-12-7 04:08 编辑首先感谢52论坛让我学会了很多很多!~``给出我的笔记让大家更好的学习,有错之处请大牛指出!~
练习一:(结果已经公布)
最佳分析:第10楼unpack
http://www.52pojie.cn/thread-10496-1-1.html
练习二:(结果已经公布)
最佳分析:第9楼lqiulu
http://www.52pojie.cn/thread-10607-1-1.html
练习三:(结果已经公布)
最佳分析:第11楼傻人有傻福
http://www.52pojie.cn/thread-10688-1-1.html
练习四:(结果已经公布)
最佳分析:第11楼维护世界和平
http://www.52pojie.cn/thread-10850-1-1.html
练习五:(结果已经公布)
最佳分析:第3楼维护世界和平
http://www.52pojie.cn/thread-10990-1-1.html
练习六:(结果已经公布)
最佳分析:第12楼ximo
http://www.52pojie.cn/thread-11112-1-1.html
练习七:(结果已经公布)
最佳分析:第14楼傻人有傻福
http://www.52pojie.cn/thread-11244-1-1.html
练习八:(结果已经公布)
最佳分析: 第15楼unpack
http://www.52pojie.cn/thread-11306-1-1.html
练习九:(结果已经公布)
最佳分析: 第1楼小生我怕怕
http://www.52pojie.cn/thread-11446-1-1.html
练习十:(结果已经公布)
最佳分析:第10楼unpack
http://www.52pojie.cn/thread-11585-1-1.html
练习1 学习笔记
kkrunchy壳
我学到的东西:
0.先看加壳程序文件的大小,用PEID打开查下OEP具体地址范围,人口点,基地址,用可以用LOADPE查下基地址对壳有个表面的了解!
1.单不了时候 找大跳转 跳出循环
2.跟随的时候 看到一片0数据 尽量下硬件段点 然后重载程序 然后在运行到硬件段点处``
3.修复的时候 不要相信眼中的00401700 以为OEP是1700
00401700-003F0000=11700这才是真的``
4.单步走的时候 多注意信息窗口
5.在跳出循环的判断中可以下条件段点来(SHIFT+F4)esi== 设置条件段点。
1.
xchg eax, esi
cmp esi, dword ptr
2.C++到OEP法
kernel32.GetModuleHandleA
kernel32.GetStartupInfoA 这个离OEP近些`
练习2 学习笔记
FSG2.0变异壳
00409607 FFD4 call esp
esp=0012FFBC
不能F8 只能F7
004001CF /75 03 jnz short UnPackMe.004001D4这如果修改标志位的话效果不理想
004001D1 |FF63 0C jmp dword ptr ds: 这句下硬件段点 然后F9
004001D4 \50 push eax
我学到的东西::
0.这壳花太多,需要耐心,经常调用GET和LOA函数来解码
1.进过一个CALL 后面同样的CALL就不用进去了```
2.尽量F2 F9 F2 跳过单不要走的地方 可以避开一些检测!否则蓝频的代价是惨重的!
3.尽量不要修改壳内的代码包括标志位,否则到了OEP也不能修复查找到的IAT 也是无效的`
4.通过单步知道壳调用了那些IAT,然后下这些IAT可以快速到达OEP,当也可以直接下段这个加壳程序编辑语言的OEP附近的IAT函数
如:这个程序是C++写的 就可以下段bp GetModuleHandleA 然后往上翻就是OEP了
如:这壳调用了GetProcAddress 和LoadLibraryA 也可以下这个段点
5.通过单步也可以了解一个壳到OEP最近的独一无二特征码提取 然后直接CTRL+G 到00400000 然后查找特征码到达OEP,以后每遇到一个壳就要提取下特征码做为战利品!
6.得出做出一个壳必须不要调用系统的IAT,自己模仿系统的IAT自己写一个自己命名的IAT,防止被别人调用直接到OEP,写壳子不要留下特征码被别人提取,否则被别人秒杀
这壳子的经典办法:
方法一:
查找特征代码,popad
xchg eax,esp即二进制代码“6194”
ctrl + G到400000,ctrl + B 查找“6194”到这里:
mov eax, dword ptr
inc eax
练习3 学习笔记
NsPacK V3.7 -> LiuXingPing *压壳
壳关键之处:
0040C5AF /FF2485 71C14000 jmp dword ptr ; 1111111111111111111111111111111
其一脱法:
ALT+M
包含=SFX,data,imports,resources
tc eip<00407000
我学到的东西::
1.JMP跳向是变化的,而其他附近的JMP是确定的,所以这里应该就是关键点
单步来到0040C5AF FF2485 71C14000 jmp dword ptr ds:后,下硬件执行断点
,记录SHIFT+F9的次数,发现第31次程序运行,重新载入程序,重复上面的步骤后来到关键点,下硬件
执行断点,SHIFT+F9 30次后停下,改用F8单步即可解掉循环·~
2.多种脱壳法结合可以快速到达OEP 如:ESP+内存景象
3.遇见PUSHAD等 ESP定律.内存景象法也有时候跑过头OEP 拉向上即可!~
4.0040C5AF FF2485 71C14000 jmp dword ptr ds:到了这句不知道怎么到OEP 也可以直接
tc eip<00407000到达咯```
练习4 学习笔记
我学到的东西::
0.RDTSC-------一种反调试(Anti-debug)的方法
1.jmp short 0040952A
push DAF78623 不要怕 一样F4```
2.单步走着走着 就程序就出错了,一定是程序检测到OD做出相应的处理,我们重新载入 在次来到这个地方
走过的代码仔细研究研究一定是有恶意代码执行了,修改下代码即可跳过检测!
文中恶意代码
如:
00407000 0F31 rdtsc
00407060 0F31 rdtsc
00407069 /0F83 A3000000 jnb 00407112
练习5 学习笔记
unopixe v1.0
OD载入就提示 无法分配 -955977728字节的内存 强大啊```
单步到这走不动了啊!
0040CC80 8B40 04 mov eax,dword ptr ds:
0040CC83 E8 00000000 call UnPackMe.0040CC88
0040CC88 5A pop edx
0040CC89 83C2 1E add edx,1E
0040CC8C 8990 B8000000 mov dword ptr ds:,edx
0040CC92 31D2 xor edx,edx
0040CC94 8950 04 mov dword ptr ds:,edx
0040CC97 8950 08 mov dword ptr ds:,edx
0040CC9A 8950 0C mov dword ptr ds:,edx
0040CC9D 8950 10 mov dword ptr ds:,edx
0040CCA0 31C0 xor eax,eax
0040CCA2 48 dec eax
0040CCA3 C2 0400 retn 4
尝试在CODE段 F2 SHIFT+F9
经典代码之处:
0040D24C 8038 55 cmp byte ptr ds:,55 ; EAX比较55
0040D24F 75 24 jnz short UnPackMe.0040D275 ; 不相等的话跳 关键跳
0040D251 C600 90 mov byte ptr ds:,90 ; 这句是坏蛋 把PUSH EBP 摸掉了90
0040D254 35 00000000 xor eax,0
0040D259 85C9 test ecx,ecx
0040D25B 53 push ebx
.....
.....
.....
0040D26F 66:83F4 00 xor sp,0
0040D273 2C 00 sub al,0
0040D275 FFE0 jmp eax
我学到的东西::
1.有时候不能下一句F4的时候 拉下来找RETN 直接F4咯`````
2.有时候了内存景象段点F9也不一定成功要多来一次F9```
3.有时候下一次F4跑飞后 来到这的地址后下面几个行都F2掉 然后跑下就知道该到哪里了`````
4.OEP代码被偷了,快走到OEP前CTRL+G 来到OEP处 然后数据窗口监督着,然后慢慢跟踪就会发现恶意代码把我们OEP偷走的手拉```
5.去到一个指定地址 CTRL+G然后下硬件保险一些```然后SHIFT+F9
6.脱壳耐心与信心太重要了~!~```
7.入口不是一开始PUSHAD 你别想ESP拉```
防止破解方法:考验破解者耐心,别挑战他的兴趣!~
此壳最快脱法:SHIFT+F9运行程序
CTRL+S
pop esi
pop esi
pop ebp
push edx
push esi 看到OEP上面第3个条件跳转 记下地址与OPE地址然后CTRL+F2 然后CTRL+G 来到OEP第三个条转修改JMP然后来到OEP地址 然后下硬件段点直接到!
练习6 学习笔记
tElock 1.0 (private) -> tE!
处理CRC: 在DATA段下内存写入断点,然后SHIFT+F9 然后取消后单步走 要不然单步不了
普通加密壳
我学到的东西::
1.想调试必须先不要让壳检测到CRC 否则换调试器,那时候我深深被CRC打击到
2.到了OEP IAT加密了 重新载入程序然后到DD 0005512C下硬件访问断点然后F9找到是谁加密了IAT假如出现CRC就要解决CRC 然后找IAT
3.耐心分析每一个跳转,并不是高手那样走得这么快````单纯的F2 与F4 其实人家都是分析过来的````
练习7 学习笔记
004A17AE /0F84 C1000000 je UnPackMe.004A1875jmp
004A184F 8907 mov dword ptr ds:,eax nop
004A17AE /0F84 C1000000 je UnPackMe.004A1875 ; 1
004A17BA /75 2B jnz short UnPackMe.004A17E7 ; 2
004A17ED /75 2B jnz short UnPackMe.004A181A ; 1
004A1812 8D83 8A1F0000 lea eax,dword ptr ds:
004A184F 8907 mov dword ptr ds:,eax ; UnPackMe.004A1F8A
我学到的东西:
1.被加密了2个IAT,需要找回,记下IAT地址 然后下内存访问段点,然后SHIFT+F9到出现IAT后跟踪`````
2.OD载入不了 32位错误,PE做了手脚,把RVA数及大小一般为00000010
3.找magic jump 方法找到关键乱改IAT代码后 从载程序 然后单步走过一个JNE JE都记录下来```不跳用1表示,跳用2表示 然后看看谁跳过加密IAT代码的 就是这个函数的magic jump拉```
4.GetCommandLineA很多壳喜欢把这个IAT函数加密起来 应该对程序运行起很大作用````
练习8 学习笔记
MoleBox v2.0 * 这壳主要是IAT加密了```OEP不难````
00471658 /74 45 je short UnPackMe.0047169F ; magic jump
00471682 8901 mov dword ptr ds:,eax nop
处理IAT加密`````
VirtualProtect 虚拟保护
我学到的东西:
1.多看高手写的脚本可以得出很多单步经验
2.假如找1IAT 可以下2的写入段点 然后就看到1的IAT出来了``不防也是一种方法啊````
3.HR 0012FFA0 是下硬件写入段点
4.没加密的函数在这个跳处是跳的,但被加密的那个却是不跳的.
因此,很明显这个跳就是传说中的magic jump!也有反之,要NOP的magic jmup
练习9 学习笔记
汇编窗口:
004683315Apop edx
0046833259pop ecx
004683335Bpop ebx
004683348B7C24 04 mov edi,dword ptr ss:
00468338893C8Amov dword ptr ds:,edi;这里取EDI寄存器的值,根据下面寄存器窗口得知,应该取EAX的值
0046833B807F 05 55cmp byte ptr ds:,55;F9三次到这里断下,出现了IAT加密,往上看
我学到的东西:
1.找到IAT加密前在OEP里下个硬件断点然后找IAT加密就快了``````
2.了解DEIPHIOEP``
3.内存断点法```先RSRC 然后CODE
4.内存写入断点,只当有代码写到这的时候断下``然后用这个来漫漫找咯````
5.内存访问断点是有代码访问到这的时候断下!追加密IAT我们先用这个快速定位加密IAT地方````
6.几次找加密几个IAT magic jump 判断真正magic jump
先找到第1个magic jump 地方然后找第2个地方```如果IAT加密地址都一样说明这就是magic jump拉```哈哈``
7.修复的时候最好另开程序打开IMPRO REC 修复``否则会卡死的```
8.汉化的容易卡死---------所以用英文的速度和效率高,如果一定要等级3修复 并且一次选几个来修复。
练习10 学习笔记
00408D09 55 push ebp
00408D0D 8BEC mov ebp,esp
00408D12 6A FF push -1
00408D17 68 8890BF01 push 00402500
00408D23 68 ED8824EE push 00401886
00408D38 50 push eax
00408D3C 64:8925 00000000 mov dword ptr fs:,esp
00408D46 83EC 68 sub esp,68
00408D4C 53 push ebx
00408D50 56 push esi
00408D54 57 push edi
00408D58 8965 E8 mov dword ptr ss:,esp
00408D5E 33DB xor ebx,ebx
00408D63 895D FC mov dword ptr ss:,ebx
00408D69 6A 02 push 2
00408D6E FF15 90214000 call dword ptr ds: ; msvcrt.__set_app_type
00408D77 59 pop ecx
00408D7B 830D 2C314000 FF or dword ptr ds:,FFFFFFFF
00408D85 830D 30314000 FF or dword ptr ds:,FFFFFFFF
00408D8F FF15 8C214000 call dword ptr ds: ; 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
寻找这两句就是完整找回偷窃代码的关键了
-----------------------------------
两句的解码方法
第一句:
00408D1768 8890BF01 push1BF9088;程序将1BF9088值压入堆栈
00408D1C812C24 886B7F01 sub dword ptr , 17F6B88;运行到这里将刚压入堆栈中的值减去
17F6B88这个值并放回堆栈中,这时堆栈窗中观察0012FFB8 1BF9088运算后变成了0012FFB8 00402500
UnPackMe.00402500,这时观察堆栈窗口中的00402500就是这句解码出来的真正要压入堆栈中的值,那么这句被偷的
代码我们就得到了:push 00402500
----------------
第二句:
00408D2368 ED8824EE pushEE2488ED ;方法和上面类似,程序将EE2488ED值压入堆栈
00408D28810424 998F1B12 add dword ptr , 121B8F99 ;这里是将堆栈中的值加上121B8F99后再放会
堆栈,堆栈窗中的值的变化:
由0012FFB4 EE2488ED
变成0012FFB4 00401886jmp 到 msvcrt._except_handler3
这样我们就得到了解码后的第二句了:push 00401886
1.关键代码要2进制写入
or dword ptr ds:,FFFFFFFF
or dword ptr ds:,FFFFFFFF
2.Stolen conde 是被偷代码的意思
3.偷代码并不可怕,可怕的是加密来偷!
4.这壳特点就是把OEP的代码移到壳里执行!~得出结论不一定要在程序里执行代码才可以,当然只要执行了代码都可以运行程序,也可以把OEP的代码加密移到壳里加密然后解密然后执行,大大增加了破解难度!~但是总之一句话,加密了,该还原的总是要还原的!~加密了肯定会有解密的公式在壳里面!~
5.了解了VC++OEP特点```
6.在单步的时候,不要一味想着往下走,多注意代码!否则OEP到了都不知道!~
PE SPIN0.33壳果然有一手!~
OD有PESPIN 0.3X的替换花指令工具```
永远要记得OD里都是16进制```呵呵```说48字节被人家笑的```
楼主你好 请问为什么“跟随的时候 看到一片0数据 尽量下硬件段点”?我自己尝试过下两种断点,你的说法是合理的,但是为什么呢? 感谢楼主的分享,学习了 不错不错这样的分享有意义 对壳中的重要点进行了分析 很不错啊 这是学习心得啊~这个好啊! 的确好贴……对同样进行吾爱脱壳练习的我很有用处,有些是我忽略的 :handshake强悍 收藏下来 值得我们新手好好学习`谢谢 学习了,停留在简单破UPX的小鸟路过 好东西! 要破解就要先从壳做起!