当我尝试在运行时从psapi.dll(Windows)链接函数时,GetModuleFileNameExA将无法正常运行

加布里埃尔·吕德斯(GabrielLüders)

我正在尝试在Windows运行时从dll加载函数。我尝试基于此程序来打印自己的模块程序:https : //docs.microsoft.com/en-us/windows/win32/psapi/enumerating-all-modules-for-a-process

我需要两个函数来执行我想要的操作:EnumProcessModules和GetModuleFileNameExA。我设法在运行时从psapi.dll中获取了这两个文件,但是GetModuleFileNameExA不能正常运行,我也不能说为什么

这是我写的功能脚本:

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

typedef DWORD (__cdecl *EnumModules)(HANDLE hprocess, HMODULE *moduleHandles, DWORD cb, LPDWORD lpcNeeded);
typedef DWORD (__cdecl *GetModuleName)(HANDLE hprocess, HMODULE hmodule, LPSTR name, DWORD size);

void ErrorMessage(const char *message){
    fprintf(stderr, message);
    exit(EXIT_FAILURE);
}

int PrintModules( HANDLE pHandle )
{
    HMODULE hMods[1024];
    DWORD cbNeeded;
    unsigned int i;

    if (NULL == pHandle)
        return EXIT_FAILURE;

    // Loads the lib
    HMODULE psapiLib = LoadLibrary("C:\\Windows\\SysWOW64\\psapi.dll");
    if(! psapiLib) ErrorMessage("Error loading psapi.dll\n");

    // Get the functions we need from the lib
    EnumModules getModules = (EnumModules)GetProcAddress(psapiLib, "EnumProcessModules");
    GetModuleName getModuleName = (GetModuleName)GetProcAddress(psapiLib, "GetModuleFileNameExA");
    if(!getModules) ErrorMessage("Error finding EnumProcessModules from psapi.dll\n");
    if(!getModuleName) ErrorMessage("Error finding GetModuleFileNameExA from psapi.dll\n");


   // Get a list of all the modules in this process.

    if( getModules(pHandle, hMods, sizeof(hMods), &cbNeeded))
    {
        for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
        {
            LPSTR szModName;
            szModName = malloc(1024 * sizeof(LPSTR));

            // Get the full path to the module's file.

            // change GetModuleFileNameExA with getModuleName to see the error
            if ( GetModuleFileNameExA( pHandle, hMods[i], szModName, 1024 * sizeof(char))){
                // Print the module name and handle value.
                printf(("\t%s (0x%08X)\n"), szModName, hMods[i] );
                
            }

            free(szModName);
        }
    }

    return 0;
}

int main( void )
{
    HANDLE myHandle = GetCurrentProcess();
    PrintModules(myHandle);
    CloseHandle(myHandle);

    return 0;
}

如果我改变这部分

if ( GetModuleFileNameExA( pHandle, hMods[i], szModName, 1024 * sizeof(char))){
                // Print the module name and handle value.
                printf(("\t%s (0x%08X)\n"), szModName, hMods[i] );
                
            }

对此

if ( getModuleName( pHandle, hMods[i], szModName, 1024 * sizeof(char))){
                // Print the module name and handle value.
                printf(("\t%s (0x%08X)\n"), szModName, hMods[i] );
                
            }

因此它会改用我的函数,而无需在加载时链接psapi.dll,这是行不通的。它将出现段错误或不打印任何内容。我试图改变我如何呈现缓冲区,尝试使用widechar或Tchar,但似乎没有任何效果。

这是功能脚本的输出工作脚本输出

这是我的功能输出非功能脚本输出

有趣的是,函数之一getModules(指向EnumProcessModules)工作得很好!我只是不明白发生了什么。

潘德玉

您应该更改此行代码

typedef DWORD (__cdecl *EnumModules)(HANDLE hprocess, HMODULE *moduleHandles, DWORD cb, LPDWORD lpcNeeded);

为此。

typedef DWORD(__stdcall* EnumModules)(HANDLE hprocess, HMODULE* moduleHandles, DWORD cb, LPDWORD lpcNeeded);

有关更多信息,您可以参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我在单词之间留出空格时,在运行时出现错误

来自分类Dev

在运行时更改.dll

来自分类Dev

当我尝试运行时,NAnt停止工作

