Я использую метод CreateRemoteThread () + LoadLibrary () для ввода кода.
Все нормально, когда я запускаю свой инжектор на моем ноутбуке с 64-битной ОС Windows7, и он все еще работает в 64-битной Windows Server 2012 R2 для некоторых целевых приложений.
НО, в этой среде Windows Server 2012 для некоторого целевого приложения, которое является старым приложением MFC, CreateRemoteThread завершился успешно, но DllMain не был вызван, и я обнаружил, что LoadLibrary () кажется неудачным, используя GetExitCodeThread () на создан удаленный поток.
Для записи памяти в целевом процессе я посчитал завершающий 0 байт.
Кроме того, я уже знал, что адрес kernel32.dll одинаков как для Windows 7, так и для Windows Server 2012, используя метод, представленный в приведенной ниже части ответа URL.
Сбой CreateRemoteThread, возможно, lpBaseAddress в целевом процессе недействителен, но он выделен системой?
GetExitCodeThread () ниже получил нулевой код выхода.
HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)addr, arg, NULL, NULL);
if(hThread == NULL) {
OutputDebugString(_T("Error: the remote thread could not be created.\n"));
writeLog("Error: the remote thread could not be created.");
}
else {
DWORD dResult = WAIT_OBJECT_0;
dResult = WaitForSingleObject(hThread, 1000*3);// the thread may already exited, so do not wait INFINITE
DWORD dwExitCode = 0;
GetExitCodeThread(hThread, &dwExitCode);
if(dwExitCode == 0)
{
writeLog("Error: LoadLibraryA failed.");
}
else
{
OutputDebugString(_T("Success: the remote thread was successfully created.\n"));
writeLog("Success: the remote thread was successfully created.");
}
}
Есть ли у вас какие-либо идеи, что я должен подозревать дальше?
Подводя итог, на диаграмме ниже вы можете увидеть, что единственная ошибка - это только когда я запускаю инжектор на Windows Server 2012 для внедрения в какое-то старое приложение MFC.
На диаграмме ниже приведена информация о том, сколько лет приложению MFC:
* * 1030
Я пытаюсь предоставить достаточно информации, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
ниже приведен полный код для ввода моей DLL:
void inject(int procID, char* pszHookDll)
{
g_nTargetProcId = procID;
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
g_hTargetProc = process;
BOOL bInit = SymInitialize(g_hTargetProc, g_sPdbFolder, TRUE);// for analysing the information spy.dll send out
if(process == NULL) {
writeLog("Error: the specified process couldn't be found.");
}
/*
* Get address of the LoadLibrary function.
*/
LPVOID addr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
if(addr == NULL) {
writeLog("Error: the LoadLibraryA function was not found inside kernel32.dll library.");
}
//addr = getProcAddrInTargetProcess(procID, process);
/*
* Allocate new memory region inside the process's address space.
*/
int nBufSize = strlen(pszHookDll)+1;
LPVOID arg = (LPVOID)VirtualAllocEx(process, NULL, nBufSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if(arg == NULL) {
writeLog("Error: the memory could not be allocated inside the chosen process.");
}
/*
* Write the argument to LoadLibraryA to the process's newly allocated memory region.
*/
int n = WriteProcessMemory(process, arg, pszHookDll, nBufSize, NULL);
if(n == 0) {
writeLog("Error: there was no bytes written to the process's address space.");
}
/*
* Inject our DLL into the process's address space.
*/
HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)addr, arg, NULL, NULL);
if(hThread == NULL) {
writeLog("Error: the remote thread could not be created.");
}
else {
DWORD dResult = WAIT_OBJECT_0;
dResult = WaitForSingleObject(hThread, 1000*3);
DWORD dwExitCode = 0;
GetExitCodeThread(hThread, &dwExitCode);
if(dwExitCode == 0)
{
writeLog("Error: LoadLibraryA failed.");
}
else
{
OutputDebugString(_T("Success: the remote thread was successfully created.\n"));
writeLog("Success: the remote thread was successfully created.");
}
}
/*
* Close the handle to the process, becuase we've already injected the DLL.
*/
//CloseHandle(process);close after symcleanup
}