有办法重命名windbg中的函数吗?类似于使用符号。
例如,我们有一个函数,在windpg中被识别为";例如+0x14";。经过逆向工程,我知道这个函数正在调用一个蹦床,它将执行printf。现在,我想将";示例+0x14";至";示例printf";。
在其他调试器(如x64)中,这样做非常简单,但我在windbg中找不到这样做的方法。
最终,我想解析IAT中的地址,找到它们的引用(蹦床),重命名这些蹦床,让我的调试更容易。
有办法做到这一点吗?
有一个API可以实现这一点。不幸的是;命令";可以很容易地从调试器扩展创建一个。
有问题的API是IDebugSymbols3::AddSyntheticSymbol(https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/dbgeng/nf-dbgeng-idebugsymbols3-addsyntheticsymbol)或Unicode变体IDebugSymbols3::AddSyntheticSymbolWide(https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/dbgeng/nf-dbgeng-idebugsymbols3-addsyntheticsymbolwide)。
如果您想编写一个插件,您可以进一步。调试器有新的目标组合API(https://www.nuget.org/packages/Microsoft.Debugging.TargetModel.SDK)通过提供符号提供程序(DEBUG_SERVICE_symbol_provider/ISvcSymbolProvider),您可以定义自己的符号概念。唯一的样本(https://github.com/microsoft/WinDbg-Samples/tree/master/TargetComposition/TextDump)不幸的是,目前可用于该API表面还没有涵盖符号。在不久的将来(希望在一两个月内),同一回购中会有第二个样本,它将涵盖这一点,并允许对符号and类型系统进行大量动态操作和编辑。
JFYI:关于你对IAT的评论。调试器中包含的ImageInfo.jsJavaScript扩展已经解析了IAT,并通过数据模型公开了大部分信息。它公开的所有内容都在模块对象的Contents属性上。IAT信息在.Contents.Imports:内
0:007> dx -r3 @$curprocess.Modules[0].Contents.Imports
@$curprocess.Modules[0].Contents.Imports
["KERNEL32.dll"] : KERNEL32.dll
ModuleName : KERNEL32.dll
ResolvedModule : C:WindowsSystem32KERNEL32.DLL
BaseAddress : 0x7ff8eef70000
Name : C:WindowsSystem32KERNEL32.DLL
Size : 0xbd000
Contents
ImageType : PE
Functions
[0x0] : Named Import of 'SetEvent'
[0x1] : Named Import of 'GlobalFree'
[0x2] : Named Import of 'GetLocaleInfoW'
[0x3] : Named Import of 'CreateFileW'
[0x4] : Named Import of 'ReadFile'
...
["GDI32.dll"] : GDI32.dll
ModuleName : GDI32.dll
ResolvedModule : C:WindowsSystem32GDI32.dll
BaseAddress : 0x7ff8f0750000
Name : C:WindowsSystem32GDI32.dll
Size : 0x29000
Contents
ImageType : PE
Functions
[0x0] : Named Import of 'CreateDCW'
[0x1] : Named Import of 'StartPage'
[0x2] : Named Import of 'StartDocW'
[0x3] : Named Import of 'SetAbortProc'
[0x4] : Named Import of 'EndDoc'
...