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 и все, что не связано напрямую с моей проблемой.

0

Решение

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

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

2

Другие решения

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

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

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

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

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

1

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

  1. Подскажите компилятору через некоторые специфичные для компилятора средства.

    За Visual C ++, использование __declspec(dllexport).

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

0
По вопросам рекламы [email protected]