![]() |
eXeL@B —› Основной форум —› Проблемы с работой Win32 API |
Посл.ответ | Сообщение |
|
Создано: 18 ноября 2005 14:52 · Личное сообщение · #1 Доброе время суток, господа. наткнулся на интересное явление при модификации чужого кода в памяти во время выполнения. Дело такое: кус кода встраивается в процесс (WriteProcessMemory+CreateRemoteThread) и грузит в контекст жертвы заданную длл-перехватчик..... После завершения "внедрежного" потока дллка в памяти процесса есть, и пытается работать. В ней я перехватываю управление в 2х точках жертвы - ставлю переходы на свой код (оригинальные байты, ессно выполняю, но потом). Жертва многопоточная, но на этапе срабатывания патча- самое начало работы - поток всего один. Проблема такая - любой вызов АПИ (CreateFile,CreateDirectory,MessageBox,etc) завершается ошибкой, GetLastError() после "файловых" вызовов отдает 998 - Invalid access to memory location. дллка написана на С, рантайма нети(точнее не должно быть). Ф-ции Virtual* работают прекрасно..... Вопрос: что сие может быть и как лечить? Спасибо. ![]() |
|
Создано: 18 ноября 2005 14:55 · Личное сообщение · #2 |
|
Создано: 18 ноября 2005 14:59 · Личное сообщение · #3 Вообче-то, это я уже проделал. Код системных либов там честный..... и мой код тоже вызывается так как нужно. Все планируемые параметры оказываются на своих местах... адреса стековых и глобальных переменных тоже в порядке, как и их содержимое. PS. и нечего орать ![]() ![]() |
|
Создано: 18 ноября 2005 15:02 · Личное сообщение · #4 |
|
Создано: 18 ноября 2005 15:11 · Личное сообщение · #5 эээээ. уточни, плз. кто сказал про джампы???? Что ты имеешь в виду? Поскольку патч сильно специализирован под версию жертвы, то я просто жестко вшил оригинальный код. ессно, нв место перехвата ставится jmp, там я забочусь о сохранении всех регистров, потом call Engine, потом восстановление регистров, потом оригинальный код - там по 2-3 команды типа push reg/ call reg+offs и джамп обратно.... ![]() |
|
Создано: 18 ноября 2005 15:17 · Поправил: Step · Личное сообщение · #6 Вообщето исходники, или фрагмент кода был бы не лишним. Когда ты делаешь джамп обратно, стек валиден ? Проверь есть ли все аргументы на верхушке, eip возврата, и естественно перед всем этим должны в стеке лежать результаты проэмулированных команд (типа push ebp). entusiast пишет: в место перехвата ставится jmp, там я забочусь о сохранении всех регистров, Ты это делаешь в перехваченной DLL ? Не в своей функции а именно в чужой API ? ![]() |
|
Создано: 18 ноября 2005 15:41 · Поправил: entusiast · Личное сообщение · #7 Step пишет: Когда ты делаешь джамп обратно, стек валиден ? а как же? Жертва-то продолжает работу..... и грузится даже ![]() это враппер основной штуки:
а вот она сама - [c] void __stdcall Interceptor(const char* name,void* _ptr,DWORD blksize) { DWORD err=GetLastError(); char fn[MAX_PATH];strcpy(fn,name); for(unsigned i=0;i<strlen(fn);i++) if(fn[i]=='/')fn[i]='.'; HANDLE hFile=CreateFile(fn,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,FILE _ATTRIBUTE_NORMAL,NULL); if(hFile!=INVALID_HANDLE_VALUE) { DWORD dwWr; WriteFile(hFile,_ptr,blksize,&dwWr,NULL); CloseHandle(hFile); } else GetLastError(); SetLastError(err); } [c] Все значения наблюдаю. оптимизация на всяк случай оторвана... вот, забыл утонить. враппер сажается во вражью длл, штука - в моей. ![]() |
|
Создано: 18 ноября 2005 15:49 · Личное сообщение · #8 |
|
Создано: 18 ноября 2005 15:57 · Личное сообщение · #9 |
|
Создано: 18 ноября 2005 16:18 · Личное сообщение · #10 Step: Эти ф-ции я не трогаю. там откуда-то куда-то передается буфер на обработку. в этот момент я его цапаю и пытаюсь записать в файл..... ASMax: пофиг...... проблема не в том, что жертва падает после выполнения моей ф-ции, а в том, что мой код обламывается ![]() Кстати, может просто не хватает стека? Стек-то тут чужой получается...... а восстанавливается правильно. ![]() |
|
Создано: 18 ноября 2005 16:27 · Личное сообщение · #11 |
|
Создано: 18 ноября 2005 16:59 · Поправил: entusiast · Личное сообщение · #12 Step: Спасибо за совет. Решил проблему так:
действительно, не хватало стека...... ![]() |
![]() |
eXeL@B —› Основной форум —› Проблемы с работой Win32 API |
Эта тема закрыта. Ответы больше не принимаются. |