ESP定律 和手动脱壳原理分析 <转>

ESP定律实战:手动脱壳技巧与堆栈平衡原理 本文详细介绍了ESP定律在手动脱壳中的实战应用,重点解析堆栈平衡原理及其在ASPack等常见壳脱壳过程中的关键作用。通过一步步操作指南和常见问题解决方案,帮助逆向工程初学者掌握利用ESP寄存器变化定位原始程序入口点(OEP)的核心技巧,提升手动脱壳能力。 阅读详情
原文地址: http://hi.baidu.com/love_fj1314/blog/item/b82544cfea83b05a0fb34593.html
ESP定律手动脱壳原理分析

一.准备知识
在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。
1.call
这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。call真正的意义是什么呢?我们可以这样来理解:

1.向堆栈中压入下一行程序的地址;
2.JMP到call的子程序地址处。
例如:
00401029.E8   DA240A00    call 004A3508
0040102E.5A                      pop edx
在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!

2.RETN
与call对应的就是RETN了。对于RETN我们可以这样来理解:
1.将当前的ESP中指向的地址出栈;
2.JMP到这个地址。
这个就完成了一次调用子程序的过程。在这里关键的地方是:如果我们要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RETN这条指令之前,ESP指向的是我们压入栈中的地址。这也就是著名的“堆栈平衡”原理!

3.狭义ESP定律
ESP定律的原理就是“堆栈平衡”原理。
让我们来到程序的入口处看看吧!
1.这个是加了ASPACK壳的入口时各个寄存器的值!
EAX 00000000
ECX 0012FFB0
EDX 7FFE0304   //堆栈值
EBX 7FFDF000   //堆栈值
ESP 0012FFC4
EBP 0012FFF0
ESI 77F57D70 ntdll.77F57D70
EDI 77F944A8 ntdll.77F944A8
EIP 0040D000 ASPACK.<ModuleEntryPoint>
2.这个是ASPACK壳JMP到OEP后的寄存器的值!
EAX 004010CC ASPACK.004010CC
ECX 0012FFB0
EDX 7FFE0304   //堆栈值
EBX 7FFDF000   //堆栈值
ESP 0012FFC4
EBP 0012FFF0
ESI 77F57D70 ntdll.77F57D70
EDI 77F944A8 ntdll.77F944A8
EIP 004010CC ASPACK.004010CC

呵呵~是不是除了EIP不同以外,eax保存当前OEP值,其他都一模一样啊!//oep就是程序的入口点
为什么会这样呢?我们来看看


0040D000 A>   60                pushad   //注意这里ESP=0012FFC4
0040D001      E8 00000000       call ASPACK.0040D006   //ESP=0012FFA4

PUSHAD就是把所有寄存器压栈!我们在到壳的最后看看:

0040D558      61                popad   //ESP=0012FFA4
0040D559      75 08             jnz short ASPACK.0040D563 //注意这里ESP=0012FFC4

也就是说当我们对ESP的0012FFA4下硬件访问断点之后。当程序要通过堆栈访问这些值
,从而恢复原来寄存器的值,准备跳向苦苦寻觅的OEP的时候,OD帮助我们中断下来。

小结:我们可以把壳假设为一个子程序,当壳把代码解压前和解压后,他必须要做的是遵循堆栈平衡的原理。

因为大家对ESP理解各有异同,但是,大同小异!一般理解可以为:
1、在命令行下断hr esp-4(此时的ESP就是OD载入后当前显示的值)
2、hr ESP(关键标志下一行代码所指示的ESP值(单步通过))

5.总结

现在我们可以轻松的回答一些问题了。

1.ESP定律的原理是什么?
堆栈平衡原理。

2.ESP定律的适用范围是什么?
几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用。但是在何时下断点避开校验,何时下断OD才能断下来,这还需要多多总结和多多积累。

3.是不是只能下断12FFA4的访问断点?

当然不是,那只是ESP定律的一个体现,我们运用的是ESP定律的原理,而不应该是他的具体数值,不能说12FFA4,或者12FFC0就是ESP定律,他们只是ESP定律的一个应用罢了!

