Читаю Криса Касперски "Исскуство дизасемблирования". В 38 главе прочитал, что один из способов поиска OEP в запакованном приложении являеться установка точки останова на esp-4... Немогу понять почему esp-4.. ? esp -4 по идее даст нам какую-нибуть локальную переменную...
Перед переходом в OEP нужно сделать стек таким как у оригинальной программы. Если сравните упакованную и оригинальную, стек различается. https://exelab.ru/faq/EP_и_OEP https://habrahabr.ru/post/102126/ https://forum.antichat.ru/threads/raspakovka-obschij-podxod.27741/ http://websait.net.ru/xa089/114/5.htm https://wasm.in/threads/poisk-oep-ustanovka-bp-na-esp-4.32304/#post-392585 http://www.gfs-team.ru/articles/read/135 Вы посмотрите Введение в отладку с нуля, все вопросы должны отпасть сразу.
Vadimcg, Вся память ниже esp это не стек. Поиск OEP в общем случае происходит так: Получается поток инструкций(IF) каким то образом - трассировка, эмуляция или через визор. Эвристически обнаруживается инициализация апп, это например вызов некоторых известных апи. Так как до этого момента код выполнялся произвольный, то он может быть получен из накопленной трассы. Понятие OEP весьма расплывчато, EP может не быть вовсе, к примеру апп начинается выполняться в дллмайн, далее отработает загрузчик и вызовет апп EP. Что в таком случае считать OEP - это можно сделать зная только частный, исходный механизм обработки апп.
Таки шо вы ему голову морочите? По вопросу: Упаковщик должен вернуть после распаковки программе состояние с тем же самым стеком и состояниями регистров, как было в Entry Point. Чтобы произвести распаковку упаковщик должен использовать регистры, использовать стек. Поэтому, чтобы иметь возможность вернуть все как было, он сохраняет состояние регистров в локальные переменные (да, esp-4 - это локальная переменная). Поэтому, когда он закончит, чтобы вернуть стек к исходному состоянию, он обратиться в т.ч и к значению, лежащему в esp-4. Когда он его окончательно уберет из стека, то, скорее всего, это будет значить что распаковка окончена.
yashechka, Какие есчо виксы ? njeen, > Таки шо вы ему голову морочите? Что это значит ? Тоесть вы можите предложить какой то более общий принцип нахождения EP ? #5 - абсолютный бред в каждом утверждении.
Это означает, что вы слишком усложняете ответ, хотя вопрос был проще и более конкретный. Здесь не была речь о наиболее общем способе, спрашивалось, в чем суть "одного из способов поиска OEP в запакованном приложении" , а именно - установки bp на esp-4. На мой взгляд, логично и не бредово - раскрывает суть метода. Если считаете иначе - аргументируйте.
njeen, > спрашивалось, в чем суть "одного из способов поиска OEP в запакованном приложении" , а именно - установки bp на esp-4. Обычно апп не обращается ниже стека. А посему ваш вопрос частный и касается конкретного примера. Так как этот семпл вы не привели, то предсказать ничего нельзя. Нет тут пифии
yashechka, Вроде ведь просто описал, без каких то заумных понятий и абстракций. Слой пакера иногда вообще нельзя снять, так как он единое целое с апп. То что выше сказали чушь - потому что: > esp-4 - это локальная переменная Это не переменная и не на стеке, я говорил. Зачем мониторить обращения в стековую память за пределы стека представить сложно, видимо это конкретный трюк", который нельзя рассматривать его не имея.
Да вот и нет. Вполне может быть локальной переменной. По входу в функцию мы имеем в esp указатель на адрес возврата. Esp - вершина стека. Локальные переменные отсчитываются от некоторого адреса (addr - 4*N), обычно от ebp, но это может быть и его вершина в esp, поэтому локальная переменная не обязана быть в пределах от его начала до вершины, особенно в leaf функциях, которые никаких других из себя не вызывают.
njeen, Не может быть переменной, так как эта часть стека используется для обработки ошибок/прерываний. Если возникнет исключение, то данные будут утеряны. > но это может быть и его вершина в esp, Смещение при адресации через esp может быть только положительным в пределах стека [esp + N]. Указатель стека это не GPR, в который можно загрузить произвольное значение и использовать его далее.
Ну хорошо. Но код упаковщика скорее всего будет формировать свой кадр стека, сдвигая его вершину (не будет же он это все на регистрах делать), и esp-4 уже может быть локальной переменной для его фрейма
njeen, Возьмите любой пакер, запустите под визором/трассировкой, вы обнаружите что обращений ниже esp нет, только когда разворачивается исключение, но это не выборка данных(DF), а загрузка инфы ядром на стек. > и esp-4 уже может быть локальной переменной для его фрейма Ничего не понятно, покажите реальный пример.
Взять что-нибудь простое, - например, calc.exe, накрытый upx. Что upx делает в первую очередь при распаковке - pushad, сдвигая тем самым вершину стека. Код (Text): ;-- entry0: 0x010efb20 60 pushal 0x010efb21 be00000d01 mov esi, section.UPX1 ; section.UPX1 0x010efb26 8dbe0010f3ff lea edi, [esi - 0xcf000] 0x010efb2c 57 push edi ,=< 0x010efb2d eb0b jmp 0x10efb3a | 0x010efb2f 90 nop | 0x010efb30 8a06 mov al, byte [esi] | 0x010efb32 46 inc esi | 0x010efb33 8807 mov byte [edi], al
njeen, Ну и где тут обращения ниже стека ? push загружает на стек данные и смещает указатель стека на размер данных.