Я пытаюсь внедрить простой исполняемый файл в другой исполняемый файл, который я сделал, к сожалению, всякий раз, когда я ввожу код в исполняемый файл, он говорит, что «simpleinjected.exe перестал работать», а затем закрывается. Я использую CreateRemoteThread
для ввода кода. Это то, что я сделал до сих пор.
Injector.exe // файл, который внедряет код
#include <stdio.h>
#include <windows.h>
#define procId 2844
#define executable "executable.exe" // located in same directory
int main()
{
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, procId);
LPVOID allocated = (LPVOID)VirtualAllocEx(hProc, NULL, strlen(executable), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProc, (LPVOID)allocated, executable, strlen(executable), NULL);
LPVOID libaddr = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)libaddr, NULL, NULL);
CloseHandle(hProc);
return 0;
}
Simpleinjected.exe // внедряемый файл
#include <stdio.h>
int main()
{
printf("Hello");
return 0;
}
executable.exe // исполняемый файл внедряется в simpleinjected
#include <windows.h>
int main()
{
MessageBox(NULL, "Injected successfully", "Code Injection", MB_OK);
return 0;
}
Сообщение не отображается и simpleinjected.exe
аварийно завершает работу. Сбой показывает, что код был вставлен, но я не понимаю, почему он падает.
При использовании DLL и той же методики, описанной выше, dll выполняется в «simpleinjected.exe», но не работает при внедрении в Firefox. Код dll ниже. Он выполняется в пользовательском приложении, но не в Firefox, даже если он успешно внедрен.
dllinject.dll
#include <windows.h>
int message(const char *msg)
{
MessageBox(NULL, msg, "Message from Dll", MB_OK);
return 0;
}
BOOL WINAPI DLLMain(HINSTANCE hInstDll, DWORD ulReason, LPVOID lpReserved)
{
switch(ulReason)
{
case DLL_PROCESS_ATTACH:
message("process attach");
break;
case DLL_THREAD_ATTACH:
message("thread attach");
break;
case DLL_PROCESS_DETACH:
message("process detach");
break;
case DLL_THREAD_DETACH:
message("thread detach");
break;
}
return true;
}
VirtualAlloc
недостаточно велик, так какstrlen(executable)
не включает места для вашего символа терминатора (который, кстати, также необходимо записать). удачи в этом, кстати. - person WhozCraig   schedule 30.09.2014