Про stdafx забудь, у мну не работает пример вываливаетс с "Попытка обращения к неверному адресу" вот здесь Код (Text): char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(hNewModule==NULL) return false;
Если тебе просто нужно там что-то изменить просто юзай WriteProcessMemory, не надо аллокать. А еще лучше перепиши в FASM.
Угу, тем более у эксплорера, к которому м.б. подключена куча шелл-экстов фиг знает по каким адресам. Хотя, у меня по этому адресу память в эксплорере нормально выделяется. Поэтому причина м.б. смешной - возможно память при одном из запусков все же выделилась, но произошел облом в другом месте, но поскольку выделенная память не освобождается, то при последующих попытках происходит обломс. Надо бы сделать рестарт системы и добавить в код ожидание завершения потока с последующим освобождением выделенной памяти
Ладно, если уж зашла тема про удалённые потоки, то нужно обьяснить. У твоего инжекта изначально не верный принцип. Эта строка передаст управление вникуда. Когда начинает исполняться диспетчер APC нельзя никак контролировать поток, он может и будет исполнять не наш код, он будет исполнять код процесса, в который внедряется наш код и если приложение разрешит внедряться, тогда будет выполнен наш код. Например вновь созданный поток обойдёт все модуля, вызывая их InitRoutine(), более того, редирект любого места в процессе обработки апк на код, который будет фильтровать подобные попытки - инжект не удастся выполнить. Нормально при инжекте удалённый поток должен создаваться следующим образом: > Все потоки должны быть остановлены посредством NtSuspendProcess. > Выполняется перехват диспетчера APC(KiUserApcDispatcher). Тут вариантов несколько: - Сплайсинг. - Редирект на диспетчер исключений, но для этого диспетчер исключений также должен быть перехвачен. - Удалённо VEH зарегистрировать невозможно, изза ксора указателя с локальными в процессе куками. Если проекция ntdll защищена от записи(путём замещения файловой проеции модуля на не файловую) запись в пределы секций кода ntdll не удастся и следовательно перехват тоже. > После создания потока и начала исполнения им внедрённого кода снимаются перехваты и потоки выводятся из спящего состояния, посредством NtResumeProcess. Использовать приватную память для инжекта не удобно. Лучше использовать проекцию секции, в этом случае для записи в ап не нужно использовать NtWriteVirtualMemory/NtAllocateVirtualMemory(бывает важно для зиродеев) и это позволяет леко выполнить обмен данными с инжектящим процессом, так как память разделяемая.
Код (Text): #pragma comment(linker,"/BASE:0x13140000") // сдвигаем базу нашего процесса #include < windows.h> #include < tlhelp32.h> #include <stdio.h> #include <strsafe.h> // ------- тут как обычно описываем прототипы функций -------- DWORD GetProcessID(char*); BOOL Inject(HANDLE,DWORD(WINAPI* func)(LPVOID)); DWORD WINAPI func(LPVOID); void ErrorExit() { LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0, NULL ); MessageBox(NULL, (LPCSTR)lpMsgBuf, "Ошибка", MB_ICONERROR | MB_OK); LocalFree(lpMsgBuf); ExitProcess(1); } int SetDebugPrivileges(void) { TOKEN_PRIVILEGES Debug_Privileges; if (!LookupPrivilegeValue (NULL,SE_DEBUG_NAME,&Debug_Privileges.Privileges[0].Luid)) ErrorExit(); HANDLE hToken = 0; if (!OpenProcessToken (GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES, &hToken)) ErrorExit(); Debug_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; Debug_Privileges.PrivilegeCount = 1; if (!AdjustTokenPrivileges (hToken,FALSE,&Debug_Privileges,0,NULL,NULL)) ErrorExit(); return 0; } //-------- главная функция.... вопросов возникнуть не должно :-) --------- int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int) { if (SetDebugPrivileges()) return false; if(!Inject(OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID("iexplore.exe")),&func)) return false; return true; } //-------- а вот это та самая функция, которая будет выполнять наши, ------- //-------- конечно же, доброжелательные действия в --------------------- //-------- чужом адресном пространстве :-)) --------------------------- DWORD WINAPI func(LPVOID) { LoadLibrary("kernel32.dll"); // нам необходимо подгрузить жертве в процесс LoadLibrary("user32.dll"); // требуемые нам библиотеки (их может и не быть изначально) SYSTEMTIME SysTime; GetSystemTime(&SysTime); WORD time=SysTime.wSecond+30; //while(time!=SysTime.wSecond){GetSystemTime(&SysTime);} MessageBox(0,"Hello from addres area of explorer","title",0); return true; } //-------- в поисках нашей жертвы --------- DWORD GetProcessID(char* lpNameProcess) // в параметрах передаем имя процесса жертвы { HANDLE snap; PROCESSENTRY32 pentry32; snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(snap==INVALID_HANDLE_VALUE) return 0; pentry32.dwSize=sizeof(PROCESSENTRY32); if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;} do { if(!lstrcmpi(lpNameProcess,&pentry32.szExeFile[0])) { CloseHandle(snap); return pentry32.th32ProcessID; // вот наша жертва для внедрения кода;-) } }while(Process32Next(snap,&pentry32)); CloseHandle(snap); return 0; } //-------- функция внедрения в пространство жертвы ------------------- BOOL Inject(HANDLE hProc,DWORD(WINAPI* func)(LPVOID)) { DWORD id; DWORD ByteOfWriten; HMODULE hModule = GetModuleHandle(NULL); if (!hProc) ErrorExit(); DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage; char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(hNewModule==NULL) ErrorExit(); if (!WriteProcessMemory(hProc,hNewModule,hModule,size,&ByteOfWriten)) ErrorExit(); if(ByteOfWriten!=size)ErrorExit(); HANDLE hThread=CreateRemoteThread(hProc,NULL,16384,func,(LPVOID)hNewModule,CREATE_SUSPENDED ,&id); if(!hThread) ErrorExit(); ResumeThread(hThread); WaitForSingleObject(hThread,-1); if (!VirtualFreeEx(hProc,hModule,0,MEM_RELEASE)) ErrorExit(); if(hThread==0) ErrorExit(); return true; } Вот это у мну работает, одно но iexplore.exe вместо explorer.exe ибо x64
LoadLibrary("kernel32.dll"); // нам необходимо подгрузить жертве в процесс LoadLibrary("user32.dll"); // требуемые нам библиотеки (их может и не быть изначально) kernel32 -конечно же не будет...
Рестарт делал! А очищать низя! нужно чтобы потом эти изменения я же и показал ... в виде усложнения алгоритма. Код (Text): BOOL WINAPI WriteProcessMemory( __in HANDLE hProcess, __in LPVOID lpBaseAddress, __in LPCVOID lpBuffer, __in SIZE_T nSize, __out SIZE_T *lpNumberOfBytesWritten ); __in LPCVOID lpBuffer - для моего примера как должен выглядеть этот указатель ? Если не затруднит...
Попробуй будет у тебя работать или нет собранный образ - http://depositfiles.com/files/41nh3v3vq проэкт vs2005 - http://depositfiles.com/files/lj6pqqjfq
dag Твой exe-шник запускается и выполняется как нада =) А вот с кодом прблемы =(( компилил в Builder'е и есть следующие вопросы: 1) зачем тебе "strsafe.h" (у меня её, во-первых, нету, а, во-вторых, на неё ничего не ссылается) 2) после компила следующие ошибки: [Linker Error] бла-бла-бла (счаз пока их решаю)
ВСЕМ ОГРОМНОЕ СПАСИБО!!!! Я выполнил поставленную задачу, но без ВАШЕЙ помощи не справился бы! Отдельное спасибо dag'у !!!