完全指南:从打开程序、附加进程到数据库导入导出与补丁管理)
x64dbg 文件菜单File Menu完全指南从打开程序、附加进程到数据库导入导出与补丁管理【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读x64dbg 的File文件菜单是逆向工程的起点——几乎所有调试会话都从这里开始打开目标程序、附加到正在运行的进程、管理最近调试记录以及维护与调试会话配套的用户数据库注释、标签、断点、函数等。本文基于 File.rst 官方文档逐项剖析该菜单的全部条目并结合仓库源码揭示其底层命令实现与配置存储机制帮助你不仅会用界面还能理解每个动作背后发生了什么甚至可以直接用命令行完成同样操作。菜单总览File 菜单自上而下包含以下条目菜单项作用对应命令Open打开可执行文件EXE/DLL开始调试InitDebuginitRecent Files最近调试过的文件子菜单—由 MRUList 管理Attach附加到运行中的进程AttachDebuggerattachDetach分离调试器让调试对象自由运行DetachDebuggerdetachImport database导入用户数据库dbloadExport database导出用户数据库dbsavePatch file打开补丁对话框查看并应用补丁—Restart as Admin以管理员权限重启 x64dbg 与当前调试目标restartadmin内部命令Exit退出调试器并终止被调试进程—下面逐项展开。Open开始一个调试会话Open动作用于打开一个可执行文件进行调试文件类型可以是EXE也可以是DLL。这是 x64dbg 最常用的入口动作其 UI 实现位于 MainWindow.cppvoid MainWindow::openFileSlot() { auto filename QFileDialog::getOpenFileName(this, tr(Open file), mMRUList-getEntry(0), tr(Executables (*.exe *.dll);;All files (*.*))); if(!filename.length()) return; filename QDir::toNativeSeparators(filename); //convert to native path format (with backlashes) openRecentFileSlot(filename); }几个值得注意的实现细节文件过滤器默认限定为*.exe和*.dll但允许切换到All files (*.*)手动选择任意文件例如无扩展名的驱动或固件镜像。初始目录取自最近文件列表MRU的第一项所在位置mMRUList-getEntry(0)方便连续调试同一目录下的多个样本。选定文件后路径会通过QDir::toNativeSeparators转换为 Windows 原生反斜杠格式再交给openRecentFileSlot最终拼成命令init 路径执行。底层命令initOpen 动作的界面背后执行的正是init全名 InitDebug别名initdbg。该命令完成一次完整的初始化流程加载可执行文件并做基本检查若存在 TLS 回调TLS callbacks为其设置断点在进程入口点entry point设置断点在系统断点system breakpoint处停下把控制权交还给用户。命令语法init arg1 [arg2] [arg3]参数含义说明arg1要调试的可执行文件路径如果未给出完整路径会调用GetCurrentDirectoryAPI 补全为完整路径路径含空格时必须使用引号包裹arg2可选创建进程时附带的命令行参数直接传给CreateProcessarg3可选当前工作目录即所谓的 working directory / current directory也传给CreateProcess命令返回后会设置$pid进程 ID和$hp/$hProcess进程句柄变量方便后续脚本直接引用。例如init C:\malware\sample.exe --flag1 --flag2 C:\malware在 GUI 层面除了菜单 Open你还可以把文件直接拖拽到主窗口上触发同样的init流程——MainWindow.cpp 的dropEvent会把拖入的文件路径拼成init 路径命令执行两者完全等价。Recent Files最近调试记录Recent Files子菜单列出了你此前调试过的文件。文档特别说明它不会包含任何程序无法调试的文件例如已不存在的路径或非可执行文件。该子菜单的数据存放在配置 INI 文件的Recent Files小节中你可以直接编辑该 INI 文件来增删条目。源码级实现MRUListRecent Files 由MRUList类实现见 MRUList.cpp。关键行为存储格式条目以两位数字序号作为键写入 INI例如Recent Files\01、Recent Files\02……每个键对应一个文件路径。BridgeSettingSet/BridgeSettingGet负责读写见save()与load()。默认容量MRUList构造函数的maxItems参数默认为16见 MRUList.h超出上限的旧条目会被裁剪addEntry中mMRUList.erase(...)。去重加载与保存时都会removeDuplicates()同一个文件只会出现一次再次打开某文件时它会被提升到列表最前insert(mMRUList.begin(), entry)。有效性校验load()与save()都会检查QFile(path).exists()不存在的文件不会进入列表——这正是文档所说不包含无法调试的文件的机制来源。点击行为appendMenu为每个条目创建一个 QAction触发后发出openFile信号由主窗口openRecentFileSlot接收并执行init 路径见 MainWindow.cpp。主窗口在初始化时创建该列表MainWindow.cppmMRUList new MRUList(this, Recent Files); connect(mMRUList, SIGNAL(openFile(QString)), this, SLOT(openRecentFileSlot(QString))); mMRUList-load();值得注意的是MRUList是一个通用组件同一机制还被复用于Recent ScriptsScriptView.cpp和Recent Trace FilesTraceManager.cpp只是 INI 小节名不同。另外主窗口的restartDebugging()对应actionRestart也依赖 MRU 列表第一项来重新启动上次调试的目标MainWindow.cpp。Attach附加到运行中的进程Attach用于附加到一个正在运行的进程。点击后会弹出一个对话框列出当前系统正在运行的进程你可以选择其一进行附加。有两个必须牢记的限制官方文档明确架构必须一致只能附加与调试器同架构的可执行文件。例如用 x32dbg 无法附加 64 位进程反之亦然。附加会终止当前调试对象如果你正在调试某个可执行文件再附加另一个进程会终止之前的调试对象debuggee。底层命令attachAttach 动作对应 AttachDebugger别名attachattach arg1 [arg2] [arg3]参数含义说明arg1目标进程的 PID必填arg2可选事件对象句柄仅内部使用internal use onlyarg3可选附加后要恢复的线程 TID仅内部使用internal use only附加成功后命令同样会在系统断点处把控制权交回用户并设置$pid与$hp/$hProcess变量。日常使用只需attach 1234这样的形式即可。Detach分离调试器Detach将调试器与调试对象分离让被调试进程脱离调试器的控制继续独立运行。使用限制未处于调试状态时无法执行此操作。对应命令 DetachDebugger别名detach非常简洁——它没有任何参数也不会设置任何结果变量直接输入detach即可。典型场景当逆向分析完成、不再需要单步跟踪但又希望目标进程比如一个被附加分析的服务器程序继续对外提供服务时用 Detach 比直接终止更加温和。Import / Export database用户数据库的导入与导出Import database允许你导入一个数据库文件Export database则允许你把当前数据库导出为未压缩uncompressed的数据库文件。这里所说的数据库database是 x64dbg 的用户数据库——它集中存放与当前调试目标关联的一切分析成果注释comments、标签labels、书签bookmarks、函数定义functions、参数arguments、断点breakpoints等。用户数据库的底层存储逻辑集中在 database.cpp相关类型定义见 database.h。对应的两个命令dbload别名loaddb见 dbloaddbload [arg1]若给出arg1数据库文件路径执行的是导入import语义当前数据不会被自动清空若不给出参数会清空所有数据并从磁盘重新加载当前程序的数据库。其命令处理函数位于 cmd-user-database.cpp无参数时先DebugRemoveBreakpoints()再DbClear()随后DbLoad(...)、DebugSetBreakpoints()并刷新所有视图——也就是说加载数据库的同时会同步恢复其中的断点设置。dbsave别名savedb见 dbsavedbsave [arg1]若给出arg1将数据库保存到指定路径若不给出参数保存到当前程序的默认数据库。实现上直接调用DbSave(DbLoadSaveType::All, ...)cmd-user-database.cpp按全部类型导出。这两个命令在命令系统中注册于 x64dbg.cppdbgcmdnew(dbsave,savedb, cbInstrDbsave, true); //save program database dbgcmdnew(dbload,loaddb, cbInstrDbload, true); //load program database实战建议在分析一个大型样本前先用dbsave备份干净的初始数据库导入他人分享的分析成果时用dbload path这样不会覆盖你当前已有的数据。Patch file补丁对话框Patch file打开补丁对话框Patch Dialog你可以在此查看已记录的补丁patches并将补丁直接应用到文件上。补丁功能允许你在内存中修改指令后把修改固化到磁盘上的原始文件里——例如 patch 掉反调试的jz跳转、改写条件分支等。GUI 侧由 PatchDialog 实现主窗口的patchWindow()槽负责将其显示出来MainWindow.cpp并通过actionPatches连接到菜单项MainWindow.cpp。此外当你在反汇编视图中通过右键show patches时也会触发同一个对话框MainWindow.cpp。补丁的底层记录与读写逻辑位于 patches.cpp / patches.h。对话框内会列出所有待定补丁你可以逐个审查后选择应用来把修改写回文件。Restart as Admin以管理员权限重启Restart as Admin会用管理员权限重启 x64dbg并同时以管理员权限重启当前正在调试的目标进程。该菜单项在 MainWindow.cpp 中被绑定到内部命令restartadminmakeCommandAction(ui-actionRestartAdmin, restartadmin);命令在 x64dbg.cpp 中注册dbgcmdnew(restartadmin,runas,adminrestart, cbInstrRestartadmin, false);核心实现是dbgrestartadmin()见 debugger.cppbool dbgrestartadmin() { wchar_t wszProgramPath[MAX_PATH] L; if(GetModuleFileNameW(GetModuleHandleW(nullptr), wszProgramPath, _countof(wszProgramPath))) { std::wstring file wszProgramPath; auto last wcsrchr(wszProgramPath, L\\); if(last) *last L\0; std::wstring params L\ gInitExe L\; if(!gInitCmd.empty()) params L -- gInitCmd; if(!gInitDir.empty()) params L-workingDir \ gInitDir L\ params; auto result ShellExecuteW(NULL, Lrunas, file.c_str(), params.c_str(), wszProgramPath, SW_SHOWDEFAULT); return INT_PTR(result) 32 GetLastError() ERROR_SUCCESS; } return false; }机制要点通过ShellExecuteW的runas动词触发 Windows UAC 提权重新启动调试器重启时会保留初始调试目标gInitExe当前调试的可执行文件、gInitCmd启动命令行参数通过--分隔传递、gInitDir工作目录通过-workingDir参数传递都会被透传给新进程如果调试器在调试过程中检测到需要管理员权限例如附加到高权限进程失败也会走同样的提权重启路径debugger.cpp。典型应用许多恶意样本、加壳程序或受保护进程运行在高权限下普通权限的调试器无法附加或读写其内存此时用此功能一次性提升整个调试环境包括被调试进程的权限。Exit退出调试器Exit终止调试器。特别注意官方文档的警告如果当前有进程正被本程序调试退出时这些进程也会被一并终止terminated。因此在退出前请确认是否已经保存好数据库dbsave/ Export database是否已经应用或导出补丁Patch file如果只想让目标进程继续运行而不再调试应优先使用Detach而非 Exit。小结与实战速查File 菜单虽然只是 x64dbg 的入口却串联起了调试生命周期中最核心的几个动作。一张表速查你的需求操作路径等价命令打开 EXE/DLL 开始调试File → Openinit path [cmdline] [workdir]重新调试上次的目标File → Recent Files 或 Restartinit由 MRU 首项驱动附加同架构运行进程File → Attachattach pid让目标脱离调试器继续运行File → Detachdetach备份/分享分析成果File → Export databasedbsave [path]载入他人/旧的分析成果File → Import databasedbload [path]把内存修改写回文件File → Patch file—GUI 对话框提权后继续调试File → Restart as Adminrestartadmin结束调试并终止目标File → Exit—如需更深入地理解每一项背后的命令行为可继续阅读 debug-control 与 user-database 两个命令手册目录或直接查看 MainWindow.cpp、MRUList.cpp、cmd-user-database.cpp 等源码文件。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考