Код (Text): #include <windows.h> #include <Tlhelp32.h> PVOID InjectFunc(HANDLE ProcessHandle,PVOID RemoteFunc,DWORD RemoteFuncSize) { PVOID RemoteFuncAddr; DWORD Written; RemoteFuncAddr = VirtualAllocEx(ProcessHandle, NULL, RemoteFuncSize, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(ProcessHandle, RemoteFuncAddr,RemoteFunc, RemoteFuncSize, &Written); return RemoteFuncAddr; } DWORD WINAPI RemoteWinMain(PVOID pvParam) { MessageBox(0,"Injected !!","From Notepad.exe",0); return 0; } DWORD RemoteWinMainEnd() { return 0; } BOOL EnableDebugPrivilege() { HANDLE hToken; if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) return false; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL)) return false; CloseHandle(hToken); } return (GetLastError() == ERROR_SUCCESS); } int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR LpCmdLine,int nShowCmd) { EnableDebugPrivilege(); HANDLE hSnapshot; PROCESSENTRY32 Entry; HANDLE PROCESS; PVOID RemFunc; DWORD ThreadID; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Entry.dwSize = sizeof(Entry); Process32First(hSnapshot, &Entry); do { if (memcmp("notepad.exe",Entry.szExeFile,strlen("notepad.exe")) == 0) { PROCESS = OpenProcess(0x1F0FFF,true,Entry.th32ProcessID); RemFunc = InjectFunc(PROCESS,RemoteWinMain,DWORD(&RemoteWinMain)-DWORD(RemoteWinMainEnd)); CreateRemoteThread(PROCESS,NULL,0,(LPTHREAD_START_ROUTINE)RemFunc,NULL,0,&ThreadID); } } while (Process32Next(hSnapshot, &Entry ) ); return 0; } процесс Notepad.exe падает тыкните где у меня проблема уже замучался.
Код (Text): RemoteWinMain,DWORD(&RemoteWinMain)-DWORD(RemoteWinMainEnd)); можт Код (Text): &RemoteWinMain,DWORD(&RemoteWinMainEnd)-DWORD(&RemoteWinMain)
WIN32 + к FreeManCPM Например, не помешает указать в вызове VirtualAllocEx в последнем параметре PAGE_EXECUTE_READWRITE, ты же собираешься выполнять код. Как, по-твоему, организован вызов функций из системных dll’ек в notepad.exe– call на jmp user32.MessageBox или непосредственно в коде call user32.MessageBox, и так же ли организован вызов во внедряемом коде? Где, по-твоему, располагаются строчки "Injected !!" и "From Notepad.exe", и что будет находиться по адресам этих строк, полученным в качестве параметров notepad.exe.RemoteWinMain в адресном пространстве notepad.exe? Резюме - детский сад.
q_q если честно я ничего не понял из того что ты сказал, свои недочёты с выделением памяти исправил, но так и не понял почему не работает код если не трудно на пальцах распишите.
FreeManCPM где про это почитать можно, или хотябы приведи пример пожалуйста как сделать мою функцию RemoteWinMain базонезависимой.
прочитай это http://www.wasm.ru/article.php?article=green2red01 и это http://www.wasm.ru/article.php?article=green2red03
>> инжектируемый код должен быть базонезависем. ога, и мало того, в инжектируемой ф-ции используются константы, которые находятся в секции данных, а ты ведь только код инжектируешь... WIN32 врядли подобная ф-ция будет работать когда-нибуть, поэтому не парься и инжекти свой бинарник целиком по его базовому адрессу (или по любому, если обратывать фиксапы)
Код (Text): static DWORD WINAPI __stdcall RemoteMain( LPVOID lpParam ) { char a[]="333aaaaaaaaZZ"; return 0; } static BOOL InjectThisExe(HANDLE Process,DWORD (WINAPI *EntryPoint)(LPVOID),DWORD dwFuncSize) { LPVOID lpRemoteFuncAddr = NULL; BOOL ret = false; lpRemoteFuncAddr = VirtualAllocEx(Process,NULL,dwFuncSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); DWORD dwWritten = NULL; ret = WriteProcessMemory(Process,lpRemoteFuncAddr,EntryPoint,dwFuncSize,&dwWritten); return ret; } Вот, открываю процесс с правами 0x1F0FFF Код (Text): PROCESS = OpenProcess(0x1F0FFF,false,Entry.th32ProcessID); InjectThisExe(PROCESS,RemoteMain,DWORD(RemoteMainEnd)-DWORD(RemoteMain)); так вот потом олькой подрубаюсь к процессу и ищю : char a[]="333aaaaaaaaZZ"; но ничего похожего в памяти нет, что за байда ? хотя WriteProcessMemory возвращяет true; что не так делаю ?