有没有办法访问包含在可执行文件中的绝地调试信息(JDBG)?
Microsoft 调试工具已将我指向二进制文件中的堆栈链,我想知道这些偏移量对应的方法/过程/函数:
user32.dll!SendMessageA+0x4c
StackOverflow.exe+0x179263
StackOverflow.exe+0x2315b5
StackOverflow.exe+0x1fc82
StackOverflow.exe+0x50388
StackOverflow.exe+0x541fe
user32.dll!gapfnScSendMessage+0x332
显然我在打电话SendMessage
,但我不知道从哪里来。可执行文件是使用嵌入在可执行文件中的 Jcl 调试信息构建的;但我不知道如何阅读它。
查看 中的一些函数和类JclDebug.pas
,一切似乎都是为了获取当前进程内部的调试信息,例如:
function GetLocationInfo(const Addr: Pointer; var Info: TJclLocationInfo): Boolean;
在我当前进程的地址空间中获取一个地址。它找出HMODULE
地址所在的位置,例如:
- 堆栈溢出.exe
- GDI32.dll
- USER32.dll
- 内核基础.dll
- dwmapi.dll
- UxTheme.dll
我在想我可以使用LoadLibrary
(返回一个HMODULE
)来手动加载一个模块,然后将它提供给一些通过模块图像挖掘以获取调试信息的类:
module := LoadLibrary('C:\Users\Ian\Desktop\StackOverflow.exe');
和
TJclDebugInfoList = class(TObjectList)
private
function GetItemFromModule(const Module: HMODULE): TJclDebugInfoSource;
...
protected
function CreateDebugInfo(const Module: HMODULE): TJclDebugInfoSource;
...
end;
除非它受到保护。
我正在尝试(希望)我可以编写一个工具来选择二进制文件(*.exe),输入地址,然后返回
- 功能
- 方法
- 文件
- 电话号码
的偏移量。
例如
[002315B5] FMain.TfrmMain.lvQuestions (Line 158, "FMain.pas" + 1) + $11
可能的?
编辑:我的第一个粗略和现成的方法是提取压缩map
文件,以便我可以查看它。但它没有保存为资源(?):
虽然通用工具会更有用:
更新:
我尝试使用TJclDebugInfoList
;我意识到数组属性ItemFromModule
将访问受保护的方法:
function GetModuleLocationInfo(filename: string; Addr: Pointer): TJclLocationInfo;
var
module: HMODULE;
infoList: TJclDebugInfoList;
infoSource: TJclDebugInfoSource;
Address: Pointer;
locationInfo: TJclLocationInfo;
AddressOffset: Integer;
begin
module := LoadLibrary(filename);
if module = 0 then
RaiseLastWin32Error;
try
infoList := TJclDebugInfoList.Create;
try
infoSource := infoList.ItemFromModule[module];
if source = nil then
raise Exception.Create('Could not find debug info source for module '+IntToStr(module));
if not source.GetLocationInfo(Addr, {var}locationInfo) then
raise Exception.Create('Could not get location info for address $'+IntToHex(Integer(Address), 8));
Result := locationInfo;
finally
infoList.Free;
end;
finally
FreeLibrary(module);
end;
end;
除了其中一个TJclDebugInfoSource
后代类中的代码尝试将其假定为虚拟地址的内容转换为偏移地址时出现下溢。