注入并在另一个程序中调用函数

时间:2014-06-23 02:15:07

标签: c++ windows dll code-injection

只是为了提高我的知识。我想从我的程序(称为My program)调用位于程序(称为Target)中的函数。

我的步骤:

  1. 通过Windows Hooks将我的DLL注入Target程序。
  2. 我的程序通过GetProcAddress获取DLL中的CALLER函数地址,然后使用函数指针调用它。
  3. CALLER函数将启动一个指向目标程序中固定地址的函数指针。
  4. 然后,当然,打电话给它。但是这一步(只有这一步)使我的程序崩溃。
  5. 我想知道在其他程序中调用函数就像我做的那样是不可能的?如果不可能,我错了什么?

    这里有几行代码:

    我的节目:

    TargetThreadId = GetWindowThreadProcessId(hTargetWindow, &TargetProcessId);
    hLib = LoadLibraryA(DLL_FILE);
    
    pfSetHook = (pfSetHookType)GetProcAddress(hLib, "SetHook");
    pfSetHook(hLib, TargetThreadId);
    

    我的Dll:

    #define SHOWADDR 0x00401472
    SetHook(HINSTANCE hLib, DWORD dwTargetThreadId)
    {
         ghHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProc, hLib, dwTargetThreadId);
    }
    Caller()
    {
         pfShowType pfShow = (pfShowType)SHOWADDR; // points to fixed address which was defined
         pfShow(); // calling
    }  
    

    目标计划:

    // The function's address is 0x00401472
    Show()
    {
         MessageBoxA(NULL, "Yeah, I'm a function in Target :)!", "Show Function", 0);
    }
    

    这是目标程序的反汇编代码

    ...
    00401472  PUSH EBP
    00401473  MOV EBP,ESP
    00401475  SUB ESP,18
    00401478  MOV DWORD PTR SS:[ESP+C],0
    00401480  MOV DWORD PTR SS:[ESP+8],Target.0040300>
    00401488  MOV DWORD PTR SS:[ESP+4],Target.0040301>
    00401490  MOV DWORD PTR SS:[ESP],0 
    00401497  CALL <JMP.&USER32.MessageBoxA>
    0040149C  SUB ESP,10
    0040149F  LEAVE
    004014A0  RETN
    ...
    

0 个答案:

没有答案