`
cfree
  • 浏览: 18538 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

脱壳基础(三)

阅读更多
一般的压缩壳,如Aspack等都有专用的脱壳机 。而加密壳(如ASProtect,Armadillo)一般很少有脱壳机,必须手工脱壳。手工脱壳一般情况是分三步:
一是查找程序的真正入口点(OEP);
二是抓取内存映像文件;
三是输入表重建。(当然现在的加密壳复杂些,要考虑更多的东西)


常见的脱壳七方法(天草)
方法1:单步跟踪法

1.用OD载入,点"不分析代码!"
2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4)
3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点-->运行到所选)
4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!
5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP
6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入
7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的一般很快就会到程序的OEP。

Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->"跟随",然后F2下断,Shift+F9运行停在"跟随"的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP!
 
方法2:ESP定律法

ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)
1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)
2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!
3.选中下断的地址,断点--->硬件访--->WORD断点。
4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。

方法3:内存镜像法

1:用OD打开软件!
2:点击选项--调试选项--异常,把里面的忽略全部√上!CTRL+F2重载下程序!
3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP!


方法4:一步到达OEP

1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPX,ASPACK壳),然后按下F2,F9运行到此处
2.来到大跳转处,点下F8,到达OEP!

方法5:最后一次异常法

1:用OD打开软件
2:点击选项--调试选项--异常,把里面的√全部去掉!CTRL+F2重载下程序
3:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m!
4:CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)
5:在OD的右下角我们看见有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!
6:按F2下断点!然后按SHIFT+F9来到断点处!
7:去掉断点,按F8慢慢向下走!
8:到达程序的OEP!

方法6:模拟跟踪法
1:先试运行,跟踪一下程序,看有没有SEH暗桩之类(运行出现错误就是有SEH暗桩)
2:ALT+M打开内存镜像,找到(包含=SFX,imports,relocations)

内存镜像,项目 30
地址= 0054B000
大小=00002000 (8192.)
Owner=check    00400000
区段=.aspack
包含=SFX,imports,relocations
类d0cd=Imag 01001002
访问=R
初始访问=RWE
3:地址为0054B000,如是我们在命令行输入tc eip<0054B000,回车,正在跟踪ing。。
Btw:大家在使用这个方法的时候,要理解他是要在怎么样的情况下才可以使用

方法7:"SFX"法

1:设置OD,忽略所有异常,也就是说异常选项卡里面都打上勾
2:切换到SFX选项卡,选择"字节模式跟踪实际入口(速度非常慢)",确定。
3:重载程序(如果跳出是否"压缩代码?"选择"否",OD直接到达OEP)

Btw:这种方法不要滥用得好,锻炼能力为妙。


去自校验_________________________________________________________________________________________________

————————
PS:忘记是哪位大牛的东西了O(∩_∩)O~
————————
去自校验法
校验一般类型:多为比较文件大小,可将程序用十六进制编辑工具未脱壳得原程序加大体积会不会不能运行,或者将脱壳了的程序重新加个壳看能不能运行。还有比较程序名字的也常见(不过这个没有强度可以忽略)。
去校验一般方法:下好相应的断点,然后开两个od比较调试。
常用断点~
BP GetVersion
BP GetCommandLineA
BP GetStartupInfoA
BP GetModuleHandleA
BP CreateFileA→对付vb程序
BP SetFilePointer→对付delphi
BP GetFileSize→对付对delphi
BP CreateFile→开两个OD比较(中断后都Alt+F9返回)
BP CreateFileA→开两个OD比较(中断后都Alt+F9返回)
BP ExitProcess→程序退出回溯找到关键断点

vb程序
1、下rtcFileLen、rtcFileLength断点
2、P-code编译的vb程序用WKTVBDE调试


一、
一般说来,对软件脱壳是不会改变原软件的运行机制的。它只是将加密的IAT地址还原成装载前的API函数名字串的地址,并以明码方式显示。脱壳是否成功的标志是软件运行前图标与脱壳前一致、运行时windows并未发出"……,初始化失败……"的警告,那么脱壳大体是成功的。若出现初始化失败警告,则百分之百是IID表或IAT表搞错了。

二、
用OD加载时出现"异常"或直接运行时,windows弹出"发送错误报告"消息。
原因:
(1)OEP入口地址错误;
(2)在手动脱壳时"张冠李戴",把某函数的地址写到了另一个函数的地址上去了。

三、
软件一运行就退出
1.原因:
  (1)如果脱壳前软件能(直接)运行,脱壳后软件一闪而过,说明软件有"文件校验"。软件脱壳前后的最大变化是文件尺寸变化,那么软件的"校验和"一定要发生变化,当它发现"校验和"变了时,知道了你对软件"动了手脚",它就毫不犹豫地退出了。若这时你想找到"文件校验"的位置,无异于大海捞针!
  (2)如果脱壳后能直接运行,但用OD加载时就退出或有无法跳过的异常,则是有"反跟踪"部件。(这和脱不脱壳没有关系)反跟踪不是本文今天讨论的内容,只是附带说一声。
 
  2.对策:
  在一个软件中去找出它的"文件检验"代码在什么地方,同样得用"思想",和破案也差不多。别急,先看看它是什么语言编写的。若是用"VC++"或"Delphi"编写的,则脱壳后的软件对于使用者,则基本上没有秘密可言。唯一的是它们的"call"嵌套太深,要进行底层的跟踪,很容易跟丢。举个例子,说明跟踪方法。
  有个商业软件,脱壳前可以运行,脱壳后就不能运行了。它是用"VC++"编写的。
 
  3.破解思路:
  用"VC++"或"Delphi"来编写软件,有它快捷方便的一面。但是,因为它不能直接对内存进行操作,所以灵活性受到很大影响。例如,它就不能对运行中的内存文件进行"校验和"检验,若非要检验,除非在VC编程中嵌入ASM代码,但这样一来,地址的起点和终点难于确定,且给调试带来麻烦。一个变通的办法是:打开同一文件的一个"副本",检验它"副本"的"校验和"也可以达到对自身检验的目的。这样一来,软件的秘密也就暴露无遗了,用OD来查看(已经脱壳的)软件怎样打开另一个文件,那实在是"再容易"不过的事情了!
 
  4.具体操作:
  (1)用OD打开要跟踪的软件,右键打开搜索"所有模块间的调用",在所有"CreateFile"和"ReadFile"的调用地址上设断点。
  (2)运行OD,按"F9",中断在一个CreateFile上:

CreateFile中断:(该函数的返回值是被打开文件的句柄)
……………………………………………………………………
0013E708    0013E90C  |FileName = "E:\\xxxx\\New_xxxxxxx.exe"
0013E70C    80000000  |Access = GENERIC_READ
0013E710    00000003  |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0013E714    00000000  |pSecurity = NULL
0013E718    00000003  |Mode = OPEN_EXISTING
0013E71C    00000080  |Attributes = NORMAL
0013E720    00000000  \\hTemplateFile = NULL
……………………………………………………………………
  以上是堆帐中的显示,其中,FileName = "E:\\xxxx\\New_xxxxxxx.exe"是将要打开的文件。若不是正在运行中的同名文件,则继续按"F9"。其余的参数是打开方式,不重要。

  监视CreateFile中断的另一个收获是知道了该软件在硬盘上写入了哪些文件,比如注册表中、系统文件夹中等(我最讨厌那些在硬盘中乱写文件的软件)。更重要的是,若软件有"反跟踪"代码,那么"CreateFile"或"FindWindow"等API函数调用时,它明码显示的文件名或窗口名是某个"调试软件",就表明它在"反跟踪",若发现了它们,相应的"反-反跟踪"措施也应该不是太困难的事。当然,高明的作者用VC也会让你伤透脑筋。
  当FileName="正在运行的文件名时", 再按"F9"来到ReadFile的中断上:

  ReadFile中断:
…………………………………………………………
0013E708    000001C0  |hFile = 000001C0   
0013E70C    0013EA10  |Buffer = 0013EA10
0013E710    00001000  |BytesToRead = 1000 (4096.)
0013E714    0013E71C  |pBytesRead = 0013E71C
0013E718    00000000  \\pOverlapped = NULL
0013E71C    00000000
0013E720    00001000
0013E724    004C5CD7 
0013E728    0000016F  ;调用次数记录
…………………………………………………………
  其中,hFile = 000001C0是打开的文件句柄,Buffer = 0013EA10是保存读入数据的地址,BytesToRead = 1000 (4096.)是读入的字节数,其余的不重要。 
  由于一个软件,不可能只有1000h字节,一次不能读完,所以ReadFile要调用多次,调用的次数总可以在某个寄存器中或堆帐中找到,这里(0013E728 :0000016F)就是递减的调用次数。每调用一次,后面的程序就将这1000h字节累加一次,稍加跟踪就到了"校验和"代码处:

(3)文件"校验和"代码: 
……………………………………
004E0164    .  8D85 E0EFFFFF  lea eax,dword ptr ss:[ebp-1020]  ;eax=读入字节存放地址
004E016A    >  33C9            xor ecx,ecx
004E016C    .  8A08            mov cl,byte ptr ds:[eax]
004E016E    .  014D EC        add dword ptr ss:[ebp-14],ecx  ;[ebp-14]=累加值
004E0171    .  40              inc eax
004E0172    .  4A              dec edx        ;1000h字节的计数
004E0173    .^ 75 F5          jnz short 004E016A               
004E0175    >  4B              dec ebx        ;调用次数计数
004E0176    .^ 75 C6          jnz short 004E013E               
004E0178    >  836D EC 7B      sub dword ptr ss:[ebp-14],7B  ;累加完成后的修正
004E017C    .  8D85 48EDFFFF  lea eax,dword ptr ss:[ebp-12B8]
004E0182    .  E8 B564F2FF    call 0040663C                   
………………………………………
  累加结果存放在[ebp-14]=0013FA1C中。
  不停地按"F9",并b9db查(0013E728 :0000016F)中的值,当它变为1时,就单步跟踪,"比较转跳"代码就近在咫尺了。

  (4)"比较转跳"代码: 
………………………………………
004E0182    .  E8 B564F2FF    call 0040663C        ;这就是前面的最后一行                     
004E0187    .  E8 E826F2FF    call 00402874        ;释放一些内存等善后(VC特有)                 
004E018C    .  837D F4 00      cmp dword ptr ss:[ebp-C],0 
004E0190    .  75 22          jnz short 004E01B4               
004E0192    .  8B45 E4        mov eax,dword ptr ss:[ebp-1C]  ;取0013FA14的检验值
004E0195    .  3B45 EC        cmp eax,dword ptr ss:[ebp-14]  ;和累加值比较
004E0198      75 13          jnz short 004E01AD    ;最关键的(非0)转跳             
004E019A    .  BB 01000000    mov ebx,1
004E019F    .  8B45 FC        mov eax,dword ptr ss:[ebp-4]
004E01A2    .  FE80 10450100  inc byte ptr ds:[eax+14510]
004E01A8    .  E9 96000000    jmp 004E0243                     
004E01AD    >  33DB            xor ebx,ebx
004E01AF    .  E9 8F000000    jmp 004E0243 

5.修改代码:
  到了现在,文件检验和转跳都清楚了,修改就变得十分简单,只需将:(用16进制编辑器)
……………………………………………………………………
004E0198  75 13    jnz short 004E01AD    ;改为:90 90  nop  ,nop
…………………………………………………………………………
  存盘,大功告成了。怎么样?一个大海捞针的工作变得谨然有序。运行一切正常。
分享到:
评论

相关推荐

    脱壳基础知识入门电子书(脱壳技巧)

    《脱壳基础知识入门》电子书主要探讨的是计算机安全领域中的一个重要话题——脱壳技术。脱壳,简单来说,就是从程序的外壳中提取出原始代码的过程,通常用于对抗恶意软件的反逆向工程策略。在本电子书中,作者将为...

    零基础脱壳破解第三课

    零基础脱壳破解第一课,大家一起学习脱壳,不再被骗子欺骗。。

    VMP脱壳脚本(VMProtect)

    根据提供的内容,“VMP脱壳脚本”提供了三种不同的使用方法: 1. **搜索API Holder Address**:搜索API持有者地址,通常用于找到程序中存储API信息的具体位置。 2. **搜索OEP/SubRoutine Address**:搜索原始入口...

    万用脱壳机 RL!dePacker

    一、脱壳基础 脱壳,顾名思义,就是移除程序表面的保护层,这层保护层通常被称为"壳"。壳可能包含混淆代码、反调试机制甚至自解压逻辑,旨在防止恶意软件被轻易分析。常见的壳有UPX、PEpack、Themida等。RL!...

    总结的一个VMP脱壳步骤

    例如上面的地址是0042A000,我一般就在这个基础上减到420000搜索程序的特征段,当然我们也可以直接跳到401000开始搜索。虽然我们搜索的范围比较大,但是因为我们搜索的是命令序列,所以工作量还不是很大。 废话不多...

    exe文件脱壳步骤txt下载

    #### 三、脱壳的基本步骤 **脱壳**是指去除程序中的壳,恢复其原始状态的过程。脱壳的目的是为了让用户能够更深入地了解程序内部结构或修复程序缺陷。 **脱壳成功的标准:** 1. **程序正常运行**:脱壳后的程序...

    andriod常见脱壳方法

    #### 三、脱壳的核心技巧 接下来将详细介绍几种常见的脱壳方法: ##### 1. 分析加固逻辑 - **目标**:理解加固者的逻辑,找出加固过程中的漏洞或者不足之处。 - **方法**: - 使用反编译工具如APKTool或JADX对...

    逆向分析脱壳技巧总结

    #### 一、脱壳基础知识要点 在逆向工程领域,脱壳是一项重要的技能,尤其是针对那些被加壳保护的软件。了解基础概念是开始学习脱壳的第一步。 - **PUSHAD**: 这条指令通常用于保存程序的所有寄存器状态至堆栈中,...

    新手学习脱壳的入门篇

    #### 二、脱壳基础知识 脱壳通常包括以下几个步骤:查壳、寻找原入口点(OEP)、Dump(备份)与修复。本文将重点介绍查壳与寻找OEP的技巧。 ##### 1. 查壳 查壳是指识别出软件是否被加壳及其类型。常见的查壳工具包括...

    二进制脱壳

    #### 三、具体脱壳方法 ##### 1. 单步法 这种方法适用于寻找OEP。首先定位到`pushad`指令,然后通过单步执行,观察ESP的变化。当ESP指向的数据段中出现灰色部分时,通常意味着到达了OEP。此时可以通过设置硬件访问...

    fly脱壳文集(包括了EXE类DLL类和OCX类)

    在这个文集中,我们可以期待找到关于如何对这三种类型的二进制文件进行脱壳的详细教程和指导。 EXE(可执行文件)是Windows操作系统中的程序文件,包含了运行应用程序所需的全部指令。DLL(动态链接库)是共享代码...

    详细介绍了脱壳常用的esp定律

    - 记录下EBP的值,并以此为基础进行OEP的定位。 #### 总结 ESP定律是脱壳过程中的一项关键技术,通过观察ESP寄存器的值变化来定位OEP。然而,在某些复杂情况下,仅依赖ESP定律可能不足以解决问题。这时,“推广的...

    蚕豆脱壳机设计cad图纸毕业生设计书.zip

    2. **机械设计基础**:包括力学、材料科学、工程制图等方面的知识,用于设计和分析机械结构。 3. **CAD应用技巧**:如何使用CAD软件绘制精确的二维工程图和三维模型,以及使用工具进行测量、标注、装配等操作。 4. *...

    脱壳入门初级教学

    - **重要性**:理解PE格式对于进行脱壳操作至关重要,因为这是分析可执行文件的基础。 - **组成**:PE文件由多个部分构成,包括DOS头、PE签名、文件头、可选头、节表等。 - **DOS头**:位于文件开头,包含一个小的...

    安卓逆向学习笔记之FART中的脱壳点.docx

    #### 三、脱壳点概述 脱壳点是指在逆向过程中能够有效地定位到壳代码的位置,并从中获取原始代码的入口点。对于FART而言,脱壳点的选择至关重要,因为它直接影响到脱壳的效率和成功率。 #### 四、脱壳点选择 根据...

    解密之脱壳入门.pdf

    ### 解密之脱壳入门知识点解析 #### 一、PE文件格式详解 PE(Portable Executable File Format)即可移植的执行体文件格式,是Windows操作系统下主要...通过上述内容的学习,可以为深入理解脱壳技术打下坚实的基础。

    机械毕业设计——蚕豆脱壳机设计(论文+DWG图纸).zip

    二是DWG(AutoCAD Drawing)图纸,这是机械设计中的标准格式,用于展示设备的三维模型、装配图、零件图等,便于制造和组装。 在蚕豆脱壳机的设计过程中,学生可能需要考虑以下知识点: 1. **作物处理机械原理**:...

    软件破解入门教程.txt

    第1章 前言 前言 第2章 基础知识 基础知识 汇编速查手册 汇编跳转 ... 第三十三课 RichEdit 控件基础知识 第三十四课: RichEdit 控件 更多的正文操作 第三十五课 RichEdit 控件 语法高亮显示

    XX市集体经济“空壳村”脱壳汇报材料范文.docx

    【XX市集体经济“空壳村”脱壳汇报材料】展示了该市如何通过一系列措施成功消除集体经济“空壳村”的情况。这些措施主要包括以下几个方面: 1. **党建引领**:XX市将发展壮大村级集体经济视为基层党建工作的核心...

Global site tag (gtag.js) - Google Analytics