C - 从外部进程调用函数而不导出函数

时间:2010-08-01 03:17:36

标签: c windows winapi external-process detours

嘿伙计们,我试图找出如何在不将其导出的情况下调用函数。

好的,所以我有一个exe文件,其中定义了“add”,这个exe是一个win32控制台应用程序并加载一个DLL。 DLL还旨在使用exe文件中的add函数(无导出)

这是我的主要win32控制台应用程序文件:

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

#pragma auto_inline ( off )

int add ( int a, int b )
{
    printf( "Adding some ints\n" );
    return a + b;
}

int main ( )
{
    HMODULE module = NULL;

    if ( (module = LoadLibrary( L"hook.dll" )) == NULL )
    {
        printf( "Could not load library: %ld\n", GetLastError() );
        return 0;
    }

    add( 3, 5 );

    FreeLibrary( module );

    return 0;
}

以下是hook.dll的代码:

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

static int (*add) ( int a, int b ) = ( int (*)( int a, int b ) ) 0x401000;

int Detoured_add ( int a, int b )
{
    return add( a, b );
}

BOOL WINAPI DllMain ( HINSTANCE hDll, DWORD reason, LPVOID reserved )
{
    if ( reason == DLL_PROCESS_ATTACH )
    {
        DetourTransactionBegin();
        DetourAttach( (PVOID*) &add, Detoured_add );
        DetourTransactionCommit();

    }
    else if ( reason == DLL_PROCESS_DETACH )
    {
        DetourTransactionBegin();
        DetourDetach( (PVOID*) &add, Detoured_add );
        DetourTransactionCommit();
    }

    return TRUE;
}

我反汇编了我的win32控制台应用程序以找到添加功能的地址

.text:00401000 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
.text:00401000
.text:00401000
.text:00401000 sub_401000      proc near               ; CODE XREF: sub_401020:loc_40104Bp
.text:00401000                 push    offset aAddingSomeInts ; "Adding some ints\n"
.text:00401005                 call    ds:printf
.text:0040100B                 add     esp, 4
.text:0040100E                 mov     eax, 8
.text:00401013                 retn
.text:00401013 sub_401000      endp

问题是当我调用LoadLibrary时,它返回998我相信是错误代码访问冲突。我想这是有道理的,因为该内存区域可能受到保护。

任何提示?

(另外,我使用的反汇编程序是Ida Pro免费版本,而detours库是由Microsoft提供的。)

1 个答案:

答案 0 :(得分:1)

模块在加载时重新定位。您应该找到已加载模块的基地址并自己重新定位地址。此外,您可以使用[DebugHelp] [1]库通过符号名称检索函数地址,而不是对其进行硬编码。