Внедрение и вызов функции в другой программе

#c #windows #dll #code-injection

#c #Windows #dll #внедрение кода

Вопрос:

Просто для улучшения моих знаний. Я хочу вызвать функцию, которая находится в программе (называемой Target), из моей программы (называемой My program).

Вот мои шаги:

  1. Внедрение моей библиотеки DLL в целевую программу с помощью перехватов Windows.
  2. Моя программа получает адрес ВЫЗЫВАЮЩЕЙ функции в DLL через GetProcAddress, затем использует указатель на функцию для ее вызова.
  3. ВЫЗЫВАЮЩАЯ функция инициализирует указатель функции, который указывает на фиксированный адрес в целевой программе.
  4. А затем, конечно, вызовите ее. Но этот шаг (только этот) приводит к сбою моей программы.

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

Вот несколько строк кода:

Моя программа:

 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. Есть ли какой-нибудь другой способ включить их? Я не думаю, что публиковать все коды — хорошая идея. Спасибо.