Вопрос почему когда удалённый тред стартует, по адресу 004014F0 (адрес RemoteMain) ничего нету ? Код (Text): #include <windows.h> #include <stdio.h> #include <tlhelp32.h> #include "f.h" static DWORD WINAPI __stdcall RemoteMain( LPVOID lpParam ) { return 0; } static DWORD WINAPI __stdcall RemoteMainEnd( LPVOID lpParam ) { return 0; } /* Функция внедрение процесса в процесс :) Внедрение образа текущего процесса в чужое адресное пространство. EntryPoint - адрес точки входа внедренного кода. */ static BOOL InjectThisExe(HANDLE Process,DWORD (WINAPI *EntryPoint)(LPVOID)) { DWORD dwModuleSize = NULL, dwThisModule = NULL; LPVOID dwNewModule = NULL; DWORD dwWritten = NULL, dwThreadId = NULL, dwFuncSize = NULL; char szTemp[1024]; bool ret = false; HANDLE hRemThread; dwFuncSize = DWORD(&RemoteMainEnd)-DWORD(&RemoteMain); dwThisModule = (DWORD)GetModuleHandle(NULL); dwModuleSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE *)(dwThisModule) + ( ( PIMAGE_DOS_HEADER )( dwThisModule ) ) -> e_lfanew + sizeof( DWORD ) +sizeof( IMAGE_FILE_HEADER ) ) ) ) -> SizeOfImage; dwNewModule = VirtualAllocEx(Process,NULL,dwFuncSize,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN ,PAGE_EXECUTE_READWRITE); ret = WriteProcessMemory(Process,dwNewModule,EntryPoint, DWORD(&RemoteMainEnd)-DWORD(&RemoteMain), &dwWritten); hRemThread = CreateRemoteThread(Process,NULL,0,EntryPoint,NULL,0,&dwThreadId); return ret; } int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { EnableDebugPrivilege(); HANDLE hSnapshot; PROCESSENTRY32 Entry; HANDLE PROCESS; char szTemp[1024]; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Entry.dwSize = sizeof(Entry); Process32First(hSnapshot, &Entry); do // Список процессов { if (memcmp("notepad.exe",Entry.szExeFile,11) == 0) { PROCESS = OpenProcess(0x1F0FFF,false,Entry.th32ProcessID); InjectThisExe(PROCESS,RemoteMain); } } while (Process32Next(hSnapshot, &Entry ) ); return 0; }
Во-первых: dwNewModule = VirtualAllocEx(Process,NULL,dwFuncSize,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN ,PAGE_EXECUTE_READWRITE); выделит память начиная неизвестно с какого адреса. Нужно вместо NULL указывать нужный тебе адрес. Во-вторых, если ты вместо NULL поставишь конкретный адрес, и он окажется занятым, то функция вернёт ошибку. Поэтому нужно использовать связку VirtualAllocEx с указанным lpAddress и следом за ней VirtualProtectEx на случай, если эта память уже кому-то выделена. Скорее всего это придётся делать в цикле для каждой страницы, а то ни одна из них не сработает, наверное.
я в длл делал так Код (Text): VirtualAllocEx(HPROCESS,nil,$1000,MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE); и усё норм выделялось
Так мне показалось, что он внедряет текущий образ в адресное пространство другого процесса, и не похоже, что код базонезависим. А с базонезависимым кодом конечно да, проще 0 передавать.
asd ты читал вообще код ? Код (Text): static DWORD WINAPI __stdcall RemoteMain( LPVOID lpParam ) { return 0; } чем тебе не базонезависем ? NULL система сама выбирает адрес +
Читал. И вот это InjectThisExe(PROCESS,RemoteMain); с последующим вот этим CreateRemoteThread(Process,NULL,0,EntryPoint,NULL,0,&dwThreadId); никак на базонезависимость не тянет. Вариатнов 2 либо тот что тебе на краклабе сказали, либо мой, с выделением памяти, где нужно.
Код (Text): hRemThread = CreateRemoteThread(Process,NULL,0,(LPTHREAD_START_ROUTINE)dwNewModule,NULL,0,&dwThreadId); Тема закрыта