汇编封装一个函数可以在windows环境中获取进程信息列表
时间: 2024-01-22 14:19:08 浏览: 26
以下是一个简单的汇编函数,用于获取Windows环境中的进程信息列表:
```assembly
; 获取进程信息列表
; 返回值:进程信息结构体指针
getProcessList PROC
pushad ; 保存寄存器
xor eax, eax ; 将 eax 设置为 0
mov eax, fs:[eax+0x30] ; 获取PEB地址
mov eax, [eax+0x0C] ; 获取PEB_LDR_DATA结构体地址
mov eax, [eax+0x0C] ; 获取第一个LDR_MODULE结构体地址
findNext:
mov ebx, [eax+0x18] ; 获取模块句柄
mov esi, [eax+0x20] ; 获取模块基址
mov ecx, [eax+0x24] ; 获取模块大小
mov edx, [eax+0x28] ; 获取模块入口点
cmp byte ptr [eax+0x30], 0 ; 判断是否为主模块
jne skip ; 不是则跳过
lea eax, [esi+edx-0x1000] ; 计算PE头地址
mov ebx, [eax+0x3C] ; 获取PE头偏移
add eax, ebx ; 计算PE头地址
mov ebx, [eax+0x78] ; 获取导出表地址
add eax, ebx ; 计算导出表地址
mov ebx, [eax+0x20] ; 获取导出函数地址表地址
add eax, ebx ; 计算导出函数地址表地址
mov ecx, [eax+0x24] ; 获取导出函数名称表地址
add eax, ecx ; 计算导出函数名称表地址
mov edx, [eax+0x30] ; 获取导出函数名称地址表地址
add eax, edx ; 计算导出函数名称地址表地址
mov ecx, [eax+0x1C] ; 获取导出函数数量
mov edi, [eax+0x18] ; 获取导出函数名称地址表
xor ebx, ebx ; 将 ebx 设置为 0
searchLoop:
mov esi, [edi+ebx*4] ; 获取导出函数名称地址
cmp byte ptr [esi], 0 ; 判断名称是否为空
je skipSearch ; 空则跳过
cmp esi, getProcessListName ; 判断是否为目标函数名称
jne continueSearch ; 不是则继续查找
mov eax, [eax+0x20+ebx*4] ; 获取目标函数地址
call eax ; 调用目标函数
popad ; 恢复寄存器
ret ; 返回
continueSearch:
inc ebx ; 继续查找
cmp ebx, ecx ; 判断是否查找完毕
jl searchLoop ; 未完则循环
skipSearch:
mov eax, [eax+0x20] ; 获取下一个LDR_MODULE结构体地址
test eax, eax ; 判断是否为 NULL
jne findNext ; 不是则继续查找
skip:
mov eax, 0 ; 未找到则返回 0
popad ; 恢复寄存器
ret ; 返回
getProcessList ENDP
; 目标函数名称
getProcessListName db "ZwQuerySystemInformation", 0
```
使用该函数可以获取进程信息列表。具体使用方法如下:
```c
#include <stdio.h>
typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset;
ULONG NumberOfThreads;
LARGE_INTEGER Reserved[3];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
ULONG BasePriority;
HANDLE ProcessId;
HANDLE InheritedFromProcessId;
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
typedef NTSTATUS(WINAPI* PZwQuerySystemInformation)(
ULONG SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);
int main() {
HMODULE hNtDll = LoadLibraryA("ntdll.dll");
PZwQuerySystemInformation ZwQuerySystemInformation = (PZwQuerySystemInformation)GetProcAddress(hNtDll, "ZwQuerySystemInformation");
PSYSTEM_PROCESS_INFORMATION pProcessInfo = (PSYSTEM_PROCESS_INFORMATION)getProcessList();
while (pProcessInfo->NextEntryOffset != 0) {
printf("Process ID: %d\n", (DWORD)pProcessInfo->ProcessId);
printf("Process Name: %wZ\n", &pProcessInfo->ImageName);
printf("\n");
pProcessInfo = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pProcessInfo + pProcessInfo->NextEntryOffset);
}
return 0;
}
```
该示例代码使用了Windows API `ZwQuerySystemInformation` 来获取进程信息列表,并且使用汇编函数 `getProcessList` 来调用该 API。最后将进程信息打印到控制台上。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)