来自分类Dev

每当我尝试移动按钮时,都会在运行时给我XML错误

来自分类Dev

SDL构建系统-当我链接到`gnustl_shared`时,在运行时出现“错误:无法加载库:...”

来自分类Dev

当我尝试在模拟器上运行时,Android Studio返回“转换异常”错误

来自分类Dev

在运行时轻松替换dll

来自分类Dev

一个包含count的shell文件,但是当我尝试从crontab运行时不显示

来自分类Dev

我的ListPreference在运行时未更改App Theme

来自分类Dev

当我们在运行时增加分区时,Kafka如何保证消息顺序?

来自分类Dev

尝试访问在VBA(Visio)中在运行时创建的控件的属性时发生运行时错误

来自分类Dev

在运行时释放/删除* .dll

来自分类Dev

当我在单词之间留出空格时,在运行时出现错误

来自分类Dev

在运行时更改.dll

来自分类Dev

尝试通过JSON登录,但存在运行时错误

来自分类Dev

当我的python ddos脚本运行时出现错误

来自分类Dev

当我尝试设置MapType时,MapFragment使应用程序在运行时崩溃

来自分类Dev

尝试在运行时编辑字符串

来自分类Dev

当我在运行时要求棉花糖在运行时允许读取手机状态时,应用关闭且背景为黑色

来自分类Dev

在运行时轻松替换dll

来自分类Dev

尝试在运行时扩展launchdaemon的参数

来自分类Dev

当我尝试运行时,它说无法解决所有依赖关系

来自分类Dev

Docker:我无法在运行时进行卷绑定

来自分类Dev

当我关闭 SSH 终端时 nohup 结束,并且在运行时不显示在 ps/job 上

来自分类Dev

在运行时更改我的折线图的域

来自分类Dev

当我尝试运行 sql 时,我遇到了运行时错误类型不匹配

来自分类Dev

Wpf 在运行时加载 dll

来自分类Dev

我可以在运行时检查内置类型吗?

来自分类Dev

我可以在运行时更新 AMQP 设置吗?

Related 相关文章

  1. 1

    当我在单词之间留出空格时,在运行时出现错误

  2. 2

    在运行时更改.dll

  3. 3

    当我尝试运行时,NAnt停止工作

  4. 4

    每当我尝试移动按钮时,都会在运行时给我XML错误

  5. 5

    SDL构建系统-当我链接到`gnustl_shared`时,在运行时出现“错误:无法加载库:...”

  6. 6

    当我尝试在模拟器上运行时,Android Studio返回“转换异常”错误

  7. 7

    在运行时轻松替换dll

  8. 8

    一个包含count的shell文件,但是当我尝试从crontab运行时不显示

  9. 9

    我的ListPreference在运行时未更改App Theme

  10. 10

    当我们在运行时增加分区时,Kafka如何保证消息顺序?

  11. 11

    尝试访问在VBA(Visio)中在运行时创建的控件的属性时发生运行时错误

  12. 12

    在运行时释放/删除* .dll

  13. 13

    当我在单词之间留出空格时,在运行时出现错误

  14. 14

    在运行时更改.dll

  15. 15

    尝试通过JSON登录,但存在运行时错误

  16. 16

    当我的python ddos脚本运行时出现错误

  17. 17

    当我尝试设置MapType时,MapFragment使应用程序在运行时崩溃

  18. 18

    尝试在运行时编辑字符串

  19. 19

    当我在运行时要求棉花糖在运行时允许读取手机状态时,应用关闭且背景为黑色

  20. 20

    在运行时轻松替换dll

  21. 21

    尝试在运行时扩展launchdaemon的参数

  22. 22

    当我尝试运行时,它说无法解决所有依赖关系

  23. 23

    Docker:我无法在运行时进行卷绑定

  24. 24

    当我关闭 SSH 终端时 nohup 结束,并且在运行时不显示在 ps/job 上

  25. 25

    在运行时更改我的折线图的域

  26. 26

    当我尝试运行 sql 时,我遇到了运行时错误类型不匹配

  27. 27

    Wpf 在运行时加载 dll

  28. 28

    我可以在运行时检查内置类型吗?

  29. 29

    我可以在运行时更新 AMQP 设置吗?

热门标签

归档