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后的文件,会再生成一个新文件,按之前脱别人的程序这个文件应该是只可以正常运行的,但是不知道为什么自己写的程序不行,知识盲区啊,折腾一下午也没研究个所以然来,也没个大哥能教一下,难受,再插个眼,以后再来解决吧