吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 57009|回复: 197
收起左侧

[原创] 脱壳练习1-10课 我的学习笔记

    [复制链接]
小黑冰 发表于 2009-12-7 03:48
本帖最后由 小黑冰 于 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==[ebp] 设置条件段点。
1.
xchg    eax, esi
cmp     esi, dword ptr [ebp]

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:[ebx+C]    这句下硬件段点 然后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 [edi]
inc     eax



练习3 学习笔记

NsPacK V3.7 -> LiuXingPing *压壳
壳关键之处:
0040C5AF   /FF2485 71C14000 jmp     dword ptr [eax*4+40C171]         ; 1111111111111111111111111111111

其一脱法:
ALT+M
包含=SFX,data,imports,resources
tc eip<00407000



我学到的东西:
1.JMP跳向是变化的,而其他附近的JMP是确定的,所以这里应该就是关键点

单步来到0040C5AF FF2485 71C14000 jmp dword ptr ds:[eax*4+40C171]后,下硬件执行断点
,记录SHIFT+F9的次数,发现第31次程序运行,重新载入程序,重复上面的步骤后来到关键点,下硬件
执行断点,SHIFT+F9 30次后停下,改用F8单步即可解掉循环·~
2.多种脱壳法结合可以快速到达OEP 如:ESP+内存景象
3.遇见PUSHAD等 ESP定律.内存景象法也有时候跑过头OEP 拉向上即可!~

4.0040C5AF FF2485 71C14000 jmp dword ptr ds:[eax*4+40C171]  到了这句不知道怎么到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:[eax+4]
0040CC83    E8 00000000     call UnPackMe.0040CC88
0040CC88    5A              pop edx
0040CC89    83C2 1E         add edx,1E
0040CC8C    8990 B8000000   mov dword ptr ds:[eax+B8],edx
0040CC92    31D2            xor edx,edx
0040CC94    8950 04         mov dword ptr ds:[eax+4],edx
0040CC97    8950 08         mov dword ptr ds:[eax+8],edx
0040CC9A    8950 0C         mov dword ptr ds:[eax+C],edx
0040CC9D    8950 10         mov dword ptr ds:[eax+10],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:[eax],55                    ; EAX比较55
0040D24F    75 24           jnz short UnPackMe.0040D275                 ; 不相等的话跳   关键跳
0040D251    C600 90         mov byte ptr ds:[eax],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.004A1875  jmp
004A184F    8907                  mov dword ptr ds:[edi],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:[ebx+1F8A]
004A184F    8907                  mov dword ptr ds:[edi],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:[ecx],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:[esp+4]
00468338893C8Amov dword ptr ds:[edx+ecx*4],edi;这里取EDI寄存器的值,根据下面寄存器窗口得知,应该取EAX的值
0046833B807F 05 55cmp byte ptr ds:[edi+5],55;F9三次到这里断下,出现了IAT加密,往上看





我学到的东西:
1.找到IAT加密前在OEP里下个硬件断点然后找IAT加密就快了``````
2.了解DEIPHI  OEP``
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:[0],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:[ebp-18],esp
00408D5E    33DB                 xor ebx,ebx
00408D63    895D FC              mov dword ptr ss:[ebp-4],ebx
00408D69    6A 02                push 2
00408D6E    FF15 90214000        call dword ptr ds:[402190]                       ; msvcrt.__set_app_type
00408D77    59                   pop ecx
00408D7B    830D 2C314000 FF     or dword ptr ds:[40312C],FFFFFFFF
00408D85    830D 30314000 FF     or dword ptr ds:[403130],FFFFFFFF
00408D8F    FF15 8C214000        call 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



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

第一句:
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



1.关键代码要2进制写入
or dword ptr ds:[40312C],FFFFFFFF
or dword ptr ds:[403130],FFFFFFFF

2.Stolen conde 是被偷代码的意思
3.偷代码并不可怕,可怕的是加密来偷!
4.这壳特点就是把OEP的代码移到壳里执行!~得出结论不一定要在程序里执行代码才可以,当然只要执行了代码都可以运行程序,也可以把OEP的代码加密移到壳里加密然后解密然后执行,大大增加了破解难度!~但是总之一句话,加密了,该还原的总是要还原的!~加密了肯定会有解密的公式在壳里面!~
5.了解了VC++  OEP特点```
6.在单步的时候,不要一味想着往下走,多注意代码!否则OEP到了都不知道!~

PE SPIN0.33壳  果然有一手!~

OD有PESPIN 0.3X的替换花指令工具```

永远要记得OD里都是16进制```呵呵```说48字节被人家笑的```





免费评分

参与人数 3威望 +1 热心值 +2 收起 理由
尘丶 + 1 鼓励转贴优秀软件安全工具和文档!
ibuge + 1 学习
CHHSun + 1 欢迎讨论交流,[吾爱破解]有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

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

batistutawt 发表于 2014-10-8 16:41
楼主你好 请问为什么“跟随的时候 看到一片0数据 尽量下硬件段点”?我自己尝试过下两种断点,你的说法是合理的,但是为什么呢?
2051314 发表于 2009-12-7 06:54
kings0527 发表于 2009-12-7 09:03
onlylovewww 发表于 2009-12-7 09:54
对壳中的重要点进行了分析 很不错啊
pizigao 发表于 2009-12-7 09:54
这是学习心得啊~这个好啊!
672399809 发表于 2009-12-7 12:20
的确好贴……对同样进行吾爱脱壳练习的我很有用处,有些是我忽略的
x740073529 发表于 2009-12-7 15:01
强悍 收藏下来
爱龙木 发表于 2009-12-8 16:26
值得我们新手好好学习`谢谢
enterhunter 发表于 2009-12-8 16:30
学习了,停留在简单破UPX的小鸟路过
乱乱弹 发表于 2009-12-9 22:16
好东西! 要破解就要先从壳做起!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-27 00:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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