C - Вызов функций из внешнего процесса без экспортируемых функций. - PullRequest
3 голосов
/ 01 августа 2010

Эй, ребята, я пытаюсь понять, как я могу вызвать функцию без ее экспорта.

Хорошо, у меня есть exe-файл с определенным в нем «add». Этот exe-файл является консольным приложением win32 и загружает DLL. DLL также стремится использовать функцию добавления из exe-файла (без экспорта)

Вот мой основной файл консольного приложения 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, а библиотека обходных путей предоставлена ​​Microsoft.)

1 Ответ

1 голос
/ 01 августа 2010

Модули перемещаются по мере загрузки. Вы должны найти базовый адрес загруженного модуля и переместить адрес самостоятельно. Кроме того, вы можете использовать библиотеку [DebugHelp] [ 1 ], чтобы получить адрес функции по символическому имени вместо жесткого его кодирования.

...