在内存地址反汇编

逆向工程 拆卸 视窗 聚乙烯 雷达2
2021-06-27 07:52:24

我开始使用radare2来调试PE文件,因为我一运行它就停止工作。当我附加调试器并继续执行到抛出异常的点时,我得到了发生异常的内存地址。

我可以用这个地址做什么来进一步分析手头的问题?

c484f\mscorlib.ni.dll) mscorlib.ni.dll
(14116) loading library at 77130000 (C:\Windows\SysWOW64\ole32.dll) ole32.dll
(14116) loading library at 70100000 (C:\Windows\SysWOW64\uxtheme.dll) uxtheme.dll
(14116) loading library at 700A0000 (C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll) mscorjit.dll
(14116) loading library at 6C3C0000 (C:\Windows\Microsoft.NET\Framework\v2.0.50727\Culture.dll) Culture.dll
(14116) unloading library at 6C3C0000 (C:\Windows\Microsoft.NET\Framework\v2.0.50727\Culture.dll) Culture.dll
(14116) Unknown exception e06d7363 in thread 10352
2个回答

由于主题中的问题与您问题正文中的问题略有不同,因此我将专注于第一个。

在特定地址拆卸

为了使用radare2 反汇编特定内存地址处的代码,您应该使用该pd @ <address>命令。

pd[?] [sz] [a] [b] — 反汇编 N 个操作码 (pd) 或 N 个字节 (pD)

将radare附加到程序后,您应该能够在此特定地址中打印反汇编。假设pid程序的317

$ radare2 -d 317
= attach 317 317
bin.baddr 0x00400000
Using 0x400000
asm.bits 64

[0x7f2e51727230]> pd @ <address>

pd是一个子命令p和代表p RINT d isassembly。您可以检查p?尤其pd?是更相关的子命令。?在radare 中大多数命令的末尾添加将打印其帮助及其子命令。默认情况下,从指定地址pd打印b条指令,其中b是默认基本块大小。b的默认大小为 0x100,但您可以使用b <size>.

@标志是radare 的临时搜索地址,因此无论何时您想在特定地址中打印反汇编,都应使用它。@符号前指定的数字是要打印的指令数。一个常见的错误是pd使用之前的地址执行@因此,执行pd 0x400000将从当前搜索中打印0x400000 条指令


例外

您收到“未知异常 e06d7363”,这是由Microsoft Visual C++ 编译器生成的异常

如 Microsoft 的支持页面所述

原因
从 Microsoft Visual C++ 编译器生成的代码抛出的所有 Visual C++ 异常都包含此错误代码。由于这是编译器生成的错误,因此该代码未在 Win32 API 头文件中列出。该代码实际上是一个神秘的助记符设备,最初的“E”代表“异常”,最后的 3 个字节 (0x6D7363) 代表“msc”的 ASCII 值。

要继续您的分析,我建议您阅读解码抛出的 C++ 异常 (0xE06D7363) 的参数及其重新访问的文章。

请注意,每次运行时,内存中可执行文件的地址可能会发生变化,这取决于您的系统和程序本身。因此,有时您将无法预测导致异常的地址是什么。

查看radare2 书中的从ida、GDB 或WinDBG 迁移页面,查看radare 对WinDBG 的相应命令。

从手册:

  • “p”代表打印。
  • 'd' 代表反汇编(通常是原始的)

尝试:

pd @ 0xYourAddress

注意:我不确定这在发生异常时是否有效。