dbg手动脱壳&攻防世界【crackme】

手动脱壳

壳的类型分为压缩壳和加密壳

攻防世界crackme

将程序拖进x32dbg

进入断点

F9来到程序的入口点

可以看到pushfd pushad

也就是保存入口参数

F8执行

此时我们在ESP这个位置下一个断点

右键ESP

选择在转储中跟随

然后在下面下断点

硬件访问断点,双字,因为是32位

然后f9

当我们执行f9执行程序到断电位置的时候,就会来到popfd这个位置

继续执行

这里是一个大跳转,因为它没有指向

然后f7执行跟进

继续跟进

又来到push ebp,就是我们oep入口

点击插件

然后点击转储   保存

拖进ida

Shift+f12    点进去

Ctrl+x查看引用,找到main函数,f5反编译

逻辑是v4与byte_402130进行异或,然后与数组dword_402150进行比较

所以dword_402150是我们加密后的数据

v2 % 16说明key的长度是16

V4是我们输入的字符串

双击byte_402130看看

点击跳入新的十六进制窗口

可以看到this_is_not_flag刚好十六位

我们输入一个长度位42的字符串,然后让key叠加,然后与输入的字符串异或得到加密后的数据,也就是dword_402150

将它转化为数组

大小设置为42位

Shift+e导出来

flag=""

a="this_is_not_flag"

b=[0x12,4,8,0x14,0x24,0x5c,0x4a,0x3d,0x56,0x0a,0x10,0x67,0,0x41,0,1,0x46,0x5a,0x44,0x42,0x6e,0x0c,0x44,0x72,0x0c,0x0d,0x40,0x3e,0x4b,0x5f,2,1,0x4c,0x5e,0x5b,0x17,0x6e,0x0c,0x16,0x68,0x5b,0x12,0x48,0x0e]

for i in range(42):

    flag+=chr(ord(a[i%16])^b[i])

print(flag)

flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

