如图所示,如何获得被调试程序的完整路径?
在调试器中,似乎只有
文件=》最近打开的文件
和 文件=》改变命令行
是自动的得到了路径
有啥方法,我能拿到路径? 本帖最后由 董督秀 于 2024-10-21 10:37 编辑
创建进程快照。从结构体里取,里面包含路径,名称等。也可以从调试事件里取。 董督秀 发表于 2024-10-21 10:36
创建进程快照。从结构体里取,里面包含路径,名称等。也可以从调试事件里取。
以下两个各有不足(一个不是全部进程的,第二个不是路径的,怎么杂交到一起呢?)
procedure TForm13.Button3Click(Sender: TObject);
var
SnapshotHandle: THandle;
ModuleEntry: TModuleEntry32;
ProcessID: DWORD;
begin
begin
// 获取当前活动的进程ID
ProcessID := GetCurrentProcessId;
// 创建包含模块列表的快照
SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
if SnapshotHandle <> INVALID_HANDLE_VALUE then
try
// 初始化模块入口结构体的大小
ModuleEntry.dwSize := SizeOf(TModuleEntry32);
// 获取快照中的第一个模块信息
if Module32First(SnapshotHandle, ModuleEntry) then
begin
// 遍历模块列表
repeat
// 输出模块的完整路径
Memo1.Lines.Add(ModuleEntry.szExePath);
// 获取下一个模块信息
until not Module32Next(SnapshotHandle, ModuleEntry);
end;
finally
// 关闭快照句柄
CloseHandle(SnapshotHandle);
end;
end;
end;
procedure TForm13.Button4Click(Sender: TObject);
var
Snapshot: THandle;
Entry: TProcessEntry32;
Success: Boolean;
begin
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 创建进程快照
if Snapshot = INVALID_HANDLE_VALUE then
RaiseLastOSError;
try
Entry.dwSize := SizeOf(Entry); //初始化 PROCESSENTRY32 结构
Success := Process32First(Snapshot, Entry); //取快照中的第一个进程信息
while Success do
begin
Memo1.Lines.Add(Format('Process ID: %d, Name: %s', )); // 输出进程信息
Success := Process32Next(Snapshot, Entry); // 获取下一个进程信息
end;
if not Success then // 检查是否有错误发生
RaiseLastOSError;
finally
CloseHandle(Snapshot); // 关闭快照句柄
end;
end; 如果临时单纯拿,任务管理器应该就行,查看--选择列--映象路径名称…… 在x64dbg中下GetModuleFileNameW的断点通常能得到……
无闻无问 发表于 2024-10-21 12:00
在x64dbg中下GetModuleFileNameW的断点通常能得到……
我要编程的方式获得。
又搞了一个,该有的路径没有,不该有的倒有了。
program Project6;
{$APPTYPE CONSOLE}
uses
SysUtils,
Messages,
Windows,
Tlhelp32;
var
processRec: Thandle;
pe32: TProcessEntry32;
processNum: Integer;
procedure EnumModule(processid: DWORD);
var
moduleRec: THandle;
pm: TModuleEntry32;
begin
// create module snapshot
moduleRec := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processid);
//module size
pm.dwSize := sizeof(TModuleEntry32);
//first module?
if (module32First(moduleRec, pm)) then
begin
while Module32Next(moduleRec, pm) do
begin
Writeln('module name: ', StrPas(pm.szExePath));
end;
end;
CloseHandle(moduleRec);
end;
procedure OutProcessName(processName: string);
begin
WriteLn('Process Name:', processName);
end;
begin
processNum := 0;
//create process snapshot
processRec := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize := sizeOf(TPROCESSENTRY32);
if Process32First(processRec, pe32) then
begin
// enum the process module
OutProcessName(pe32.szExeFile);
EnumModule(pe32.th32ProcessID);
inc(processNum); //inc process count
while Process32Next(processRec, pe32) do
begin
OutProcessName(pe32.szExeFile);
EnumModule(pe32.th32ProcessID);
inc(processNum); //inc process count
end;
WriteLn('Total System Process:', processNum);
CloseHandle(processRec);
Readln;
end;
end.
冥界3大法王 发表于 2024-10-21 12:06
我要编程的方式获得。
又搞了一个,该有的路径没有,不该有的倒有了。
你需要打印的主模块是 Module32First,如果不打印进程的所有模块,后面的 Module32Next 可以不要,现在是只打印了 Module32Next
页:
[1]