Сейчас на форуме: bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› Отладка удаленного потока |
Посл.ответ | Сообщение |
|
Создано: 22 февраля 2011 16:53 · Личное сообщение · #1 Всем привет, у меня такая проблема: Инжектю кусок кода в стиле шел-кода в експлорер. Потом создаю через CreateRemoteThread() удаленный поток. Созданный поток получает управление и тут експлорер падает и перезапускается. Вобщем что-то где-то коряво работает. Мой вопрос: Как, чем и можно ли вообще отлаживать уже именно этот созданный поток??? OllyDbg??? Конечно можно отладить сам инжектируемый код чтоб работал ровно а потом уже его инжектить, но хотелось-бы именно поток. |
|
Создано: 22 февраля 2011 17:24 · Личное сообщение · #2 зацикливай поток и аттачся к процессу. ----- Nulla aetas ad discendum sera | Сообщение посчитали полезным: Sunzer |
|
Создано: 22 февраля 2011 17:25 · Личное сообщение · #3 |
|
Создано: 22 февраля 2011 18:14 · Личное сообщение · #4 |
|
Создано: 22 февраля 2011 18:20 · Личное сообщение · #5 |
|
Создано: 22 февраля 2011 18:21 · Поправил: ajax · Личное сообщение · #6 |
|
Создано: 22 февраля 2011 18:26 · Личное сообщение · #7 |
|
Создано: 22 февраля 2011 18:36 · Личное сообщение · #8 |
|
Создано: 22 февраля 2011 18:41 · Личное сообщение · #9 |
|
Создано: 22 февраля 2011 18:47 · Личное сообщение · #10 |
|
Создано: 22 февраля 2011 19:18 · Поправил: kap00stik · Личное сообщение · #11 Так ну в общем с отладкой разобрались. Отладили так сказать, во время отладки у меня чуть не выпрыгнули глаза Короче такое дело, этот код работал безотказно на XP SP2 и 3. После долгого перерыва опять зачасались руки и решил погадить немного. Откопал етот сурс, компилю его теперь уже под Win 7 все ок, при запуске вылетает експлорер (ну вы уже знаете) Лажу код, прохожу нахождение kernel32.dll базы все нормально. (адрес: 0х75870000) Нахожу адрес GetProcAddress(), (адресс функции: 0х75876C5B) сохраняю его для далнейшего пользования но оставляю его в регистре EAX. pushe на стэк адрес базы и адресс строки с именем функции которую хочу найту и вызываю GetProcAddress() вот тут-то и начинается самое интересное: Процесс терминируетса, acess violation при вызове адреса из EAX. (он какого-то хера стал не 0х75876C5B а 0xFFFFFFFF). Проделывал сию операцию много раз, результат один и тот-же. Непосредственно перед вызовом, лучше сказать во время вызова адресс вызываемой функции заменяетса прямо у меня на глазах с 0х75876C5B на 0xFFFFFFFF. Вопрос: кто или что шутит со мной такие шутки??? При этом при всем этот-же код опять-таки работает под win xp без проблем. |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 22 февраля 2011 19:19 · Поправил: ELF_7719116 · Личное сообщение · #12 Sunzer за himself: jmp himself разговор был, если я правильно понял. Цпу на полную грузит(по крайней мере если поток на ядро и ядер в процессоре больше одного то как таковых тормозов не будет) kap00stik Трасиш F8 в ольке, доходиш до CALL EAX, F8 И EAX=-1 вместо GetProc...? Просто так регист не может измениться! |
|
Создано: 22 февраля 2011 20:01 · Поправил: neomant · Личное сообщение · #13 |
|
Создано: 22 февраля 2011 22:16 · Личное сообщение · #14 |
|
Создано: 22 февраля 2011 23:09 · Поправил: kap00stik · Личное сообщение · #15 Ну вот я и разобрался. Дело в том что функция возвращавшая мне Kernel Image Base адрес возвращает мне какойто левый адрес. Выходит что код, не плохо послуживший мне под win xp отказывается это делать под win 7, ну и походу под висту. использовал PEB метод описанный здесь: Вопрос: ну и что теперь делать с этим Windows 7 ??? Как окапаться на нем? Надо еще два другие SEH i topstack метода поробовать. А может кто уже сталкивался с этим под семеркой??? Всмысле как писать базонезависимый код работающий также в win vista и 7??? |
|
Создано: 22 февраля 2011 23:45 · Поправил: Clerk · Личное сообщение · #16 kap00stik В начале про термины. То что вы назвали шелл'кодом это код с плавающей базой судя по всему. Реальный шелл получает управление при переполнении локальных буферов, его не вызывают через создание удалённых потоков. У вас же пикод, таким образом размер его не критичен(для шелла он критичен). Отсюда нужно и плясать. Незачем брать кернел из загрузчика(в 7 там вроде уже kernelbase), он должен быть найден средствами нэйтива. Тоесть LdrGetDllHandle() etc. Не следует людей путать > как писать базонезависимый код работающий также в win vista и 7??? Также как и привязанный к базе и работающий в 7, только оформлять надлежащим образом. Так как пикод не морфится, то можно и фиксапы использовать. Выполнить релокацию вручную. В более полноценном варианте используется загрузка из памяти, а весь функционал представляет собой длл. |
|
Создано: 23 февраля 2011 01:51 · Личное сообщение · #17 Clerk пишет: В начале про термины. То что вы назвали шелл'кодом это код с плавающей базой судя по всему. Реальный шелл получает управление при переполнении локальных буферов, его не вызывают через создание удалённых потоков. У вас же пикод, таким образом размер его не критичен(для шелла он критичен). Спасибо за поправку, но я помоему говорил что код толко в стиле shell кода. А насчет терминов ты прав, надо называть вещи своими именами (если конечно знаеш их имена :s6 Clerk пишет: Незачем брать кернел из загрузчика(в 7 там вроде уже kernelbase) Вот тут нихрена не понял, ты имееш в виду что программа носитель сама находит все адреса, прописывает их в placeholder'ы в инжектируемом коде и потом его инжектит? Типа чтобы внедренный код попу не морщил с поиском адресов а сразу принимался за работу? (В принципе если нихера не разберусь, то пожалуй так я и сделаю) P.S. Ребят я не русский, не пинайте меня |
|
Создано: 23 февраля 2011 08:03 · Личное сообщение · #18 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 23 февраля 2011 09:38 · Личное сообщение · #19 kap00stik Незачем брать кернел из загрузчика(в 7 там вроде уже kernelbase), он должен быть найден средствами нэйтив Он говорит что в Windows 7 кроме kernel32.dll откуда вы берете свои API, есть kernelbase.dll(туда перенесена часть процедур). Нейтив - использовать ntdll.dll для получения низкоуровневых функций(в kernel32 лежат "wrappers" т.е. обвертки низкоуровневых API). Например GetModuleHandle() есть обвертка LdrGetDllHandle(). Впрочем Native API требуют unicode строки и заполнения специальных структур, удобно ли вам их будет использовать, незнаю. Вообще как уже кто-то успел сказать, Win 7 не самая лучшая ось для реверсера. |
|
Создано: 23 февраля 2011 14:21 · Поправил: kap00stik · Личное сообщение · #20 ELF_7719116 пишет: Он говорит что в Windows 7 кроме kernel32.dll откуда вы берете свои API, есть kernelbase.dll(туда перенесена часть процедур). Вот этого я не знал (век живи, век учись), надо покопаться в ней, только один хрен не понимаю, зачем перенесенны, и почему тогда только часть процедур... (ну это походу одному ms известно). Вот именно это походу и делает мой старый код не работоспособным. Потому-что например LoadLibraryA() я в семерке в kernel32.dll уже не нашел Ну чтоже, гимороя добавляется. ELF_7719116 пишет: Нейтив - использовать ntdll.dll для получения низкоуровневых функций(в kernel32 лежат "wrappers" т.е. обвертки низкоуровневых API). Например GetModuleHandle() есть обвертка LdrGetDllHandle(). Впрочем Native API требуют unicode строки и заполнения специальных структур, удобно ли вам их будет использовать, незнаю. Да это-то в принципе понятно, только гимороя шибко много. ELF_7719116 пишет: Вообще как уже кто-то успел сказать, Win 7 не самая лучшая ось для реверсера. Мдаааа, походу так есть, но если что то я не реверсер. Просто как уже писал, после долгого перерыва (лет 5-6) захотелось опять покодить, кинулся, а не один софт из времен win xp под семеркой не работает Aaaaaaaaaaaaaaaaaaaaaaaaaa. Ну вот я и нашел все ответы на свои вопросы, кому будет интересно смотреть здесь: blog.harmonysecurity.com/2009/06/retrieving-kernel32s-base-address.html Ну тем не менее всем спасибо! |
eXeL@B —› Программирование —› Отладка удаленного потока |