Внедрение DLL | GetProcAddress возвращает NULL

Хорошо, я постараюсь сделать это быстро. Я пытаюсь узнать, как внедрить DLL в другой процесс. На данный момент я только пытаюсь определить вывод сообщения при открытии калькулятора. Я написал следующую DLL:

#include <windows.h>
#include <iostream>

using namespace std;
extern "C"{
    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
    {       
       cout << "I'M NOT WORKING " << endl;
       // Bunch of code...
       return CallNextHookEx(0, nCode, wParam, lParam);
    } 
    void ASimpleFunc(){
        cout << "DLL WORKING" << endl;
    }
}

А вот и мой инжектор (ну... в данный момент он просто пытается загрузить DLL).

#include <windows.h>
#include <iostream>

using namespace std;
typedef LRESULT (*CBTProc)(int,WPARAM,LPARAM); 
typedef void (*ASimpleFunc)(); 
int main()
{   
    // My two functions... 
    LRESULT _CBTProc;
    ASimpleFunc _ASimpleFunc;

   HMODULE hDll = LoadLibrary("myDLL.dll");
   if(!hDll){
       cout << "DLL FAILED TO LOAD" << endl;
   }else{
       cout << "DLL LOAD SUCCESS" << endl;

       // This one is working
       _ASimpleFunc = (ASimpleFunc)GetProcAddress(hDll, "ASimpleFunc");

       // This one is not working
        _CBTProc = (CBTProc)GetProcAddress(hDll, "CBTProc");
        if(!_ASimpleFunc || !_CBTProc){
            cout << "UNABLE TO CALL HOOK" << endl;
        }else{
            // other code...
        }
    }
   return 1;
} 

Есть идеи?

РЕДАКТИРОВАТЬ: это не 100% кода. Я удалил очевидные вещи, такие как DLLMain, и все, что не взаимодействует напрямую с моей проблемой.


person Michael Villeneuve    schedule 03.01.2013    source источник


Ответы (3)


Макрос CALLBACK дает соглашение о вызовах CBTProc stdcall, поэтому его имя будет аннотировано начальным символом подчеркивания и количеством байтов (например, это может быть _CBTProc@12). Вам нужно позвонить GetProcAddress с точным названием экспорта. Имя можно найти с помощью инструмента dumpbin.

Обратите внимание, что ваш указатель функции также должен быть аннотирован CALLBACK, чтобы при вызове функции через указатель функции использовалось правильное соглашение о вызовах.

person James McNellis    schedule 03.01.2013
comment
Просто из любопытства, что такое бит @12? Это размер рамки аргумента? - person dreamlax; 03.01.2013

Вам нужно, чтобы DLL загружалась в другом процессе, чтобы это работало. Вы делаете это, создавая удаленный поток в другом процессе, который будет загружать вашу DLL.

Затем вам нужно выполнить свои хуки при загрузке DLLMain, чтобы перехватить функции, которые вы хотите перехватить.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

http://en.wikipedia.org/wiki/DLL_injection

Эти две ссылки должны указать вам правильное направление.

person sean    schedule 03.01.2013
comment
Хорошо, я не ставил DLLMain, потому что кажется очевидным, что он там был. Однако вы имеете в виду, что я должен использовать GetProcAddress только для DLLMain, а DLLMain должен вызывать CPTPoc. Это правильно? - person Michael Villeneuve; 03.01.2013
comment
Да, вы выполняете хуки в удаленном процессе в файле DLLMain. Вы заставляете удаленный процесс вызывать DLLMain, вызывая CreateRemoteThread в другом процессе, используя LoadLibraryA и передавая свою DLL этой функции. - person sean; 03.01.2013

Я не знаю, почему один из них будет работать без этого, но если вы хотите, чтобы функция экспортировалась из DLL, вы должны экспортировать ее явно. Есть два способа сделать это:

  1. Сообщить компилятору с помощью некоторых средств, специфичных для компилятора.

    Для Visual C++ используйте __declspec(dllexport).

  2. Используйте файл определения модуля.

person icktoofay    schedule 03.01.2013
comment
О, я просто не хотел помещать слишком много кода (например, DLLMain), я использую компилятор cygwin и экспортирую его вручную. Я еще не очень хорошо знаком с С++, поэтому стараюсь изо всех сил, к чему могу приложить руку. - person Michael Villeneuve; 03.01.2013
comment
@Michael: Можете ли вы отредактировать свой вопрос, включив в него файл DEF? - person icktoofay; 03.01.2013