《吾爱破解培训第八课:短兵相接–深入浅出探讨脱壳细节(上)》 讲师:L4Nce
《吾爱破解培训第九课:短兵相接–深入浅出探讨脱壳细节(下)》 讲师:L4Nce
课件内容
-
PE文件结构
-
汇编指令
-
OD脚本编写
-
基本脱壳步骤
调试器(反调试) 被脱壳的文件 OEP(偷OEP,藏OEP) dump(.bss) 修复iat()
-
脱壳,一套原因就行了
找真实的地址、真的找不到了,回归基础
-
iat识别不了
修复这种壳,我们人工的把真实代码找出来,搬移到本身的位置《=vm,乱序,花指令啊。
-
一个程序加载
| 内存里 | 程序的导入表-->告诉系统我需要这些函数 |(申请内存,读取文件,对话框) 函数的地址,填充到程序的内存里(iat)导入地址表 -
壳 程序的导入表,是静态可见的,包含了导入的dll名字,和他的导入函数
壳会在加壳的时候,把导入表这个结构给拿出来 然后自己加密,或者改变结构
壳改了以后,系统就找不到导入表了,也就无法给我们的程序填充所需要的函数地址。
加过壳的程序一定可以运行的。
所以很明显,这个填充过程被取代了,这个过程被在壳段完成。
脱壳的时候直接dump,软件导入表是不在的,iat所填充的函数地址是当前系统的地址,所以这个程序可能只能在脱壳的机器运行,换台机器就失败了。
解决这个问题,导入表, ImpREC IAT的地址值=>生成一份导入表,然后让程序使用新的导入表,那么程序就可以跨系统,在各个机器上用。
``` IAT若被加密壳切割,会造成导入表无法修复。
本来函数调用是这样的 call api 一些强壳会把这个代码改成 call packspace packspace: junkcode 一些无效操作 vm jmp api 导致工具无法修复导入表。
9. OD脚本的编写
OD脚本是基于汇编语言的
tab: 在脚本窗口中进行单步
空格:脚本窗口按空格,相当于直接运行脚本
脚本的指令
sti ->f7
sto ->f8
bp ->f2 下断点 一个参数就是地址
bp 00401000 ->00401000下断点相当于我们的f2
run ->f9 把程序跑起来
Demo bp 00457765 run ;相当于OD里按F9 sti ;这个就到OEP了 MSG “OEP到了” ; 这个输出一个对话框 ret ```
-
一个运用栈平衡找oep的手段
首先要执行一条压栈指令,来改变栈,然后等以后再次读入这个栈内容的时候,就说明有栈平衡的迹象,那么就很有可能是一个栈恢复。 一般来说压缩壳只有一次恢复,然后就到oep了,所以利用这个特性我们来找oep。
-
到oep了就要开始修复iat
找iat方法:(除了一些特别变态的加密壳什么TMD,SE,VMP这种)
ZP,TEP
call [dword] jmp [dword]
ff15 ff25
EP结构熟悉的,
00432000 00960306 这个是iat的起始
00432550 009604AA 这个是iat的截止
009606D8 68 5ACAD277 push user32.PostQuitMessage 009606DD C3 retn
push user32.PostQuitMessage retn || jmp PostQuitMessage
很明显:把原来调用改成自己的地址,然后在自己的代码里,跳到真实api地址
在指令二进制,直接带有地址push
还有是根据当前的eip然后加上指令中的偏移,算出来地址 jmp
-
esp定律.txt –» upx的大表哥
mov iat_b,00432000 mov iat_e,00432554 ;iat_b=00432000 sti ;pushad bphws esp,"r" ;hr esp run sti sti sti ;到了jnz bp eip ;为了解决这个循环,做了一个循环判断,在这个跳转指令处下一个断点也就指脚本中的bp eip,然后每次断下后,判断循环条件是不是成立;如果成立,说明循环已经结束了,可以进行单步到oep了 @LOOP: run cmp esp,eax jnz @LOOP sti sti sti MSG "到OEP了" @IAT_LOOP: mov iat,[iat_b] cmp iat,0 je @NEXT_LOOP mov api,[iat+1] mov [iat_b],api ;重建iat @NEXT_LOOP: add iat_b,4 cmp iat_b,iat_e jne @IAT_LOOP MSG "OK IAT 修复已经完成 fuck kido" ret ;mov iat,[iat_b] ;意思呢就是把00432000内存里面值拿出来,而不是拿出来00432000 ;mov iat,iat_b ;iat_b = 00432000 ;iat = 00432000 ;mov iat,[iat_b] ;iat = 00960306 ;0045775E 39C4 cmp esp,eax ;00457760 ^ 75 FA jnz short upx的大?0045775C ;UPX的壳段代码是差不多的,那么这个脚本就可以用来找这个upx版本所有加壳程序的OEP,而且不用管ASLR的问题 ;00432554 00000000脚本详见第九课视频。
课后问题总结答疑
课件工具
吾爱破解专用版Ollydbg:http://www.52pojie.cn/thread-350397-1-1.html 论坛专用破解虚拟机:http://www.52pojie.cn/thread-341238-1-1.html 其他工具见爱盘:http://down.52pojie.cn/Tools/
课件资源
360云盘下载: https://yunpan.360.cn/surl_y3GCKpiI2fX 提取码:7693 百度网盘下载: 链接: https://pan.baidu.com/s/1z9WQeYgUGxcurVD2lKfNeg 提取码: e2su
爱盘下载: http://down.52pojie.cn/吾爱破解视频教程/吾爱破解论坛官方入门教学培训第一期/
解压密码: www.52pojie.cn