freedom_wings4 2016-09-05 12:01 采纳率: 0%
浏览 1606
已采纳

win32API GetProcAddress() 返回了null,但是找不到问题所在?

我的代码如下

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


    typedef struct 
    {
    FARPROC farproc[2];
    wchar_t wRemoteBuffer[5][60];              //3rd is "kernel32.dll",4th is "CreateFile",5th is "WriteFile"
    }THREAD_PARAM;


    typedef HMODULE (WINAPI *PFNLIBRARY)(LPCSTR lpLibraryName);  //get the address of LoadLibrary() function

    typedef FARPROC (WINAPI *PFNGETADDRESS)(HMODULE hModule,LPCSTR lpProcName);    //get the address of GetProcAddress()  function

    typedef HANDLE  (WINAPI *PFNCREATEFILE)(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwSharedMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationFlags,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);     //get the address of CreateFile() function

    typedef BOOL (WINAPI *PFNWRITEFILE)(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWrite,LPOVERLAPPED lpOverlapped);      //get the address of WriteFile() function


    void WINAPI create(THREAD_PARAM ta)                  
    {
    HMODULE hModule=((PFNLIBRARY)ta.farproc[0])((LPCSTR)ta.wRemoteBuffer[2]);

    PFNCREATEFILE pfnCreateFile=(PFNCREATEFILE)((PFNGETADDRESS)ta.farproc[1])(hModule,(LPCSTR)ta.wRemoteBuffer[3]);       



    PFNWRITEFILE pfnWriteFile=(PFNWRITEFILE)((PFNGETADDRESS)ta.farproc[1])(hModule,(LPCSTR)ta.wRemoteBuffer[4]);

    LPCWSTR lpFileName=ta.wRemoteBuffer[0];

    HANDLE hFile=pfnCreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,NULL,NULL);


    LPCWSTR lpBuffer=ta.wRemoteBuffer[1];


    //这里有2行代码,但是在提问这里变红色了,我还是把这2行代码截图发出来,图片下面的代码是紧接着图片的2行代码的

图片说明

 }

    int main()
    {
    HMODULE hMod=GetModuleHandle(L"kernel32.dll");
    THREAD_PARAM ta;
    ta.farproc[0]=GetProcAddress(hMod,"LoadLibraryW");
    ta.farproc[1]=GetProcAddress(hMod,"GetProcAddress");
    wcscpy_s(ta.wRemoteBuffer[0],L"C:\\CodeInjectTest.txt");
    wcscpy_s(ta.wRemoteBuffer[1],L"if you see this file,then the CodeInjectTest has succeeded\n");
    wcscpy_s(ta.wRemoteBuffer[2],L"kernel32.dll");
    wcscpy_s(ta.wRemoteBuffer[3],L"CreateFileW");        //here may be error ,about the address of createfile
    wcscpy_s(ta.wRemoteBuffer[4],L"WriteFile");


    create(ta);

    system("PAUSE");
    return 1;
    }

在create()函数的这行代码中

  PFNCREATEFILE pfnCreateFile=(PFNCREATEFILE)((PFNGETADDRESS)ta.farproc[1])(hModule,(LPCSTR)ta.wRemoteBuffer[3]); 

这里返回了null,在ollydbg中查看,这句中的ta.farproc[1]就是GetProcAddress的入口地址,其传入的参数也是和预想中的相符,但是执行完这个call 指令,返回之后,EAX的值为0x0,这意味着返回值为null,不知哪里出错了,求大神指点

  • 写回答

1条回答 默认 最新

  • 野男孩 2016-09-06 12:59
    关注

    GetProcAddress接受的是const char*,不是wchar_t*

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题