Здравствуйте! Вот столкнулся с проблемой. Необходимо внедрится в чужой процесс, записать туда шеллкод, записать аргумент и выполнить свой код в чужом процессе со своим аргументом. Вот код Код (Text): int ololol(char *str) { FILE* f; int res; char olo1[50]; char olo2[50]; void* strmem; DWORD codemem,dwExitCode=0; char shellcode[]= "\x60\x9C\xBA\xB0\x05\x27\x01\x8B\x12\x8B\x92\x94\x2D\x00\x00"// pusshad; pushfd; mov edx, 12705B0; mov edx,[edx]; mov edx,[edx+2D94] "\x64\xA1\x2C\x00\x00\x00\x8B\x00\x89\x50\x08\x6A\x00"// mov eax,FS:[2C]; mov eax,[eax]; mov [eax+8],edx; push 0; "\xB8\x78\x56\x34\x12\x50\x50\xE8\x88\xF6\x7C\x00\x83\xC4\x0C"//mov eax,12345678; push eax; push eax; call 7CF6B0; add esp, C "\x9D\x61\xC3\x90";//popfd; popad; retn; nop; f=fopen("D:\\crack\\hiew\\code.txt","wb");// для отладки ReadProcessMemory( hProc, (LPVOID)(0x0133D5B0), (LPVOID)&res, sizeof(res), NULL ); while (res!=0) { ReadProcessMemory( hProc, (LPVOID)(0x0133D5B0), (LPVOID)&res, sizeof(res), NULL ); Sleep(0); } SuspendThread(mThread);//тормозим удаленный поток strmem=VirtualAllocEx(hProc,NULL,1024,MEM_COMMIT,PAGE_READWRITE);//выделяем память под аргумент if (strmem==NULL) ShowMessage("Can't alloc some mem1"); ShowMessage(HexToStr((DWORD)strmem));// showing me str addr WriteProcessMemory(hProc, strmem,&str[0],100,NULL); codemem=(DWORD)VirtualAllocEx(hProc,NULL,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE); if (codemem==NULL) ShowMessage("Can't alloc some mem2"); ShowMessage(HexToStr((DWORD)codemem)); WriteProcessMemory(hProc, (LPVOID)codemem,&shellcode[0],sizeof(shellcode),NULL); WriteProcessMemory(hProc, (LPVOID)(codemem+29),&strmem,sizeof(codemem),NULL);// корректируем адресс аргумента ReadProcessMemory( hProc, (LPVOID)(codemem), (LPVOID)&olo1[0], 50, NULL );//для отладки ReadProcessMemory( hProc, (LPVOID)(strmem), (LPVOID)&olo2[0], 50, NULL );// для отладки fwrite(&olo1[0],1,50,f);//для отладки fwrite(&olo2[0],1,50,f);//для отладки ShowMessage("Пристегнуть ремни. Создаем поток!"); HANDLE rThread=CreateRemoteThread(hProc,NULL,0,(LPTHREAD_START_ROUTINE)codemem,NULL,0,NULL); if (rThread==NULL) ShowMessage("Не удалось создать поток!"); if (WaitForSingleObject(rThread, 10000) == WAIT_OBJECT_0) if (!GetExitCodeThread(rThread, &dwExitCode)) ShowMessage("Не получен код завершения"); CloseHandle(rThread); ResumeThread(mThread); if(!VirtualFreeEx(hProc,(LPVOID)strmem,0,MEM_RELEASE)) ShowMessage ("Can't free mem"); if(!VirtualFreeEx(hProc,(LPVOID)codemem,0,MEM_RELEASE)) ShowMessage ("Can't free mem"); fclose(f); return 0; } Код отрабатывает, но вешает чужой процесс. При чем ошибки совершенно разные. То ILLEGAL_INSTRUCTION, то ACCESS_VIOLATION. В шеллкоде есть call (CALL 007CF6B0). Без него все нормально работает, поток создается, шеллкод отрабатывает, поток завершается. Это меня заставляет думать что все проблема в нем. Как я понял опкод call - E8XXXXXXXX, где XXXXXXXX=физ адресс функции в удаленном файле - физ адресс след оператора. Но шеллкод постоянно внедряется по новому адрессу. Подскажите пожалуйсто кто знает как на лету скорректировать этот адресс. Виртуальный адресс шеллкода найти можно. по смещению 38 к нему этот адресс. Это надо получить физ адресс следующей за call команды и от физ адресса вызываемой функции отнять его? Или я где-то ошибаюсь? Поправьте если что. Уже 2 недели маюсь.
furang У тебя не правильно собирается инструкция CALL Код (Text): xxx: CALL Func xxx- адрес инструкции Func- адрес кого надо вызвать должно быть представлено как E8, delta где delta=Func-xxx-5 Взял бы отладчик и посмотрел
Значит все-таки я был прав что call всему виной. Все немного осложнено тем, что "буяню" я в чужом процессе. Func - известен ее физический адресс xxx - мжно найти виртуальный адресс Вот что меня смущает. Если отнимать от физ адресса виртуальный или наоборот, то получится каша не хуже моей. Как я понимаю чтоб получить физ адресс xxx от него надо отнять 0x00400000?
Какие еще физические адреса о_0 ? Статьи читал ?)) Там везде виртуальные адреса. Тебе Rustem все написал. Если не хочешь считать дельту делай mov eax, Func; call eax. Тогда это будет абсолютный адрес. Смотри формат команды call...
Этот физ адресс я получил когда в IDA дизасемблил. Я понял что везде виртуальные. Посему и спросил как правильно поступить... За совет спасибо. уже чувствую что это именно то, что мне надо))
Всем спасибо. Под чутким руководством dead_body и не без помощи этого топа http://wasm.ru/forum/viewtopic.php?id=35004 все разрешилось. Пришлось вручную высчитывать и корректировать call (E8 XXXXXXXX).