好友
阅读权限10
听众
最后登录1970-1-1
|
zqw
发表于 2019-4-1 17:51
0x01
假期学习了”ximo脱壳基础“,学习过程中有一些记录发出来可以供大家参考。记录中步骤都是以“ximo脱壳基础”中的例子为参考,部分壳进行时需要根据具体情况进行改变,这里的总结步骤不是绝对的过程。
有些方法是通用的,所以会重复出现。
0x02
1)UPX壳(压缩壳)
方法一:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到popad处(和开始的pushad对应),后面的jmp大跳跳转到oep
方法二:ESP定律法
pushad后根据寄存器ESP的值在数据窗口跟随(命令:dd [ESP] )
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行—>删除硬件断点—>F8到OEP
方法三:2次内存镜像法
ALT+M(到程序段)—>在第一个.rsrc设置访问中断(F2)—>Shift+F9—>ALT+M(到程序段)—>在00401000设置访问中断(F2)—>Shift+F9—>向下运行几步便可以看到popad
方法四:一步直达法
根据pushad和popad成对出现性质 Ctrl+F查找命令(不勾选整个段)
2)ASPACK壳(压缩壳)
ASPack 2.12 -> Alexey Solodoynikoy
方法一:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到popad处(和开始的pushad对应),后面的jmp大跳跳转到oep
方法二:ESP定律法
pushad后根据寄存器ESP的值在数据窗口跟随(命令:dd [ESP] )
右键断点—>硬件访问—>Word(命令:hr [ESP] )—>运行—>删除硬件断点—>F8到OEP
方法三:2次内存镜像法
ALT+M(到程序段)—>在第一个.rsrc设置访问中断(F2)—>Shift+F9—>ALT+M(到程序段)—>在00401000设置访问中断(F2)—>Shift+F9—>向下运行几步便可以看到popad
方法四:一步直达法
根据pushad和popad成对出现性质 Ctrl+F查找命令(不勾选整个段,CTRL+L查找下一个)
方法五:模拟跟踪法
ALT+M(到程序段)查找包含SFX,imports,relocations的区段—>输入命令“tc eip<[地址]”—>到达OEP或者需要向下运行几步
方法六:SFX
选项—>调试设置—>SFX—>选择跟踪方式(块方式或者字节方式)—>重载
3)NsPack壳
版本:nSPack 1.3 -> North Star/Liu Xing Ping
开始pushfd
方法一:ESP定律法
单步运行,发现ESP值变换
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行(到达popfd)—>删除硬件断点—>F8到OEP
方法二:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到popfd处(和开始的pushfd对应)
方法三:2次内存镜像法
ALT+M(到程序段)—>在00401000设置访问中断(F2)—>Shift+F9—>向下运行几步便可以看到popfd
方法五:模拟跟踪法
ALT+M(到程序段)查找包含SFX,imports,relocations的区段—>输入命令“tc eip<[地址]”—>到达OEP或者需要向下运行几步
方法六(一般试用3.0之前的):
命令下断点“at GetVersion”—>在下方retn处下断点—>运行到此—>取消断点—>F8—>向上拉一点代码可以看到oep(55)
版本:v2.4
方法一:ESP定律法
单步运行,发现ESP值变换
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行(到达popfd)—>删除硬件断点—>F8到OEP
版本:NsPack 3.7 -> LiuXingPing
方法一:ESP定律法
单步运行,发现ESP值变换
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行(到达popfd)—>删除硬件断点—>F8到OEP
4)FSG壳
FSG 2.0 -> bart/xt
方法一:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到三个连续跳转处,其中jmp(无条件跳转)跳转之后即为OEP
方法二:ESP定律法
push后根据寄存器ESP的值在数据窗口跟随(命令:dd [ESP] )
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行—>删除硬件断点—>F8到OEP
方法三:FSG 2.0 专用ESP定律法
当执行到popad后一条代码时,查看堆栈窗口,第四条的数值即为OEP地址,反汇编窗口跟随,设置硬件断点,运行即可到OEP
5)PECompact壳
PECompact 2.x -> Jeremy Collake
方法1:单步跟踪
使程序只执行向下跳转,不让向上跳,当执行某些call程序出现时,咋则重新加载进入call单步跟踪,直到找到OEP
方法二:ESP定律法
push后根据寄存器ESP的值在数据窗口跟随(命令:dd [ESP] )
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行—>删除硬件断点—>F8到OEP
方法三:BP VirtualFree
命令添加断点(BP VirtualFree)—>Shift+F9—>取消断点—>返回到用户代码(Alt+F9)—>查找push 8000(特征码)并运行到此—>F8到OEP
方法四:BP VirtualFree
命令添加断点(BP VirtualFree)—>Shift+F9—>Shift+F9—>取消断点—>返回到用户代码(Alt+F9)—>F8到OEP
方法五:bp [开始mov的地址]
bp [开始mov的地址]—>Shift+F9—>在retn下面下断点—>Shift+F9—>F8到OEP
方法六:bp VirtualAlloc
命令添加断点(BP irtualAlloc)—>Shift+F9—>取消断点—>返回到用户代码(Alt+F9)—>向下拉看到JMP运行到这—>F8到OEP
方法七:最后一次异常法
选项—>调试设置—>异常—>忽略所有异常(取消所有勾)—>重新载入—>Shift+F9(直到程序跑飞,记录次数)—>重新载入—>Shift+F9(刚才记录的次数-1)—>堆栈窗口查找SE句柄—>CTRL+G—>堆栈窗口句柄对应的值(十六进制形式)—>在retn下面下断点—>Shift+F9—>F8到OEP
方法八:2次内存镜像法
AALT+M(到程序段)—>在第一个.rsrc设置访问中断(F2)—>Shift+F9—>ALT+M(到程序段)—>在00401000设置访问中断(F2)—>Shift+F9—>在retn下面下断点—>Shift+F9—>F8到OEP
方法九:at GetVersion
命令下断点“at GetVersion”—>在下方retn处下断点—>运行到此—>取消断点—>F8—>向上拉一点代码可以看到OEP
6)EZIP壳
EZIP 1.0
入口很多JMP
方法一:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到三个连续跳转处,其中jmp(无条件跳转)跳转之后即为OEP
方法二:ESP定律法
JMP后、push后根据寄存器ESP的值在数据窗口跟随(命令:dd [ESP] )
断点—>硬件访问—>Word(命令:hr [ESP] )—>运行—>删除硬件断点—>F8到OEP
7)tElock 0.98b1壳
方法一:最后一次异常法
选项—>调试设置—>异常—>忽略所有异常(取消所有勾)—>重新载入—>Shift+F9(直到程序跑飞,记录次数)—>重新载入—>Shift+F9(刚才记录的次数-1)—>堆栈窗口查找SE句柄—>CTRL+G—>堆栈窗口句柄对应的值(十六进制形式)—>下断点—>Shift+F9—>取消断点—>F8到OEP
方法二:模拟跟踪法
选项—>调试设置—>异常—>忽略所有异常(取消所有勾)—>重新载入—>Shift+F9(直到程序跑飞,记录次数)—>重新载入—>Shift+F9(刚才记录的次数-1)—>堆栈窗口查找SE句柄—>CTRL+G—>堆栈窗口句柄对应的值(十六进制形式)—>下断点—>Shift+F9—>取消断点—>ALT+M(到程序段)查找包含SFX,imports,relocations的区段—>输入命令“tc eip<[地址]”—>到达OEP或者需要向下运行几步
方法三:2次内存镜像法
ALT+M(到程序段)—>在第一个.rsrc设置访问中断(F2)—>Shift+F9—>ALT+M(到程序段)—>在00401000设置访问中断(F2)—>Shift+F9—>OEP
8)EXE32PACK壳
EXE32Pack 1.3x
方法一:ESP定律法
F8后、push后根据寄存器ESP的值在数据窗口跟随(命令:dd [ESP] )
右键断点—>硬件访问—>Word(命令:hr [ESP] )—>运行—>删除硬件断点—>F8到OEP
方法二:BP IsDebuggerPresent
命令(BP IsDebuggerPresent)—>运行—>ALT+F9—>F8一次—>计算ss+edi—>CTRL+G直接转到OEP
9)WinUpack壳
方法一:单步+条件跳转
单步跟踪到oep跳转(跳转未实现)—>右键加条件断点—>运行—>取消断点—>F8到OEP
10)壳的分类:压缩壳、加密壳
基本方法:
1、单步
2、ESP定律
3、内存镜像
4、模拟跟踪(2种)
5、最后一次异常
1)、SFX跟踪
2)、tc eip<xxxx
6、特殊
常见语言入口点:
VB:
004012D4 > 68 54474000 push QQ个性网.00404754
004012D9 E8 F0FFFFFF call <jmp.&MSVBVM60.#100>
004012DE 0000 add byte ptr ds:[eax],al
004012E0 0000 add byte ptr ds:[eax],al
004012E2 0000 add byte ptr ds:[eax],al
004012E4 3000 xor byte ptr ds:[eax],al
004012E6 0000 add byte ptr ds:[eax],al
004012E8 48 dec eax
delphi:
004A5C54 > 55 push ebp
004A5C55 8BEC mov ebp,esp
004A5C57 83C4 F0 add esp,-10
004A5C5A B8 EC594A00 mov eax,openpro.004A59EC
BC++:
00401678 > /EB 10 jmp short btengine.0040168A
0040167A |66:623A bound di,dword ptr ds:[edx]
0040167D |43 inc ebx
0040167E |2B2B sub ebp,dword ptr ds:[ebx]
00401680 |48 dec eax
00401681 |4F dec edi
00401682 |4F dec edi
00401683 |4B dec ebx
00401684 |90 nop
00401685 -|E9 98005400 jmp 00941722
0040168A \A1 8B005400 mov eax,dword ptr ds:[54008B]
0040168F C1E0 02 shl eax,2
00401692 A3 8F005400 mov dword ptr ds:[54008F],eax
00401697 52 push edx
00401698 6A 00 push 0
0040169A E8 99D01300 call <jmp.&KERNEL32.GetModuleHandleA>
0040169F 8BD0 mov edx,eax
VC++:
0040A41E > 55 push ebp
0040A41F 8BEC mov ebp,esp
0040A421 6A FF push -1
0040A423 68 C8CB4000 push 跑跑排行.0040CBC8
0040A428 68 A4A54000 push <jmp.&MSVCRT._except_handler3>
0040A42D 64:A1 00000000 mov eax,dword ptr fs:[0]
0040A433 50 push eax
0040A434 64:8925 0000000>mov dword ptr fs:[0],esp
0040A43B 83EC 68 sub esp,68
0040A43E 53 push ebx
0040A43F 56 push esi
0040A440 57 push edi
MASM(汇编):
004035C9 > 6A 00 push 0
004035CB E8 A20A0000 call <jmp.&kernel32.GetModuleHandleA>
004035D0 A3 5B704000 mov dword ptr ds:[40705B],eax
004035D5 68 80000000 push 80
004035DA 68 2C754000 push 11.0040752C
004035DF FF35 5B704000 push dword ptr ds:[40705B]
004035E5 E8 820A0000 call <jmp.&kernel32.GetModuleFileNameA>
004035EA E8 87070000 call 11.00403D76
004035EF 6A 00 push 0
004035F1 68 0B364000 push 11.0040360B
004035F6 6A 00 push 0
004035F8 6A 64 push 64
004035FA FF35 5B704000 push dword ptr ds:[40705B] |
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 学习及教程|主题: 1126, 订阅: 1118
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|