Хорошо, я постараюсь сделать это быстро. Я пытаюсь узнать, как внедрить 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 и все, что не связано напрямую с моей проблемой.
CALLBACK
макрос дает CBTProc
соглашение о вызовах stdcall, поэтому его имя будет помечено начальным подчеркиванием и количеством байтов (например, это может быть _CBTProc@12
). Вам нужно позвонить GetProcAddress
с точным названием экспорта. Имя можно найти с помощью инструмента dumpbin.
Обратите внимание, что указатель на вашу функцию также должен быть помечен CALLBACK
так что при вызове функции через указатель на функцию используется правильное соглашение о вызовах.
Вы должны фактически заставить DLL загружаться в другом процессе, чтобы это работало. Вы делаете это путем создания удаленного потока в другом процессе, который будет загружать вашу DLL.
Затем вам нужно выполнить свои крюки при загрузке DLLMain
подключить функции, которые вы хотите подключить.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx
http://en.wikipedia.org/wiki/DLL_injection
Эти две ссылки должны указать вам правильное направление.
Я не знаю, почему один из них работал бы без этого, но если вы хотите, чтобы функция экспортировалась из DLL, вы должны явно экспортировать ее. Есть два способа сделать это:
Подскажите компилятору через некоторые специфичные для компилятора средства.
За Visual C ++, использование __declspec(dllexport)
.