吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8803|回复: 40
收起左侧

[分享] ximo脱壳基础(个人学习汇总记录 一 )

  [复制链接]
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]

免费评分

参与人数 18吾爱币 +15 热心值 +15 收起 理由
52lxw + 1 我很赞同!
canoa + 1 用心讨论,共获提升!
cpj1203 + 1 谢谢@Thanks!
下弦乀月 + 1 + 1 用心讨论,共获提升!
fa00x + 1 + 1 热心回复!
海天一色001 + 1 + 1 用心讨论,共获提升!
spchen + 1 + 1 用心讨论,共获提升!
Mr.Eleven + 1 谢谢@Thanks!
chenhanquan0 + 1 + 1 热心回复!
sikisi0 + 1 + 1 热心回复!
fashion111 + 1 + 1 我很赞同!
Roachsa + 1 + 1 我很赞同!
zjf6311 + 1 谢谢@Thanks!
求求你们别学了 + 1 + 1 我很赞同!
异常马粥 + 1 热心回复!
LingMo + 1 + 1 不错的总结
Carrot-Chou + 1 + 1 有心了
tianlanghd + 1 + 1 今日必须是你

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

smile1110 发表于 2019-4-1 20:43
本帖最后由 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大神帮忙脱就是啦,解决问题方法有很多,就偏偏没有这么死板的。少年,要灵活发挥自己 智慧,这是竞技的核心。

免费评分

参与人数 1热心值 +1 收起 理由
cloudwater + 1 我觉得你说的很有道理,所以我决定努力赚钱,让各位dalao帮我脱壳加密等等~.

查看全部评分

smile1110 发表于 2019-4-2 01:01
zqw 发表于 2019-4-1 21:47
确实,在对一些主流软件分析时基本上是没遇到什么壳的妨碍的。
对固定靶的操作意义现在很大的是作为一个 ...

当你把学会的都忘记的时候,就该入门了,为不为而为有为,重复别人的路没有意义
 楼主| zqw 发表于 2019-4-1 18:45
℡小疯、 发表于 2019-4-1 18:18
16年就注册了,现在才学这些?

之前懒惰了之前学的断断续续,也没做好记录,这次假期就专门完整过了一遍,之前只看从来没发表过什么,这次学完想着留下点东西就发出来了
fengwolf3 发表于 2019-4-1 18:01
赞 收集总结的很好
 楼主| zqw 发表于 2019-4-1 18:04
fengwolf3 发表于 2019-4-1 18:01
赞 收集总结的很好

学习过程的总结
GJH588 发表于 2019-4-1 18:07
作为菜鸟的我总感觉差了不少东西
℡小疯、 发表于 2019-4-1 18:18
16年就注册了,现在才学这些?
头像被屏蔽
lf1314 发表于 2019-4-1 18:26
提示: 作者被禁止或删除 内容自动屏蔽
月清晖 发表于 2019-4-1 18:27
℡小疯、 发表于 2019-4-1 18:18
16年就注册了,现在才学这些?

呵,像我这样没学完的大有人在。。。。
mycc 发表于 2019-4-1 18:28
不错,如果我有你一半的毅力就不会有今天半桶水的下场了
心中的影子 发表于 2019-4-1 18:39
大神总结的太好了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 14:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表