内存断点
    1、要解决的问题是:
    1.什么是内存断点?
    2.如何在寻找OEP时使用内存断点。
  
2、内存断点寻找OEP的原理

i.   首先,在OD中内存断点和普通断点(F2下断)是有本质区别的。

内存断点等效于命令bpm,他的中断要用到DR0-DR7的调试寄存器,也就是说OD通过这些DR0-DR7的调试寄存器来判断是否断下普通断点(F2下 断)等效于bpx,他是在所执行的代码的当前地址的一个字节修改为CC(int3)。当程序运行到int3的时候就会产生一个异常,而这个异常将交给OD 处理,把这个异常给EIP-1以后,就正好停在了需要的中断的地方(这个根据系统不同会不一样),同时OD在把上面的int3修改回原来的代码。
内存断点分为:内存访问断点,内存写入断点。
我们知道,在程序运行的时候会有3种基本的状态产生:读取-->写入-->执行。

004AE242    A1 00104000   mov eax,dword ptr ds:[004AE24C]   //004AE24C处的内存读取
004AE247    A3 00104000   mov dword ptr ds:[004AE24C],eax   //004AE24C处的内存写入
004AE24C    83C0 01       add eax,1                        //004AE24C处的内存执行

   1.当对004AE24C下内存访问断点的时候,可以中断在004AE242也可以中断在004AE247。
   2.当对004AE24C下内存写入断点的时候,只能中断在004AE247。
3.当执行004AE24C的时候,只能中断在004AE24C

到这里你可能不明白了,为什么内存访问断点能中断在004AE247这一句对004AE24C的写入,而且还能中断在004AE24C的执行呢?其实很简 单,我们只要仔细体会一下“内存访问”这四个字的含义遍可以知道,当我们对004AE24C进行读取的时候需要“访问”他吧,当我对004AE24C进行 写入的时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C的代码的时候也是还是要“访问”他的!

   所以我们不难得出下面的结论:
   1.内存写入中断的地方,一定是也可以用内存访问中断。
   2.内存执行的地方,也可以用内存访问中断。

如果这时你认为,那么内存写入岂不是没用了。呵呵~那我要告诉你当然不是,如果你想快速的准确的定位到004AE247这一行的时候,那么他就大有作用了!

总结一下:内存断点不修改原代码,不会像普通断点那样因为修改代码被程序校验而导致中断失败;对于区段的访问只是区域大了一点,其原理和上面分析的三行代码是一样的。

   ii.如何使用内存断点来寻找OEP呢?
   要回答这个问题首先要回答这一个问题:壳是如何解压代码的?

正如我们知道的,壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。而这一个过程我们难道不能将他看做是对代码段(code段)的写 入吗?好了,解压完毕了。我们要从壳代码的区段JMP到原来的代码段的时候,难道不正是对代码段(code段)的执行吗?

理清了上面的关系就好办了,那么如果载入OD后,我们直接对code段下内存访问断点的时候,一定会中断在壳对code段的写入的代码的上面,就像上面的 004AE247的这一行。而如果当他把code段的代码全部解压解密完毕了以后,JMP到OEP的时候,我们是不是还可以停在OEP的代码上面呢?而且 每按下F9都会中断,因为这时code段在执行中哦!

而如果你还要继续问我为什么一定要到那个地方才可以下断呢?我难道不可以一开始就下断吗?

正入我上面所说的,如果你在前面下断很可能壳对code段还没解压完毕呢,这时如果你不停的按F9,你将会看到OD的下方不断的在提示你,“对 401000写入中断”“对401002写入中断”“对401004写入中断”.......如果你不介意按F9到他把正个code段写完的话,我除了同 情你的“F9”以外,没什么其他的意见!

   那么我们就没有别更快一点的办法了吗?
   有的!那就是我们呼之欲出的两次内存断点办法。
   怎么理解两次内存断点呢?

