1,183
社区成员
发帖
与我相关
我的任务
分享
program enum;
{$apptype console}
uses
sysutils,
windows,
tlhelp32;
function GetProcessIDByName(const ProcessName: string): DWORD;
var
FSnapshotHandle: THandle;
pe: PROCESSENTRY32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize := SizeOf(PROCESSENTRY32);
if (Process32First(FSnapshotHandle, pe)) then
begin
while (Process32Next(FSnapshotHandle, pe)) do
begin
if (UpperCase(ExtractFileName(pe.szExeFile)) = UpperCase(ProcessName)) then
begin
Result := pe.th32ProcessID;
end;
end;
end;
CloseHandle(FSnapshotHandle);
end;
var
pid: dword;
hnd: THandle;
hModuleSnap: THandle;
me32: MODULEENTRY32;
begin
pid := GetProcessIDByName('qq.exe');
hnd := openprocess(PROCESS_ALL_ACCESS, FALSE, pid);
hModuleSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
if hModuleSnap = INVALID_HANDLE_VALUE then
exit;
me32.dwSize := SizeOf(MODULEENTRY32);
if Module32First(hModuleSnap, me32) then
begin
repeat
writeln(format('MODULE NAME: %s', [me32.szModule]));
writeln(format('executable: %s', [me32.szExePath]));
writeln(format('process id: %d', [me32.th32ProcessID]));
writeln(format('ref count(g):%d', [me32.GlblcntUsage]));
writeln(format('ref count(p):%d', [me32.ProccntUsage]));
writeln(format('base address:%d', [DWORD(me32.modBaseAddr)]));
writeln(format('base size: %d', [me32.modBaseSize]));
until Module32Next(hModuleSnap, me32);
end;
CloseHandle(hModuleSnap);
end.
#include <Windows.h>
#include <tchar.h>
#include <TlHelp32.h>
#include <vector>
#include <map>
PVOID GetModulBaseAddr(DWORD dwProcessID,PVOID pvModuleRemote)
{
PVOID pvBaseAddr = NULL;
IMAGE_DOS_HEADER dosHdr;
IMAGE_NT_HEADERS ntHdr;
Toolhelp32ReadProcessMemory(dwProcessID,pvModuleRemote,&dosHdr,sizeof(dosHdr),NULL);
if(dosHdr.e_magic == IMAGE_DOS_SIGNATURE)
{
Toolhelp32ReadProcessMemory(dwProcessID,(PBYTE)pvModuleRemote+dosHdr.e_lfanew,&ntHdr,sizeof(ntHdr),NULL);
if(ntHdr.Signature == IMAGE_NT_SIGNATURE)
{
pvBaseAddr = (PVOID)ntHdr.OptionalHeader.ImageBase;
}
}
return pvBaseAddr;
}
int main()
{
HANDLE hHandle = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(pe);
BOOL bOk = Process32First(hHandle,&pe);
int ProcessCnt = 0;
while(bOk)
{
ProcessCnt++;
if(pe.th32ProcessID == 0)
{
bOk = Process32Next(hHandle,&pe);
if(!bOk) break;
}
wcout<<"进程名:"<<pe.szExeFile<<endl;
wcout<<"进程ID:"<<pe.th32ProcessID<<endl;
wcout<<"父进程ID:"<<pe.th32ParentProcessID<<endl;
wcout<<"进程优先级:"<<pe.pcPriClassBase<<endl;
wcout<<"子线程个数:"<<pe.cntThreads<<endl;
HANDLE hHandle2 = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe.th32ProcessID);
MODULEENTRY32 me;
me.dwSize = sizeof(me);
if(Module32First(hHandle2,&me))
{
// if(me.th32ProcessID == pe.th32ProcessID)
{
wcout<<"模块名:"<<_tcsrchr(me.szExePath,TEXT('\\'))+1;
PVOID pAddr = GetModulBaseAddr(pe.th32ProcessID,me.modBaseAddr);
if(pAddr == me.modBaseAddr)
{
wcout<<" 模块地址:"<<(LPINT)pAddr<<endl;
}
else
{
wcout<<" 模块地址:("<<(LPINT)me.modBaseAddr<<")"<<endl;
}
}
while(Module32Next(hHandle2,&me))
{
// if(me.th32ProcessID == pe.th32ProcessID)
{
wcout<<"模块名:"<<_tcsrchr(me.szExePath,TEXT('\\'))+1;
PVOID pAddr = GetModulBaseAddr(pe.th32ProcessID,me.modBaseAddr);
if(pAddr == me.modBaseAddr)
{
wcout<<" 模块地址:"<<(LPINT)pAddr<<endl;
}
else
{
wcout<<" 模块地址:("<<(LPINT)me.modBaseAddr<<")"<<endl;
}
}
}
}
THREADENTRY32 te;
te.dwSize = sizeof(te);
if(Thread32First(hHandle,&te))
{
if(te.th32OwnerProcessID == pe.th32ProcessID)
wcout<<" 线程ID:"<<te.th32ThreadID;
while(Thread32Next(hHandle,&te))
{
if(te.th32OwnerProcessID == pe.th32ProcessID)
wcout<<" 线程ID:"<<te.th32ThreadID;
}
}
wcout<<endl<<"============================"<<endl;
bOk = Process32Next(hHandle,&pe);
}
wcout<<"共统计进程数"<<ProcessCnt<<endl;
getchar();
return 0;
}