这篇文章将介绍如何使用 Windows API 查找带有进程名称的进程 ID。这种方法可以用于几个目的。
您可以确定您正在攻击的系统是沙箱环境还是普通系统。或者你只是想将你的 shellcode 注入到指定的进程中,比如 explorer.exe。您无法手动找到 explorer.exe pid。
让我们看看我们将使用哪些 API
第一个 API 名称为 CreateToolhelp32Snapshot。此 API 将返回一个用于枚举进程的 HANDLE。
HANDLE CreateToolhelp32Snapshot(
[in] DWORD dwFlags,
[in] DWORD th32ProcessID
);
用法:
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
在使用其他 API 之前,我们必须创建一个 PROCESSENTRY32W struct 变量。
typedef struct tagPROCESSENTRY32W {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
WCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32W;
PROCESSENTRY32W pe;
pe.dwSize = sizeof(PROCESSENTRY32W);
之后,我们可以使用 Process32FirstW 和 Process32NextW API。
BOOL Process32FirstW(
[in] HANDLE hSnapshot,
[in, out] LPPROCESSENTRY32W lppe
);
BOOL Process32NextW(
[in] HANDLE hSnapshot,
[out] LPPROCESSENTRY32W lppe
);
用法:
if (Process32FirstW(hSnapshot, &pe)) {
do {
if (wcscmp(lpwProcName, pe.szExeFile) == 0) {
pid = pe.th32ProcessID;
return pid;
}
} while (Process32NextW(hSnapshot, &pe));
}
现在让我们看看完整的源代码
#include <windows.h>
#include <tlhelp32.h>
#include <dbghelp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
DWORD FindProcW(LPCWSTR lpwProcName) {
DWORD pid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) { return pid; }
PROCESSENTRY32W pe;
pe.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(hSnapshot, &pe)) {
do {
if (wcscmp(lpwProcName, pe.szExeFile) == 0) {
pid = pe.th32ProcessID;
return pid;
}
} while (Process32NextW(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
return pid;
}
int main() {
DWORD explorerPID = FindProcW(L"explorer.exe");
printf("explorerPID: %ldn", explorerPID);
return 0;
}
你可以使用 mingw64 或 cl.exe 来编译这段代码
x86_64-w64-mingw32-gcc findpid.c -o findpid.exe -ldbghelp
我们可以看到 explorer.exe 的进程 ID
现在让我们编写另一个代码,它将向我们显示任何进程的 ParentPID。我们将再次使用相同的代码,但我将键入一个新函数
这是最后一个完整的源代码
#include <windows.h>
#include <tlhelp32.h>
#include <dbghelp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
DWORD FindProcW(LPCWSTR lpwProcName) {
DWORD pid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) { return pid; }
PROCESSENTRY32W pe;
pe.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(hSnapshot, &pe)) {
do {
if (wcscmp(lpwProcName, pe.szExeFile) == 0) {
pid = pe.th32ProcessID;
return pid;
}
} while (Process32NextW(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
return pid;
}
DWORD FindPPIDW(DWORD pid) {
DWORD ppid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) { return ppid; }
PROCESSENTRY32W pe;
pe.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(hSnapshot, &pe)) {
do {
if (pe.th32ParentProcessID == pid) {
ppid = pe.th32ProcessID;
return ppid;
}
} while (Process32NextW(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
return ppid;
}
int main() {
DWORD msedgePID = FindProcW(L"msedge.exe");
printf("msedgePID: %ldn", msedgePID);
DWORD msedgePPID = FindPPIDW(msedgePID);
printf("msedgePPID: %ldn", msedgePPID);
return 0;
}
这是 last code 的结果
正如我所说,当您想将 shellcode 注入到指定的进程中时,此方法很有用。但是 shellcode 注入并不是本文的实际主题。
提供的此工具仅用于教育和信息目的!
其它相关教程
linux恶意软件开发对抗与进程安全管理视频教程(2024最新)
其它课程
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
windows恶意软件开发与对抗视频教程
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
windows文件过滤(更新完成)
-
USB过滤(更新完成)
-
游戏安全(更新中)
-
ios逆向
-
windbg
-
还有很多免费教程(限学员)
原文始发于微信公众号(安全狗的自我修养):使用 Windows API 查找 PID 和 PPID
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论