2018/11/6之前的笔记
单步跟踪法—-凭毅力和信心找oep
ESP定律法利用堆栈平衡——有入栈有出栈
VB 常见入口(前面一堆jmp)
004012D4 68 54474000 push QQ个性签.00404754
004012D9 E8 F0FFFFFF call QQ个性签.004012CE ; jmp 到 msvbvm60.ThunRTMain
2018/11/6
手脱fsg壳
1.找oep
脱壳新方法—特殊ESP定律法:
(FSG 2.0 -> bart/xt)
单步到push ebp前一步,堆栈第四行(固定位置)即为程序入口地址,再反汇编窗口跟随第四行地址下硬件执行端点点击执行,跳到oep
2.修复
背景–当使用importREC自动查找IAT转存文件不能运行时(IAT有:OEP,RVA,SIZE )
手动查找IAT:
1.oep为程序入口。
2.找到有可以某个call函数的rva地址,数据窗口跟随往前翻直到无存储数据的地址为要找的开始的RVA地址,往下翻到无存储数据的地址为结束相应的RVA地址,二者相减为size 。也可手动设置size为一个较大数然后将再无效函数中剪切指针。
3.转存文件
手脱PECompact2.X
脱壳新方法
直接下断点BP VirtualFree:
方式1:SHIFT+F9(忽略异常运行 ,取消断点 );ALT+F9( 返回到用户代码段,运行至上层调用的下句);查找 push 8000(特征码)运行到这单步跟
方式2:两次SHIFT+F9中断后取消断点,Alt+F9返回单步走。
后一次异常法:
取消所有异常。记录多少次跑飞。找最后一次的前一次的SE句柄转到SE xxxx处,下断点运行。
2018/11/13
新修复方法:当遇到脱壳完不能运行而且用imprec也修复不了时可以用lord_pe的重建pe法修复打入需要修复的文件试试
新方法—模拟跟踪法:先用最后一次异常法到SE句柄处,对所在位置下段运行到,在M窗口找到sfx输入表位置跟踪
tc eip<输入表位置
然后直接到oep
手脱TELock0.98b1壳
新修复方法:当所有的已知方法都死活都不能修复文件的时候,并且有很多无效指针时。使用IR中的trace跟踪无效的指针然后经行修复(这个有多种选择,一是根据trace等级,二是根据每个壳查壳后的特性)
emmmmmmm,这里比较坑的一点是使用od的时候无法直接跟踪无效指针进行修复。需要在运行程序后进行跟踪。
2018/11/14
手脱exe32pack壳
新方法—–下断点BP IsDebuggerPresent 运行,取消断点,执行到用户代码ALT+F9,计算此时的ss+edi为OEP!
2018/11/16
软件绿化
开始实战去广告啦!(练习的为吾爱破解网的官方教程)
当然去广告之前还是要先脱壳。能修改的都是脱过壳的程序
常见的API
API名 | 弹窗原理 | 表示 | 用法 |
---|---|---|---|
1.MessageBoxA/W | 消息框 | MessageBoxA/W | 弹窗 |
2.ShellExecuteA/W | 控制台执行 | open url | 打开网页 |
3.WinExec | Windows执行 | explorer.exe url | 打开网页 |
4.CreateProcessA/W | 创建进程IE | PATH url | 打开网页 |
5.CreateWindowExA/w | 创建窗口 | 弹窗 | |
6.DialogBoxParamA/W | 创建窗口 | 弹窗 | |
7.RegCreateKeyExA/W | 注册表 创建 键值 | 修改配置(如修改浏览器主页) | |
8.RegOpenKeyExA/W | 注册表 打开 键值 | 修改配置 | |
9.RegDeleteKeyExA/W | 注册表 删除 | 修改配置 |
去除这些API方法:
法1: 跟随表达式下断点,运行此处,然后在堆栈窗口第一条回车找到push的参数,然后进行nop填充
法2:找到这些网页的网址经行00填充
去除方法的原理很简单就是将参数置为00或指令变为NOP。但是由于有些网址有加密所以不能直接找到对应的网址。
注意参数的个数和push相对应
2018/11/20
软件绿化2
去除API新方法:段首改为retn,和段尾的retn保证堆栈平衡。原理就是直接跳过这一段程序。
2018/12/10
附加数据(overlay)处理
附加数据理解:MP3文件需要播放器文件执行打开功能才能读取,而overlay相当于直接在软件最后添加需要读取的数据。让程序执行的时候就带有这一部分数据
overlay处理原理:文件映射时,若数据内容不能满足整数个区段的内容,将会自动填充0来使其内存空间为整数个区段。也就是说可以通过大量0来判断区段的开始和结束,找到我们想要的区段。
overlay处理背景:当然又是脱完壳程序无法正常运行的一种情况啦。脱壳的时候可能就直接将这一部分的数据给cut掉了
工具:win hex 等能够改数据的工具
法1:
LORDPE找最后一个区段 中ROFFESRT(实际地址) 和RSIZE(实际大小) 相加得到这个区段的头地址
法2:
直接再源程序最后向上翻到有很多0的地方(即倒数第二个区段的末尾)
直接添加最后一个区段的附加数据到脱完壳后程序的最后
需要注意的点:
- 不能覆盖其他数据
- 有时添加完数据后与原文件的位置发生变化,所以要重新定位文件指针
2018/12/11
程序自校验去除
处理背景:脱完壳后又又又不能跑起来了
思路:比较脱完壳和原程序有什么地方运行得不一样,比如原程序未实现某个跳转而脱完壳就实现了
方法
下断:bp CreateFileA
改得和原程序运行行为相同即可
2018/12/12
软件汉化编辑—脱壳应用
工具:
- resource hacker—-VC类
- peexplorer—-BC++
- getvbres …………VB类的汉化、DIY
- xnresource
2018/12/13
Aspack变形壳
Ep段:皇后
做的练习是,变形之后esp定律不得行了,有些call就直接跑飞,所以只有单步跟了。
今天遇到还有一个比较坑的地方是循环上下跳转,emmmmmm,就跟个死循环一样,然而程序可以运行则证明这个循环上下跳是有限次的,于是乎,下断F9直接记录多少次(n)F9才会跑飞,然后再次运行n-1次,然后单步跟。
2018/12/14
ACProtect132(无stolen code)
EP段:.perplex
(查壳出来是UltraProtect,其是ACProtect以前的名字)
教程和实际操作好多不一样,我是个弟弟
这个壳和ximo教程上演示的不太一样,最开始我以为是没有隐藏od的原因,结果一看才知道52od可以自动隐藏(太智能了吧)。
然而仅仅忽略内存断点一点用都没得(一次shift+f9直接跑飞)
下面是我的做法:
最后一次异常,勾选内存访问异常,在se句柄处下内存访问断点然后shift+f9到跑飞的前一次,(删除内存断点)然后单步跟到一个retn,然后直接在m中的代码端下(普通)断点,shitf+f9然后单步走跑过这个壳最开始弹的加壳弹窗就直接到oep。
一点小思路:一开始打开这个的时候,它最开始有个弹窗之后才是程序,我最开始的想法是在CreateWindowExA或是其他API下断点然后运行到这个窗口执行完毕就可以定位到oep前,然而…..没有搞出来
今天体会最深的一点是要学会只是的迁移,依葫芦画瓢已经逐渐不可行了,还是要看原理鸭>︿<
2019/1/20
放寒假啦,期末终于考完了
ACProtect132(有stolen code)
要点:修复“stolen code”
被偷走的code一般放在了壳里面
stolen code也就是找到的oep缺少了一部分代码,我们需要的是找到“被偷走的代码”,这需要了解程序的常见入口,再在壳的return处跟着跟随可能的oep第一句的代码。最终到正常入口处将截取的“stolen code”复制到正常入口处,最后重建.(脱壳注意不要重建输入表)
2019/1/21
寻找ACProtect的stolen code
- 设置异常(忽略除INT3中断的所有异常),隐藏OD,到最后一次异常
- se句柄位置下内存访问断点
- shift+f9两次(每次都下cc端点)
- 再次shift+f9看到retn后
- 去掉所有断点再运行到retn处
- 此处的retn是寻找stolen code的最佳位置,下d 12ffc0,下硬件断点。SHIFT+F9。
(这个断点ximo说的是acprotect的致命处。具体原因先填一个坑) - 记下Stolen Code(二进制复制)
- 找到内存,在00401000处下断,F2,SHIFT+F9。
- 写入真实的代码,OD插件脱壳(修正OEP地址)
- IR修复,用等级3。不能修复的CUT掉。抓取修复。程序还是抱错!
- 做下处理。来到壳的入口。也就是第一步记下的地址
- 写入真的OEP代码。
- Lord PE修正入口点
(摘自教程,讲的十分详细了)
2019/1/26
ACProtect V2.0.X
VB程序修复
对于VB程序的常见入口例如
......
00401122 jmp dword ptr ds: [<&MSVBVM60.#ThunRTMain>; msvbvm60.ThunRTMain #一系列库函数
00401128 push 工程1.00401288
0040112D call <jmp.&MSVBVM60.#ThunRTMain_100>
加壳后的入口点变为
....
004012CE jmp dword ptr ds:[0x401078] ; msvbvm60.ThunRTMain
004012D4 db 29; CHAR ')'
004012D5 db BA
.....
不难对比发现缺少了push和call两行。push的是入口处(前一行jmp中含有入口信息),call的是main函数的位置(push前一行的那个jmp)。我们所需要补全的也就是这两行汇编