让我来做一个假设吧,假设我是一个壳的作者。一个EXE文件的有code段,data段,rsrc段.....依次排列在你的内存空间中,那么我会怎么解 码呢?呵呵~我比较笨一点,我会先将code段解码,然后再将data段解压,接着是rsrc段......那么你不难发现,只要你在data断或者 rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以到达OEP了吗?

   这里注意上面虽然下了两次内存访问断点,但是本质是不一样的,目的也是不一样的。

1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对对data段的解压时,这时壳要对data段写数据,但是code段已经解压 完毕。
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了。

总结一下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点,找到OEP。如果不知道,那么我们就依靠2次内存断点去找,如果还不行就用多次内存断点。总之明白了原理在多次的内存断点其实都一样。从这个过程中我们了解的是壳在对区段解码的顺序!
利用ESP定律进行脱壳 目录预备知识壳的概念UPXPEiDOllyDbg实验目的实验环境实验步骤一实验步骤二实验步骤三 预备知识 基础的汇编语言命令以及对汇编程序的基本审计能力。 壳的概念 加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。 加壳是利用特殊的算法,对EXE、DLL文件里的资源进行压缩、加密。类似WINZIP的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上通过Windows加载器载入内 阅读详情

相关推荐

x64dbg实战:ESP定律脱壳技巧与OEP定位解析

本文详细解析了在x64dbg调试器中运用ESP定律进行手动脱壳的实战技巧。通过观察堆栈指针变化、设置硬件写入断点等标准流程,可高效定位程序原始入口点,并配合Scylla插件完成内存转储与导入表修复,是逆向分析中应对常见加壳程序的核心方法。

sam99的博客 460

ESP脱壳定律

ESP脱壳定律

不凡乃大的博客 1710

手动脱壳ESP定律:定位OEP的核心动态断点技巧

ESP定律是Windows二进制逆向中用于精准定位原始入口点(OEP)的关键经验法则,其本质源于x86/x64栈机制的硬件行为——ESP作为栈顶指针,在壳代码完成解密并清栈移交执行权时,必然出现显著、可识别的增量突变。该原理不依赖壳算法细节,而依托PE结构、栈生长规律与寄存器行为指纹,具备强通用性与低工具耦合性。技术价值在于突破无符号、反调试、混淆IAT等限制,支撑CTF逆向、商业软件分析及驱动模块审计等实战场景。本文聚焦ESP突变识别、动态跟踪实操与OEP验证闭环,详解如何从寄存器变化曲线中稳定捕获脱壳临

weixin_29325515的博客 471

ESP定律脱壳详解

在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。    1.call    这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。    call真正的意义是什么呢?我们可以这样来理解:1.向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处。例如: 00401029 .   E8 DA240A00 call 004A3508

juce的专栏 5749

CTF逆向-手动脱壳实战:从UPX压缩壳到攻防世界simple-unpack解析

本文以攻防世界CTF逆向赛题simple-unpack为例,详细解析了UPX压缩壳的手动脱壳实战流程。文章深入剖析了UPX壳的技术原理与行为特征,并重点介绍了利用ESP定律定位原始入口点(OEP)的核心方法,通过x64dbg调试器一步步演示了从查壳、下断点到内存转储与修复的完整操作,帮助逆向工程新手掌握脱壳的关键技能。

gg901的博客 926

7.2 手动脱壳十步法:OEP定位、内存Dump与IAT重建

本文系统解析了Windows平台手动脱壳的核心流程,包括OEP定位、内存转储和IAT重建三大关键技术。详细介绍了ESP定律法和内存断点法定位OEP的原理与操作步骤,分析了内存Dump的最佳时机判定条件和使用工具。针对IAT重建,阐述了ImportREC工作流和对抗加密指针的高级手段,并通过tElock壳脱壳案例展示了完整操作流程。文章指出手动脱壳是逆向工程的基础技能,强调精准时序控制和多技术协同的重要性,同时提示现代高级壳带来的新挑战。技术验证环境为Win11+OllyDbg+ImportREC工具链。

勤奋的码农 1358

ESP定理手动脱壳

