#c #windows #dll #code-injection
#c #Windows #dll #внедрение кода
Вопрос:
Просто для улучшения моих знаний. Я хочу вызвать функцию, которая находится в программе (называемой Target), из моей программы (называемой My program).
Вот мои шаги:
- Внедрение моей библиотеки DLL в целевую программу с помощью перехватов Windows.
- Моя программа получает адрес ВЫЗЫВАЮЩЕЙ функции в DLL через GetProcAddress, затем использует указатель на функцию для ее вызова.
- ВЫЗЫВАЮЩАЯ функция инициализирует указатель функции, который указывает на фиксированный адрес в целевой программе.
- А затем, конечно, вызовите ее. Но этот шаг (только этот) приводит к сбою моей программы.
Я хочу знать, что вызов функции в другой программе, подобной тому, что я сделал, невозможен? Если это невозможно, в чем я ошибся?
Вот несколько строк кода:
Моя программа:
TargetThreadId = GetWindowThreadProcessId(hTargetWindow, amp;TargetProcessId);
hLib = LoadLibraryA(DLL_FILE);
pfSetHook = (pfSetHookType)GetProcAddress(hLib, "SetHook");
pfSetHook(hLib, TargetThreadId);
Моя Dll:
#define SHOWADDR 0x00401472
SetHook(HINSTANCE hLib, DWORD dwTargetThreadId)
{
ghHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProc, hLib, dwTargetThreadId);
}
Caller()
{
pfShowType pfShow = (pfShowType)SHOWADDR; // points to fixed address which was defined
pfShow(); // calling
}
Целевая программа:
// The function's address is 0x00401472
Show()
{
MessageBoxA(NULL, "Yeah, I'm a function in Target :)!", "Show Function", 0);
}
И вот код дизассемблирования целевой программы
...
00401472 PUSH EBP
00401473 MOV EBP,ESP
00401475 SUB ESP,18
00401478 MOV DWORD PTR SS:[ESP C],0
00401480 MOV DWORD PTR SS:[ESP 8],Target.0040300>
00401488 MOV DWORD PTR SS:[ESP 4],Target.0040301>
00401490 MOV DWORD PTR SS:[ESP],0
00401497 CALL <JMP.amp;USER32.MessageBoxA>
0040149C SUB ESP,10
0040149F LEAVE
004014A0 RETN
...
Комментарии:
1. Пожалуйста, отправьте код из вашего HookProc. Кстати, установка перехвата WH_CBT просто дает вам несколько оконных сообщений (см. Здесь msdn.microsoft.com/en-us/library/windows/desktop /… ). Поэтому я думаю, что WH_CBT — неправильный выбор, вам следует прочитать о внедрении с помощью CreateRemoteThread .
2. Извините, но я не думаю, что у моего HookProc есть проблемы. Потому что это работает хорошо. У меня просто проблема в том, что когда функция, которая в DLL вызывает фиксированный адрес, переводит мою программу в «призрачное состояние». Если он не выполняет вызов, все в порядке. Вы можете прочитать мои шаги выше. Спасибо.
3. Если вы не объясните, что вы сделали, я сомневаюсь, что вы получите помощь. Вы включили только часть соответствующего кода. Все, что у вас есть, — это исполняемый файл, инжектор и DLL-хук. Вам достаточно просто включить их все.
4. Есть ли какой-нибудь другой способ включить их? Я не думаю, что публиковать все коды — хорошая идея. Спасибо.