procedure TForm1.Button1Click(Sender: TObject); var lppe: TProcessEntry32; found : boolean; Hand : THandle; begin Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); found := Process32First(Hand,lppe); while found do begin ListBox1.Items.Add(StrPas(lppe.szExeFile)); found := Process32Next(Hand,lppe); end; end; 以上可以得出进程中的所有文件,我到时只会显示EXE进程,点击EXE文件想知道EXE调用了那些DLL,没有的话就是不显示。cg1120(代码最优化-§新年祝福你,好运伴着你§) 我想我要在DELPHI下完成。
有一个方法,因为exe调用dll都要在address space内映射文件,所以只要遍历address space内的所有region就可以得到exe内的所有dll或者其他映射文件。 这样做有好处是可以找到动态调入的dll,也有坏处就是还没有调入的dll就不会看到。至于怎么遍历address space 请用 VirtualQueryEx 函数。
var ProcHand: Thandle; ModHandles: array[0..255] of DWORD; ModName: pchar; ModInfo: Tmoduleinfo; count: cardinal; i: integer; begin memo1.Lines.Clear; getmem(modname,MAX_PATH); ProcHand := OpenProcess(Process_All_Access, True, strtoint64(listbox2.Items[listbox2.ItemIndex])); if ProcHand = 0 then exit; EnumProcessModules(ProcHand, @ModHandles, SizeOf(ModHandles), Count); for I := 0 to (Count div SizeOf(DWORD)) - 1 do begin if (GetModuleFileNameEx(ProcHand, ModHandles[I], ModName, MAX_PATH) > 0) then memo1.Lines.Add(modname); end; application.MessageBox(pchar('这个进程共调用了'+inttostr(i)+'个模块'),'提示',MB_OK); freemem(modname);
例:
DUMPBIN /imports "pretty park.exe"
微软网站下载
你的方法我这是行不通的。
var
lppe: TProcessEntry32;
found : boolean;
Hand : THandle;
begin
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
found := Process32First(Hand,lppe);
while found do
begin
ListBox1.Items.Add(StrPas(lppe.szExeFile));
found := Process32Next(Hand,lppe);
end;
end;
以上可以得出进程中的所有文件,我到时只会显示EXE进程,点击EXE文件想知道EXE调用了那些DLL,没有的话就是不显示。cg1120(代码最优化-§新年祝福你,好运伴着你§)
我想我要在DELPHI下完成。
要是你提供的程序有源码,呵呵。
我还是要谢谢你。
我想是的,如DELPHI所调用的DLL在进程中有的话就显示出来。
有什么问题吗。
ProcHand: Thandle;
ModHandles: array[0..255] of DWORD;
ModName: pchar;
ModInfo: Tmoduleinfo;
count: cardinal;
i: integer;
begin
memo1.Lines.Clear;
getmem(modname,MAX_PATH);
ProcHand := OpenProcess(Process_All_Access, True, strtoint64(listbox2.Items[listbox2.ItemIndex]));
if ProcHand = 0 then exit;
EnumProcessModules(ProcHand, @ModHandles, SizeOf(ModHandles), Count);
for I := 0 to (Count div SizeOf(DWORD)) - 1 do
begin
if (GetModuleFileNameEx(ProcHand, ModHandles[I], ModName, MAX_PATH) > 0) then
memo1.Lines.Add(modname);
end;
application.MessageBox(pchar('这个进程共调用了'+inttostr(i)+'个模块'),'提示',MB_OK);
freemem(modname);
你的方法果然管用.