本人还是一个正在摸索的小白,可能会有说错的地方,请大家多加指点!本人这篇文章可以让大家了解如何快速的过掉简单的壳,并没有讲解壳的执行流程等知识。使用ESP定律脱壳之前 ,我们要先知道什么是ESP定律,ESP是汇编中的栈顶寄存器,存放着栈顶的地址,栈顶和栈底有一个特性,那就是堆栈平衡,尤其是在调用函数的时候表示的尤为明显。

2301_81223471的博客 1054

win脱壳1 -- 脱壳是什么 脱壳的技术有哪些 为什么要脱壳

脱壳 = 在调试器里让壳自己完成"解压 + 重建IAT",在它跳回 OEP 的瞬间截停,把内存镜像 dump 出来并修复 IAT。OEP 是"终点站"、IAT 是"待修复的零件"、加壳流程是"倒放的脱壳流程"——把执行时间线(加壳PE → EP → 解压 → 跳OEP)倒过来读,就是脱壳方法论本身。按"UPX 手动脱壳 → ESP 定律 → ASPack → 脱壳后修复 → 给自写 payload 加壳再自脱"的顺序练。

盾悟 8922

通过ESP定律手动脱壳

本人在学习时用到的参考资料:xdbg使用ESP定律脱压缩壳详解xdbg脱壳参考这篇文章主要是帮助校内新生熟悉手动脱壳流程写的,各位大师傅可以自行略过。

2303_79314941的博客 2194

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 740

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 603

脱壳_esp定律原理

本帖最后由 zf616545 于 2014-10-2 22:14 编辑ESP定律算是我们在脱壳当中最常使用的方法之一,也特别适合像我一样的新手!而今天文章说的是ESP脱壳的原理和分析!只有知道原理了,我们的技术才能走得列远! 一.准备知识 在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。 1.call 这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别

2346

OpenHarmony系统参数权限配置避坑指南:从param get/set失败到SELinux标签实战

本文深入解析OpenHarmony系统参数权限配置的常见问题与解决方案,涵盖DAC和SELinux双重权限控制机制。通过实战案例演示如何配置`param get/set`权限,解决'Permission denied'错误,并提供三方应用访问参数的安全方案,帮助开发者高效完成系统调试与优化。

weixin_27013291的博客 448

ctf逆向中的工具脱壳和手动脱壳

逆向脱壳小结

2301_80313926的博客 4462

Outlook邮件规则实战:从自动化分类到GTD工作流整合

在信息过载的数字化办公环境中,自动化处理技术成为提升效率的关键。其核心原理是基于“条件-动作”的触发器模型,通过预设逻辑让系统自动执行重复性任务。这种自动化机制的技术价值在于将用户从繁琐的机械操作中解放出来,实现信息流的智能管控。在邮件管理这一典型应用场景中,自动化规则能精准处理项目邮件聚合、优先级分流等复杂需求。本文聚焦于微软Outlook的规则引擎,深入解析如何利用**规则引擎**和**触发器模型**构建高效的邮件处理系统,并进一步将其融入GTD(Getting Things Done)个人生产力框架,

weixin_31083901的博客 312

[QMT量化交易小白入门]-104、QMT平台运行深度学习模型,预测期货价格

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 481

利用ESP定律进行脱壳 ——合天网安实验室学习笔记

实验链接 通过本实验理解ESP原理的操作机理,并掌握使用ESP原理进行脱壳的流程。 链接:http://www.hetianlab.com/expc.do?ce=ec372be3-7a24-4309-838d-92dc0e83869b 实验简介 实验所属系列: CTF竞赛 实验对象: 本科/专科信息安全专业 相关课程及专业: Windows编程,C语言,汇编语言 实验类别: 实践实验类 预备知识 ...

weixin_42582241的博客 1374

C#里用HttpListener实现WEB API接口服务端

本文介绍了一个基于WinForm的HTTP服务实现方案。该方案使用HttpListener类创建了一个支持JSON POST请求处理的轻量级Web服务器,主要特点包括:1) 纯线程方式实现请求监听和处理;2) 提供标准化的JSON响应格式;3) 支持自定义请求处理逻辑;4) 包含完整的日志记录功能。代码示例展示了如何初始化服务、处理不同类型的请求(包括JSON POST),并提供了线程安全的UI更新机制。该实现适用于需要简单HTTP接口的Windows桌面应用程序,可作为程序间通信的基础设施。

