0x00 dbg介绍
最早接触逆向是因为给一个x32
游戏写插件,所以跟着教学一直用的是OD
,直到学找特征码定位时,木青教我了一个无敌好用的方法,才开始用了dbg
,感谢青佬。
总体来说确实比od
好用一些,而且还能支持x64
,不过一直只是简单用他,最近又在学习一些小玩具,逐渐需要使用一些插件,开个新篇记录一下工具的使用方法的学习,持续更新
0x01 Scylla
dbg
中的 Scylla
插件 是一个功能强大的工具,主要专注于逆向工程、恶意软件分析和软件脱壳领域。它得名于希腊神话中能将水手拉入深渊的海妖Scylla
,寓意它能“拉出”隐藏在程序内部的原始代码OEP
和导入表IAT
。
Scylla
插件的核心功能介绍
- 查找原始入口点:
这是Scylla
最基础也是最重要的功能之一。
当程序被加壳器保护后,真正的程序入口点会被隐藏。加壳器会在自己的代码中设置一个入口点,负责在运行时解密或解压缩原始程序代码(通常称为OEP - Original Entry Point
),然后再跳转到那里执行。
Scylla
提供了多种启发式算法(例如Find OEP by Section Hop (Trace over)
)来尝试自动识别和定位被加壳程序真正的OEP
。 - 转储内存映像:
一旦找到了OEP
(或手动定位到内存中原始程序代码被完全解压/解密的位置),Scylla
可以将该进程内存区域的内容转储保存到一个新的.exe
文件中。这个转储文件包含了当前内存中解密后的程序代码和数据,是脱壳过程的关键一步。 - 重建导入地址表:
这是Scylla
最核心、最强大的功能。
加壳器通常会破坏或加密程序的原始导入地址表。IAT
是程序用来查找和调用Windows API
函数(如MessageBoxA, CreateFile, VirtualAlloc
等)的关键数据结构。没有正确的IAT
,转储出来的程序无法运行,因为它不知道如何调用系统功能。
Scylla
提供了极其高效的方法来重建IAT
:- 自动分析: 它能扫描进程内存,查找对
API
函数的调用指令(如call [0x12345678]
或jmp dword ptr [0x12345678]
)以及这些指令引用的内存地址(即IAT
条目)。 - 高级
IAT
搜索: 提供多种搜索模式(如Search IAT
),即使IAT
被严重破坏或分散,也能尝试识别出有效的API
函数指针。 - 获取导入信息: 在识别出
IAT
条目后,Scylla
能解析这些指针,确定它们指向的是哪个DLL
中的哪个函数。 - 重建
IAT
结构: 基于收集到的信息,Scylla
会在转储文件内部创建一个新的、功能完整的IAT
结构,并修复代码中对这些API
函数的调用,使其指向新IAT
中的正确位置。
- 自动分析: 它能扫描进程内存,查找对
- 导入表编辑器:
允许用户手动查看、编辑、添加或删除重建的导入表条目。这在自动重建不完美或需要处理混淆/反调试技术时非常有用。 API
断点设置:
可以方便地在特定的API
函数上设置断点(硬件断点或内存写入断点)。这在脱壳和恶意软件分析中非常常用,例如在VirtualAlloc
,VirtualProtect
,LoadLibrary
,GetProcAddress
等关键API
上下断点,以跟踪壳的解密或注入行为。- 内存补丁:
提供直接在进程内存中修改指令或数据的功能(打补丁)。这对于修改程序行为、绕过反调试或激活某些功能很有用。 - 反反调试:
虽然主要功能是脱壳和重建IAT
,但Scylla
内置的一些功能(如隐藏调试器痕迹)也能用于对抗简单的反调试技术。
好了,客套话完了,进入正题吧。
0x02 upx加壳
先写个简单程序
#include <iostream>
#include <string>
int main() {
std::string username;
printf("input: ");
std::getline(std::cin, username);
if (username == "baynk") {
printf("flag: %s\n", "flag{abcdefg}");
}
else {
printf("wrong user!\n");
}
system("pause");
return 0;
}
编译后可以正常运行
接着使用upx
加壳
此时用ida
打开看函数,看不到什么内容
die
查一下
0x03 手动脱壳不完美版
按F9
过几个系统断点到入口点
F8
过到ESP定律
处
右键dump
区显示
右键下断
F9
到断下的地方
先F4
运行到这,然后F8
到OEP
调出Scylla
插件,直接dump
出程序
此时这个dump
后的exe
,在ida
里面就可以正常分析了
其实这里我是想能正常运行这个程序的,但是用插件自带的IAT
修复后还是无法正常运行
接上图顺序点击后,选择之前dump
后的文件,会再生成一个新文件,按之前脱别人的程序这个文件应该是只可以正常运行的,但是不知道为什么自己写的程序不行,知识盲区啊,折腾一下午也没研究个所以然来,也没个大哥能教一下,难受,再插个眼,以后再来解决吧