【逆向笔记】逆向学习之吾爱破解公开课
作业
作业一
首先用exeinfoPE查壳
看到是UPX壳
拖进Ollydbg里面
查找popad找到大JMP,跟进,找到OEP
用LordPE完整转存
打开importRCE,用OD插件找到OEP,复制到importRCE里面,点击Get import > fix dump
选中unpack.exe,重新生成一个文件,查壳
成功脱壳
作业二
首先用exeinfoPE查壳
是北斗的壳
拖进Ollydbg里面,用ESP定律法跟进找到OEP
之后参考作业一的步骤,完成脱壳
作业三
首先查壳
是FSG的壳
拖入Ollydbg中,找到JMP OEP的地点
跟进,进入OEP
然后使用importRCE进行脱壳,之后可以发现虽然可以成功脱壳,但是运行出错
修复IAT
在OEP处的一个call点enter进入
然后右键选择数据窗口跟随>内存地址
查找到全零的地方,然后用这个数值减去基址的数值
也就是432000-400000=32000
这个数值就是RVA的数字
而它的大小就是上方全零的地方减去下方全零的地方
或者可以直接用大于他的数值代替,例如1000
这时候点击Getimports 会出现NO的提示,也就是出现错误
原因是程序作者为了防止程序被脱壳软件脱壳从而加入进一些无意义的东西
点击show invalid ,显示出有错误的地方,右键剪切,也就是cut thunks把无意义的东西删除掉,然后fix dump
再次查壳
成功脱掉
再次运行
OK,完美脱壳
选修作业四
查壳
发现是PEC壳,直接拉入Ollydbg
F8单步跟进
发现在这里单步会跳转
会跳转到这里
在这个call里面单步会跑飞,所以这里F7进入call
在这个call单步同样会跑飞,F7进入
进入到这里
这里的sysenter单步也会跑飞,F7进入
之后单步跟
进入OEP
之后就是脱壳,选用插件直接脱壳
运行
选修作业五
查壳
是KBYS的壳
直接拉进Ollydbg里面,F8单步跟,遇到retnF7进入,最后可以成功到达OEP
接下来用插件脱壳,可以成功
选修作业六
查壳
是Upack的壳,直接拖入OD中
单步跟,第一个call就跑飞
直接搜索popad
F4运行到这里,继续单步跟
直接跳转到OEP
插件脱壳
查壳,运行
或者用LordPE加Import RCE脱壳也可以达到效果
选修作业七
查壳
RLPack的壳
直接拖入OD,搜索popad,跳转,然后单步跟,直接来到OEP,插件脱壳
但是遇到问题,运行会出错
换用LordPE加Import RCE脱壳,成功脱壳
八种方法脱PECompact壳
方法一:单步跟踪
F8跟进,遇到跑飞的Call就F7进入
遇到sysenter也会跑飞,同样F7进入,之后单步跟,即可找到OEP
方法二:ESP定律法
单步跟进,发现右侧ESP突变,数据窗口跟随,然后硬件访问>word
运行,之后删除硬件访问,之后单步跟进
方法三:下BP VirtualFree断点(一次运行)
下断点后Shift+F9运行,来到这里
之后F2取消断点,然后Alt+F9执行到用户代码
然后搜索push 8000
然后在此处下断点,运行
取消断点,之后单步跟,之后找到JMP OEP处,继续单步跟即可到达OEP
方法四:下BP VirtualFree断点(两次运行)
同样是下BP VirtualFree断点,然后两次Shift+F9运行
之后F2取消断点
Alt+F9执行到用户代码
之后单步跟,来到JMP OEP处
单步跟,即可到达OEP
方法五
程序拖进OD中,它就会停留在一层
要下的断点就是它的数字,也就是0045de74
下断点之后,运行来到这里
看到有个retn,单步的话会跑飞,所以跳过它在它的下方设置断点
然后运行,取消断点
之后单步跟进,来到JMP OEP处
跟进即可到达OEP
方法六:下bp VirtualAlloc断点
下好bp VirtualAlloc断点后,Shift+F9运行
取消断点,并执行用户代码,也就是ALT+F9
这时候先不单步跟,向下拉会看到一个很熟悉的JMP
F4运行到此处,之后单步跟,来到JMP OEP
再跟一步即可到达OEP
方法七:最后一次异常法
这个方法是利用程序跑飞之前的一次运行来寻找SET句柄从而跟随,但是实际测试中发现同一个程序不同的机器上达到跑飞的次数并不一样,在Win7上面是一次运行直接就跑飞,而在win1上面,程序运行三次才会跑飞,而且并没有寻找到SET句柄,暂时还不知道原因出在哪里。
但是在Win10上面虽然不能用SET句柄跟随,却发现了另一种方式也可以到达OEP
首先在选项的调试设置里面把异常全部取消勾选,之后重新载入程序
同样是利用Shift+F9运行,三次就跑飞,在第二次运行处停止
然后在箭头处,惊奇的发现一个熟悉的JMP
下断点,运行到这里,再取消断点,单步跟
惊奇的发现到达了OEP
然后试了试脱壳,用自带插件脱壳不能正常运行,用修复IAT的方式可以脱壳
———————————————补充————————————————————
之后去了论坛找到一篇帖子,有一个方法和这个比较像,但是他没有运行,而是利用第一个push压栈地址,也就是
而它压入的是eax,所以要跟随的就是eax寄存器的地址,也就是0045de74
然后跟随到这里
在这里有个返回的retn,需要跳过去,在下方断点,运行,再删除断点
然后单步跟,就可以找到JMP OEP的位置
继续单步跟即可到达OEP
方法八:两次内存法
使用OD的快捷栏中的m来到内存窗口,找到程序的第一段的.rsrc
设置断点,Shift+F9运行
然后再一次进入内存窗口,找到它的.text,设置断点,运行
然后下方有个retn,在它的下方设置断点,跳过retn运行
之后单步跟进,找到JMP OEP
继续单步一步即可到达OEP
实战去广告
几种Windows API
1 | 1.MessageBoxA/W //消息框 |
1 | 2.ShellExecuteA/W |
1 | 5.CreateThread //具体的方式 |
1 | 6.RegCreateKeyExA/W |
1 | CreateWindowExA/W |
实例一
首先使用查壳工具查询到是UPX壳,用脱壳工具进行脱壳。
用C32Asm以十六进制方式打开脱壳后的软件。
搜索ANSI字符串,已知会出现网页弹窗,搜索http关键字
将此处全部填充为00,保存,测试程序,会发现,程序最开始的网页弹窗消失了,
在此处点击也不再会出现网页弹窗。
回到c32,继续搜索Unicode字符串,关键字是http
会看到最后有一个open
全部用00填充,保存,运行,发现第一个网页弹窗和第二个网页弹窗都消失了。
接下来是运行程序后第一个弹窗
用OD载入文件,在数据窗口中右键选择智能搜索
选择“来试试我的程序啊”,也就是程序启动的弹窗,Enter进入
这就是之前提到的Windows API,在这里下断点,运行。
这里就是具体的调用
有四条,在断点处向上选择四个push,连同断点处一起,用二进制Nop填充,然后复制到可执行文件,保存文件。
此时再打开程序,发现第一个弹窗已经没有了。
最后是程序运行20秒时的网页弹窗和运行40秒时的网页弹窗
用OD载入程序
此时将上面的弹网页的Windows API下断点,然后运行
可以看到自动停在ShellExecuteW的断点。
内容为空的原因是前面用C32已经把字段填充了,正常是有内容的
继续运行
等待20秒,会再次停在一处断点
在堆栈窗口选中WinExec,Enter进入
向上选中两个push加一个call,用Nop填充,复制可执行文件,保存,此时运行程序等待20秒后不再出现网页弹窗
继续在OD运行
停在下一处断点,Enter进入
选中十个push和一个call,选用Nop填充,再复制可自行文件,保存,运行程序,40秒后的网页弹窗也不再存在。