大坡3D软件开发 228

手动脱壳教程

一、什么是壳?         壳是指在一个程序的外面再包裹上另一段代码,保护里面的代码不被非法修改或反编译的的程序。它们一般先于程序运行,拿到控制权,然后完成它们保护软件的任务。 二、壳的加载过程 1、保存程序入口参数         加壳程序初始化时保存各个寄存器的值(用堆栈),外壳执行完毕后,再恢复各个寄存器的值,最后再跳到源程序执行。 2、获

weixin_44032972的博客 1万+

SAP Joule 经过了超过 2.5 亿行 ABAP 代码的训练之后......

披露的统计数据,Joule 提供的这种全新系统交互方式,可将事务性任务执行速度提高 90%,访问 SAP Help Portal 内容的速度提高 95%。在 ABAP 应用开发领域,SAP 官网数据显示,Joule 经过超过 2.5 亿行 ABAP 代码的训练,有信心成为这一领域行业领先的代码助手。刚刚过去的 SAP 蓝宝石大会上,SAP 提到,从2023年第四季度以来,SAP 已经交付了 50 项基于人工智能的创新。让其生成 SAP 应用能够识别的结构化应用数据,业务用户全程无需离开 SAP 应用程序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 793

自监督学习原理与代码实战案例讲解

自监督学习原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 自监督学习的起源与发展 1.1.1 监督学习的局限性

AI天才研究院 624

关于手动脱壳的分析及方法总结

单步跟踪法的原理就是通过Ollydbg的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程,跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并dump程序。

Yyx260019的博客 1250

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

UPX手动脱壳

脱壳入门,不喜勿喷,欢迎指正。 参考《加密与解密(第四版)》 0x01 壳&脱壳 首先了解一下什么是壳, 壳实质上是一个子程序,它在程序运行时首先取得控制权并对程序进行压缩。同时隐藏程序真正的OEP。 而脱壳的过程总体分为三个步骤: 查找真正的程序入口点 抓取内存镜像文件 重建PE文件 关于壳的类型有以下几种: 解压->运行 解压->运行->解压.->运行 解压 decoder|encoded code->decode ->exc Run th.

m0_46296905的博客 2424

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

手动脱壳---ESP定律

首先这篇文章不是讲ESP定律的原理,第一次接触ESP定律,跟着教程做了一遍,做个笔记,记录手动脱壳的过程。 首先载入OD,F8执行到pushad下面的call,然后观察寄存器,如果只有ESP和EIP是红色的,那么可以用ESP定律。 右键ESP的数据,选择数据窗口中跟随,可以看到左下角的数据窗口发生了跳转。 然后选择第一个数据 --> 右键 --> 断点 --> 硬件访问 --&...

Casuall的博客 1260

upx手动脱壳

upx upx是一个开源的工具,可以到github下载upx upx简单的用法 upx src.exe命令将src.exe加壳 upx src.exe -o dst.exe命令将src.exe加壳并另存为dst.exe upx手动脱壳

qq_36963214的博客 7683

脱壳简单总结

title: 脱壳 date: 2021-07-05 14:37:06 tags: RE 脱壳 1.概述: 1.壳: 一:加壳的目的:为了隐藏程序真正的OEP(入口点),防止被破解。 二:加壳软件是一种在编译好可执行文件之后,为了一些特定的需求,而做的一些事情,常见需求有: ​ 有一些版权信息需要保护起来,不想让别人随便改动 ​ 为了让程序小一点,从而方便使用(把可执行文件进行压缩使用) ​ 给木马等软件加壳以避免杀毒软件 三:壳的加载过程: ​ 一般壳的装载过程: ​ (1)获取壳所需要使用的.

weixin_45880501的博客 3860
上一篇: PE文件格式详解
下一篇: 脱壳:OEP(即程序入口点)查找 --- 基本思路和常见方法
secondwatch
博客等级 码龄15年 6粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值