【文章标题】: 绕过 Enigma Protector 2.xx 注册保护 【文章作者】: CodeGame 【作者邮箱】: CodeGame@Yeah.Net 【作者主页】: http://blog.csdn.net/codegame 【作者QQ号】: 441673604 【软件名称】: windows 计算器 【软件大小】: 669kb 【下载地址】: windows xp 系统自带 【加壳方式】: The Enigma Protector 2.20 正版 【保护方式】: The Enigma Protector 2.20 正版 【编写语言】: VC 【使用工具】: OllyDBG 【操作平台】: Windows XP sp3 【软件介绍】: 1+1=2 【作者声明】: 文笔菜的很请谅解,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! -------------------------------------------------------------------------------- 【详细过程】 参考了 http://unpack.cn/thread-59541-1-2.html 定位方式,迅速定位到了 Enigma 注册授权位置: 010F2CBF E8 CC76F3FF call calc_em.0102A390 010F2CC4 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] 010F2CC7 E8 FC78F3FF call calc_em.0102A5C8 010F2CCC 50 push eax 010F2CCD E8 DE90FFFF call calc_em.010EBDB0 ; Check Registration Key Info 010F2CD2 85C0 test eax,eax ; Eax =1 Success! 010F2CD4 0F95C0 setne al 这里010EBDB0 这个CALL负责检测注册码是否正确,正确返回1 否则返回0,由于 Enigma有多线程内联补丁保护因此不能 直接硬写此处代码,所以我们采用了硬件断点HOOK来实现。 1:定位PatchAddress: 先看此块内存信息: 地址=01026000 大小=002F4000 (3096576.) 属主=calc_em 01000000 区段= 类型=Imag 01001002 访问=R 初始访问=RWE 这块内存实际是Enigma的内置DLL授权模块,此块DLL是被加密压缩过,因此也无法直接patch,通过对比加不同的程序 发现这块区域解压后的代码都不变: $+CCCBF > E8 CC76F3FF call calc_em.0102A390 $+CCCC4 > 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] $+CCCC7 > E8 FC78F3FF call calc_em.0102A5C8 $+CCCCC > 50 push eax $+CCCCD > E8 DE90FFFF call calc_em.010EBDB0 ; Check Registration Key Info $+CCCD2 > 85C0 test eax,eax ; Eax =1 Success! $+CCCD4 > 0F95C0 setne al 因此PatchAddress = BaseAddress+PatchOffsetAddress,通过上面分析得到 Enigma Protector 2.20 的 PatchOffsetAddress = 0xCCCD2 ,不同版本的PatchOffsetAddress 有可能不一样,BaseAddress 的获取就更简单了, 直接搜索区段判断VirtualSize为0x002F4000的VirtualAddress+GetModuleHandle(0)即为BaseAddress,整理公式: PatchAddress = GetModuleHandle(0)+VirtualAddress+0xCCCD2 定完毕。 2.硬件Hook: 这里我们采用AddVectoredExceptionHandler向量化异常API来实现,具体细节请自己google,重点讲下Hook触发后的过程 由于我们Patch点为$+CCCD2 > 85C0 test eax,eax ,因此只需要模拟操作EFlags然后跳过此段指令即可: pException^.ContextRecord^.EFlags := $202; //TEST eax,eax pException^.ContextRecord^.Eax := 1; //TEST eax,eax PException^.ContextRecord^.Eip := PException^.ContextRecord^.Eip + 2; //Nex 3.整体封装: 这里我们采用是把硬件HOOK和处理的过程都封装成DLL 然后导出一个GoPatch的函数供目标程序调用,那么如何使目标程序 加载并执行我们的GoPatch函数呢,我想办法很多注入,远线程等等。。这里我采用了劫持EIP的方式使目标程序加载我们的 DLL并执行GoPatch函数。 到这里已经全部完成,执行GoPatch后任意输入或者不输入用户名、注册码都可以直接绕过Enigma 的注册保护直接执行。
### x64dbg 手动脱壳插件下载与使用指南 x64dbg是一款功能强大的开源调试工具,广泛应用于逆向工程和手动脱壳场景。为了提升工作效率,x64dbg支持丰富的插件生态系统,这些插件可以显著简化复杂的手动脱壳过程。 #### 插件推荐与获取途径 1. **Scylla 插件** Scylla 是一款专注于 IAT(导入地址表)重建的插件,能够帮助用户在手动脱壳过程中修复被破坏的导入表。它是 x64dbg 生态中最受欢迎的插件之一[^1]。 - 下载地址:访问官方 GitHub 页面或其他可信资源站点即可免费获取最新版本。 ```plaintext https://github.com/NtQuery/Scylla/releases ``` 2. **Unpacker Plugins** 针对不同类型的加壳程序(如 UPX),社区开发了许多专用的解包脚本或插件。例如,针对 UPX 的手动脱壳教程通常会提到如何定位 OEP(原始入口点)、Dump 文件以及后续修复工作流[^4]。 - 获取方式:通过搜索引擎查找目标壳对应的解决方案文档或者直接参考 CSDN、Bilibili 上的相关教学视频资料。 3. **LyScript32 Python 控制接口** 对于希望实现更高程度自动化的研究人员而言,基于 Python 编写的 LyScript32 库提供了一种便捷的方法来远程操控 x64dbg 实例[^3]。借助该库的功能,开发者可以轻松构建自定义逻辑以适应特定项目需求。 ```python from LyScript32 import MyDebug if __name__ == "__main__": # 初始化调试对象 dbg = MyDebug() try: # 尝试建立连接 if not dbg.connect(): raise Exception("Failed to establish connection with debugger!") print("[*] Successfully connected.") # 测试链接有效性 is_connected = dbg.is_connect() print(f"[+] Is still connected? {is_connected}") finally: # 断开现有会话 dbg.close() ``` #### 安装步骤概述 - 确保已经正确安装好基础版 x64dbg 软件; - 解压所选插件至指定目录,默认路径为 `%APPDATA%\x64dbg\Plugins` 或者启动时提示的位置; - 启动应用后确认新增组件是否正常加载成功。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值