用户名:  密码:   
您当前的位置:首页 > 程序设计 >  汇编与密码学 > 

脱壳篇1_6

上次修改时间: 2017-12-07 11:00:21      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\assembly与反assembly\解密系列\      下一页

第1讲 什么是壳
1. 有些软件是保护程序不被破解的。
2. 除了加密还有压缩功能
3. OEP,入口,程序最先载入的入口点
4. 现在将壳和主程序混在一起,早起有明确的分界线
 加壳前后输入表完全不一样。程序所要调用的API函数就是输入表
5. 用显示的方式调用API,而不放在输入表
6. 壳一般是用区块为单位解密和加密的
7. 重定位,跳到程序的原始入口点。现在是肉里有壳,壳里有肉。
 压缩一般是调用压缩引擎,都来自己实现慢,稳定性不行。
8. 壳要求解压速度快的外擎。
 apLib,对低于64K的压缩快
 JCALG1 对大文件好
 LZMA 7Z的
9. 分压缩壳和加密壳
 ASPack/UPX/PECompact 压缩壳
 ASProtect/Armadillo/ExeCryptor/Themida/VMProtect 加密壳
 UPX是开源的压缩软件
 尽可能是压缩减少可执行文件 尺寸
 加密会加入一些干扰的代码
10. 绝大部分的壳是可以脱的
11. 有些加壳软件兼容性不好。
 Armadillo是,为穿山甲,强度有限
 虚拟机保护技术
 VMProtect纯虚拟机保护的软件。没有办法完全的还原。一般用来保护一小段核心的代码

第2讲
1. 要会使用OD,脱UnPackMe,有插件的OD可以载入不一样
2. 用PEID找不到这个壳,壳的版本古老,事件设为主模块的入口点
 壳增加了3个区块。
3. 看入口在那个段的地址空间,几步后跳到入口处,右击——分析代码
 Dump debugged process插件,放在插件目录,勾选Fix Raw Size & Offset of Dump Image
 输入表不用重定位。
4. 用PEID检查dump出来的程序,用OD重新载入,看M壳区块还在,有的强的壳删除就不能运行
5. 用PE Editor打开,不能拖进去,点Sections,wipe Section header删掉区块,如果为灰表在其它程序打开了
 再用OD打开发现没有那些段
6. 程序2,更常用的脱壳方法,根据堆栈平衡原理找OEP
 打开UnPackMe,一进去都是一堆跳转,有个假的OEP,查看区块的地址空间
7. esp有变量为红色,右击——数据根据,,右击硬件断点,是调试里的断点,有CPU的特殊寄存器断点,只有4个
 dump出来,用LordPE修复,用PE Editor查看,修改,删除区块,最后点save保存
 这是个压缩壳,脱后变大
8. 一层一层的看调用

第3讲
1. 上讲的课后作业,用PIED查壳,OD载入,看程序流程,看线,可看到壳的名字和版本号
2. 点M看内存分布图,用堆栈平衡下断,找到入口点,右击dump出来,要勾生建输入表
 脱后用PEID查一下看是什么语言写的
 用LordPE打开,发现一个idata2区块
第二个作业,压缩壳
1. 用PDID查壳,
今天新的程序
1. PEID不能发现,用OD载入会弹出不一样的框,
2. 看ESP是否改变来堆栈平衡脱壳
3. 有反调试功能,F8单步确认探测OD的,IsDebuggerPresent这个API
 右键查找所有模块名称,
4. 先用jmp去掉反调试的功能
 用堆栈平衡断不下来,可在代码段下段点,使程序访问到代码段是断下来,断下后断点会取消
 访问到 F2,F9循环,先走过loop,C+F9,F12暂停,再跟一下循环再做什么
课后作业

第4讲 输入表原理
1. 输入表回顾,OD跟踪输入表,Hook-API原理
2. 每个Win32程序都有个输入表,如对话框的MessageBox函数,输入表记录输入表在windowsdll中地址,
 程序加载时,由windows加载器填充根据需要的API找来填充
3. OD载入程序,看IAT工作
 MessageBoxA,双击命令call的是个地址
 同一个程序,无论在那调用messageBoxA都是调用的同一个地址。
4. 用Alt +M ,任何PE头都指向后面的各段
 基址一般都是400000,输入的表
5. OD分析PE头的插件,Analyz
 输入表有两个,第三个相当于以0结尾
 可以一步步跳到API名字
6. hook-api,防止输入表被还原,会加密输入,外壳加载原程序
 没有壳的原程序通过IAT得到API地址,壳会填充壳里的地址,壳再关连到API
 被勾住了,
7. api的hook的例子,日志搜索,

第5讲,重建输入表
1. FSG压缩壳,ImpREC
2. 调试设置,SFX,字节方式跟踪真正的入口,左下角在转动,最后dump出来,不勾选重建输入表
3. 修改IAT,用ImpREC,载入程序,输入OEP,OD里那个
 在OD里查一下RVA,把上面到0,下面到0的范围,后再点Get Imports
 点Show Invalid,把不合法的砍掉。
 最后点Fix dump保存
4. 修改过后程序变大,多了个加入的输入表。

第6讲
1. UPX和WinUpack,UPX是开源的
 upx.exe fishc.exe
 upx.exe -d fishc.exe
2. 用OD打开,右键,——数据窗口跟随,单步,分析指令,dump出来
3. 用imp修复,把OEP复制进去,IAT Auto Search,输入RVA和Size,点Get...,保存
 脱后会变大。
4. WinUpack壳,作者不更新了,
 清除导出,清除重定位表,拖入程序,点压缩,
5. OD载入会出错,点M,点fishcPE文件头段,C+G
 用堆栈平衡方式也可以脱,dump出来,不勾重建输入表
6. 用IMP打开,输入OEP,搜索IAT,输入正确RVA,Size,。。。
 脱后比较大