冥界3大法王 发表于 2024-10-21 10:26

如图所示,如何获得被调试程序的完整路径?


在调试器中,似乎只有
文件=》最近打开的文件
和    文件=》改变命令行
是自动的得到了路径

有啥方法,我能拿到路径?

董督秀 发表于 2024-10-21 10:36

本帖最后由 董督秀 于 2024-10-21 10:37 编辑

创建进程快照。从结构体里取,里面包含路径,名称等。也可以从调试事件里取。

冥界3大法王 发表于 2024-10-21 11:32

董督秀 发表于 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;

无闻无问 发表于 2024-10-21 11:45

如果临时单纯拿,任务管理器应该就行,查看--选择列--映象路径名称……

无闻无问 发表于 2024-10-21 12:00

在x64dbg中下GetModuleFileNameW的断点通常能得到……

冥界3大法王 发表于 2024-10-21 12:06

无闻无问 发表于 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.

lies2014 发表于 2024-10-21 16:50

冥界3大法王 发表于 2024-10-21 12:06
我要编程的方式获得。

又搞了一个,该有的路径没有,不该有的倒有了。


你需要打印的主模块是 Module32First,如果不打印进程的所有模块,后面的 Module32Next 可以不要,现在是只打印了 Module32Next
页: [1]
查看完整版本: 如图所示,如何获得被调试程序的完整路径?