| Сейчас на форуме: _MBK_ (+5 невидимых) | 
| eXeL@B —› Вопросы новичков —› Джамп на сам-себя. | 
| Посл.ответ | Сообщение | 
| 
 | 
Создано: 03 октября 2010 15:09  · Личное сообщение · #1 Доброго времени суток форумчане. Загрузил в Олю файл, и стал "позновать мир". Наткнулся на следующий код: Code: 
 Вот дошёл я до адреса 003700С0 и понял что пишу эти строки в правильном подфоруме. Нажимаю на F8 и регистр EIP показывает что без подсказки Реверсеров с crackl@b'a мне не выйти из этого лабиринта. Любопытства ради поставил бряк на 003700C2 и нажал F9, чисто позырить что будя дальше. И бряк сработал! Также смотрю в Оле окно 'Threads' и вижу что поток создался. Вот собственно просьба: У кого есть время и желание, пожалуйста поясните истину этого кода и как это вапще сработало ? Заранее благодарю. ![]()  | 
| 
 | 
Создано: 03 октября 2010 15:49  · Личное сообщение · #2 cosinus Хм. Хороший код. Выполнено сцепление калбэка и вызывающего кода в графе, это мутирующий код. Использован следующий способ. Перед калбэком определяется макро, связующее посредством процедурного ветвления вызывающий код: Code: 
 Например в данном случае: Code: 
 Тогда загрузка ссылки на калбэк происходит следующим образом: Code: 
 Я использую аналогичный способ, только делаю блок выполняющий возврат глобальным для сокращения размера: Code: 
 Модель основана на том факте, что инструкция Call загружает в стек адрес следующей за ней инструкции. Если не секрет откуда взят этот код ? ![]()  | 
| 
 | 
Создано: 03 октября 2010 16:43 · Поправил: cosinus  · Личное сообщение · #3 Clerk откровенно говоря нифига не понял ![]() Если вас не затруднит, "на пальцах" поясните. После нажатия F9 какой именно код выполнялся? Джамп на сам-себя ?, то как я из него вышел... Ведь по сути это тупик. Code: 
 P.S. Так же в этом файле присутствует следущий приём: Code: 
 Дойдя до адреса 00401FFF и нажатия F8 я переместился на вполне нормальный код, но позвольте приберечь это для следующего вопроса. Этот файл распознаётся антивирусом как Worm, и распространяется он через флешки. Уж простите новичка, но не что так не даёт азарта как реверс вируса. Нежели просматривать в отладчике "код по отправке SMS через интернет". ![]()  | 
| 
 | 
Создано: 03 октября 2010 17:09  · Личное сообщение · #4 cosinus После исполнения инструкции по адресу 0x3700B6 в стеке будет адрес возврата 0x3700BB, а Ip = 0x3703DA. Там инструкция Pop Eax извлечёт из стека адрес возврата, а следующее ветвление загрузит в стек адрес 0x3703DD и вернёт управление на следующую за вызывающим ветвлением инструкцию. Что тут может быть не понятно ? Это такой способ загрузки ссылки, блок эквивалентен Push 0x3703DD. Только при перестройке графа смещение не может быть задано в виде константы или дельтасмещения. На счёт 0x401386 - там вобще ничего не обычного нет. Просто холостые инструкции, так как !al. ![]()  | 
| 
 | 
Создано: 03 октября 2010 17:39 · Поправил: cosinus  · Личное сообщение · #5 Тут всё понятно, что парочка 'pop eax, call eax' эквивалентна команде push 003703DDh. И что создаётся поток, "код" которого начинается этого адреса. Непонятно как выбрался из этого кода ? Code: 
 А что касается 00401386, то тут тоже ясно что инструкция add byte ptr ds:[eax],al при al равно 0 является эквивалентом инструкции nop. Но дойдя до адреса 00401FFF нажал F8 и переместился на вполне нормальный код, просто не понятно как это произошло, если на вершине стека (да и под ней) находились адреса "недров" kernel32.dll да и в регистрах тоже ничего интересного не было... а управление перешло на адрес 00402001. До: ![]() После: ![]() Но давайте сначала о "Джампе на сам-себя" поговорим. ![]()  | 
| 
 | 
Создано: 03 октября 2010 17:57 · Поправил: Clerk  · Личное сообщение · #6 cosinus Поток зацикливается. Что с ним происходит далее - откуда же мне знать, может он так и висит за ненадобностью, может иной поток завершает его или изменяет его контекст, или инициирует исключение в нём, может есчо что, этого никто не знает. > управление перешло на адрес 00402001. Ну это ведь следующая страница, кудаже есчо процессор перейдёт. Он выполнит add byte ptr ds:[eax],al(часть инструкции в конце первой страницы, часть в начале следующей   ), затем Pushad.
![]()  | 
| 
 | 
Создано: 03 октября 2010 18:38 · Поправил: cosinus  · Личное сообщение · #7 >>Любопытства ради поставил бряк на 003700C2 и нажал F9, чисто позырить что будя дальше. И бряк сработал! Это гвоорит о том что главный поток не остаётся в подвешенном состоянии Видимо в создаваемом потоке кроется ответ, на то как выйти из джампа-на-сам-себя. Потому что создаётся поток с флагом dwCreationFlags. цитата: "Флажки, которые управляют созданием потока. Если установлен флажок CREATE_SUSPENDED, создается поток в состоянии ожидания и не запускается до тех пор, пока не будет вызвана функция ResumeThread. Если это значение нулевое, поток запускается немедленно после создания. В это время, никакие другие значения не поддерживаются." Я просто прозивал этот момент... >>Ну это ведь следующая страница, кудаже есчо процессор перейдёт. Ну тут уж даже не знал об этом. Спасибо. ![]()  | 
| 
 | 
Создано: 03 октября 2010 21:05 · Поправил: Clerk  · Личное сообщение · #8 cosinus > Ну тут уж даже не знал об этом. Спасибо. Виртуальная память линейная. Про сегментация памяти вы можите не подозревать, так что это только отладчика проблема, связанная с хидером модуля. > Это гвоорит о том что главный поток не остаётся в подвешенном состоянии Это говорит о том, что код вызвал другой поток и что вы не умеете обращаться с отладчиком. ![]()  | 
| 
 | 
Создано: 03 октября 2010 21:13 · Поправил: cosinus  · Личное сообщение · #9  | 
| eXeL@B —› Вопросы новичков —› Джамп на сам-себя. | 
| Эта тема закрыта. Ответы больше не принимаются. | 






 ), затем Pushad.

 Для печати