美文网首页
Windows输出进程基址ImageBase

Windows输出进程基址ImageBase

作者: 写个代码容易么 | 来源:发表于2020-04-24 22:19 被阅读0次

1.使用EnumProcesses函数枚举系统下所有进程
2.使用OpenProcess函数打开进程,获取进程句柄
3.使用EnumProcessModules函数枚举进程所有模块,第一个模块句柄即进程基址

#include <windows.h>
#include <stdio.h>
#include <psapi.h>

void ShowProcessInfo(DWORD pid) {
    /*
     打开一个存在的本地进程对象
     HANDLE OpenProcess(
      DWORD dwDesiredAccess,
      BOOL  bInheritHandle,
      DWORD dwProcessId
    );
    参数:
     dwDesiredAccess 访问权限   https://docs.microsoft.com/windows/desktop/ProcThread/process-security-and-access-rights
     bInheritHandle  TRUE 子进程继承父进程handle, FALSE 子进程不继承父进程handler
     dwProcessId    要打开的进程pid
     doc https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
     * */
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);

    /*
      枚举进程模块
     BOOL EnumProcessModules(
      HANDLE  hProcess,
      HMODULE *lphModule,
      DWORD   cb,
      LPDWORD lpcbNeeded
    );
     参数:
     hProcess   进程句柄
     lphModule  模块句柄数组
     cb         模块句柄数组大小,字节形式
     lpcbNeeded 返回给lphModule的字节数
     * */
    DWORD cbNeeded, moduleCount;
    HMODULE pModuleIds[1024];
    unsigned int ret, i;
    DWORD err;
    ret = EnumProcessModules(hProcess, pModuleIds, sizeof(pModuleIds), &cbNeeded);

    if (ret == 0) {
        err = GetLastError();
        printf("err = %d\n", ret);
        return;
    }

    moduleCount = cbNeeded / sizeof(HMODULE);

    printf("process id [%d], module count [%d]\n", pid, moduleCount);
//    for (i = 0; i < moduleCount; i++) {
//        printf("\t0x%x\n", pModuleIds[i]);
//    }
    printf("ImageBase: 0x%x\n", pModuleIds[0]);

    CloseHandle(hProcess);
}

int main() {
    printf("Print Process ImageBase!\n");
    /*
        枚举系统中的进程
       BOOL EnumProcesses(
          DWORD   *lpidProcess,
          DWORD   cb,
          LPDWORD lpcbNeeded
        );
        参数:
        lpidProcess 接收进程标识符的数组指针
        cb pProcessIds数组大小,字节形式
        lpcbNeeded 返回给lpcbNeeded的字节数
        doc: https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocesses
     * */
    DWORD pProcessIds[1024], cbNeeded, processCount, pid, currPid;
    int ret, i;
    DWORD err;
    ret = EnumProcesses(pProcessIds, sizeof(pProcessIds), &cbNeeded);
    if (ret == 0) {
        err = GetLastError();
        printf("err = %d\n", ret);
        return -1;
    }
    currPid = GetCurrentProcessId();
    processCount = cbNeeded / sizeof(DWORD);
    for (i = 0; i < processCount; i++) {
        pid = pProcessIds[i];
        if (pid != 0 && pid != currPid) {
            ShowProcessInfo(pid);
        }
    }
    system("pause");
    return 0;
}

相关文章

  • Windows输出进程基址ImageBase

    1.使用EnumProcesses函数枚举系统下所有进程2.使用OpenProcess函数打开进程,获取进程句柄3...

  • 进程守护

    windows服务守护进程bat脚本、windows窗体守护进程bat脚本 windows 之 bat 实现进程守...

  • 2. python多进程之间的数据隔离

    多进程之间数据是隔离的 在windows操作系统上,启动多进程必须是放在__main__里面 有Join 输出 无...

  • 2018-11-02 Windows下PE重定位

    PE重定位 向进程的虚拟内存加载PE文件时,文件会被加载到PE头的ImageBase所指向的地址处,若IB位置已经...

  • image转换为字符串

    - (NSString *)imageBase64WithDataURL:(UIImage *)image { /...

  • windows下关闭进程

    关闭windows进程

  • windows 常用命令

    windows杀指定进程 找占用指定端口的进程

  • Windows 进程

    进程基础 一般将进程定义为一个正在运行的程序的一个实例,由两个部分组成:一个内核对象,操作系统利用内核对象来管理进...

  • Python -- 进程、线程

    多进程 由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?multip...

  • DOS实用命令

    windows 查看进程: netstat -aon 查看端口进程: netstat -aon|findstr "...

网友评论

      本文标题:Windows输出进程基址ImageBase

      本文链接:https://www.haomeiwen.com/subject/zxfcwhtx.html