ximo脱壳基础(个人学习汇总记录 一 )
0x01假期学习了”ximo脱壳基础“,学习过程中有一些记录发出来可以供大家参考。记录中步骤都是以“ximo脱壳基础”中的例子为参考,部分壳进行时需要根据具体情况进行改变,这里的总结步骤不是绝对的过程。
有些方法是通用的,所以会重复出现。
0x02
1)UPX壳(压缩壳)
方法一:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到popad处(和开始的pushad对应),后面的jmp大跳跳转到oep
方法二:ESP定律法
pushad后根据寄存器ESP的值在数据窗口跟随(命令:dd )
断点—>硬件访问—>Word(命令:hr )—>运行—>删除硬件断点—>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 )
右键断点—>硬件访问—>Word(命令:hr )—>运行—>删除硬件断点—>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 )—>运行(到达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 )—>运行(到达popfd)—>删除硬件断点—>F8到OEP
版本:NsPack 3.7 -> LiuXingPing
方法一:ESP定律法
单步运行,发现ESP值变换
断点—>硬件访问—>Word(命令:hr )—>运行(到达popfd)—>删除硬件断点—>F8到OEP
4)FSG壳
FSG 2.0 -> bart/xt
方法一:单步跟踪
使程序只执行向下跳转,不让向上跳,直到运行到三个连续跳转处,其中jmp(无条件跳转)跳转之后即为OEP
方法二:ESP定律法
push后根据寄存器ESP的值在数据窗口跟随(命令:dd )
断点—>硬件访问—>Word(命令:hr )—>运行—>删除硬件断点—>F8到OEP
方法三:FSG 2.0 专用ESP定律法
当执行到popad后一条代码时,查看堆栈窗口,第四条的数值即为OEP地址,反汇编窗口跟随,设置硬件断点,运行即可到OEP
5)PECompact壳
PECompact 2.x -> Jeremy Collake
方法1:单步跟踪
使程序只执行向下跳转,不让向上跳,当执行某些call程序出现时,咋则重新加载进入call单步跟踪,直到找到OEP
方法二:ESP定律法
push后根据寄存器ESP的值在数据窗口跟随(命令:dd )
断点—>硬件访问—>Word(命令:hr )—>运行—>删除硬件断点—>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 )
断点—>硬件访问—>Word(命令:hr )—>运行—>删除硬件断点—>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 )
右键断点—>硬件访问—>Word(命令:hr )—>运行—>删除硬件断点—>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:,al
004012E0 0000 add byte ptr ds:,al
004012E2 0000 add byte ptr ds:,al
004012E4 3000 xor byte ptr ds:,al
004012E6 0000 add byte ptr ds:,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:
0040167D |43 inc ebx
0040167E |2B2B sub ebp,dword ptr ds:
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:
0040168F C1E0 02 shl eax,2
00401692 A3 8F005400 mov dword ptr ds:,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 00000000mov eax,dword ptr fs:
0040A433 50 push eax
0040A434 64:8925 0000000>mov dword ptr fs:,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:,eax
004035D5 68 80000000 push 80
004035DA 68 2C754000 push 11.0040752C
004035DF FF35 5B704000 push dword ptr ds:
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: 本帖最后由 smile1110 于 2019-4-1 21:01 编辑
@zqw脱壳的意义有,但是目前不大,因为强加密壳虽然不少家伙能脱出来,像是vmp 3.x ,比如3.4没有人愿意告诉你oep 特征的,xx28, 像是tmd 2.x 比如2.46,脱出来的冗余资源如何修复,以及脱的脚本也没有人愿意分享出来的。至于压缩壳,再冷门的也不会在这些主流国内外软件上出现,大部分软件上面就没有壳。少年,还是学点别的,强加密壳不需要脱,而且脱的机会也不多,当然有,比如d加密上面就有vmp的vrm,但是这些占比稀少,压缩壳这种东西除了出于体积考虑外,已经失去存在意义了。脱壳和单步能力,在日益完善的反调试机制下,也很难使用,所以学得别的,ximo 血色玫瑰冷血书生 天草这些大神的教程多数已经不跟主流的俄国和美国调试方法一致了,主流的基础必须要学,但是践行和理论是不一致的,因为这次靶子是具有代表性的,而实际是,没有作者会标准化的竞技,况且利益驱使下,除算法外基本都在变化。我最后补充一下,所有开放的成果展示,除原理性外,其已经存在被淘汰的可能了,至于这些堆栈指针原理和main函数原理,所有人都知道,等同于所有人的起步基础是相同的,而这明显非准确真实的,国内大部分技术源于03-06年西班牙和俄国,这些基本已经淘汰掉了,目前主流是澳洲 以色列 俄国的一些新想法。我打这么多字不是为了装b,而是说,你能从有限的知识中看出无限的东西,才可能站在这个舞台上,而这个舞台从来没有因为新手而表现出薄弱的地方,因商业化的自由市场已经彻底改变了竞技性规则,若是单纯总结的话,价值稀薄。不信可以问问所熟知的大佬,有几个会这些主观臆测,过分解读的东西,我没有说这些东西不好,大神不给力,而是说,脱离实际不是解决问题,更前沿专业的原因是,因为他们从一开始就没有选择打固定靶。上述这些我都不会,但是能干掉这些压缩壳,打smc补丁就是了,至于强加密壳我能脱掉或者是直接带壳调试,若是我不会办,直接让anew大神帮忙脱就是啦,解决问题方法有很多,就偏偏没有这么死板的。少年,要灵活发挥自己 智慧,这是竞技的核心。 zqw 发表于 2019-4-1 21:47
确实,在对一些主流软件分析时基本上是没遇到什么壳的妨碍的。
对固定靶的操作意义现在很大的是作为一个 ...
当你把学会的都忘记的时候,就该入门了,为不为而为有为,重复别人的路没有意义 ℡小疯、 发表于 2019-4-1 18:18
16年就注册了,现在才学这些?
:Dweeqw之前懒惰了{:1_907:}之前学的断断续续,也没做好记录,这次假期就专门完整过了一遍,之前只看从来没发表过什么,这次学完想着留下点东西就发出来了{:1_907:} 赞 收集总结的很好 fengwolf3 发表于 2019-4-1 18:01
赞 收集总结的很好
:lol学习过程的总结:lol 作为菜鸟的我总感觉差了不少东西{:301_1004:} 16年就注册了,现在才学这些? ℡小疯、 发表于 2019-4-1 18:18
16年就注册了,现在才学这些?
呵,像我这样没学完的大有人在。。。。 不错,如果我有你一半的毅力就不会有今天半桶水的下场了 大神总结的太好了