eXeL@B —› Софт, инструменты —› Распаковка AsProtect на примерах |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 12 . 13 . >> |
Посл.ответ | Сообщение |
|
Создано: 17 января 2007 12:10 · Поправил: Модератор · Личное сообщение · #1 Здравствуйте! Очень прошу, помогите найти или выдайте пжалста из запасов прогу Advanced Archive Password Recovery v.3.00 кто может, очень хочется научиться распаковке, а проги нормальной нет. Далее повтор моего вчерашнего письма(лежит в чужой теме, найти можно в поиске введите: Распаковка ASProtecta - моё сообщение самое свежее) ---------------------------------------------------------------------- ------------------------------------------------------------------ Здравствуйте. Понимаю, что лезу немного не туда, но обсуждения статьи "Распаковка нового ASProtect на примере Advanced Archive Password Recovery v.3.00" автора SergSh на форуме и в поисковике вроде бы не видно(может статья просто древняя), а тут вроде бы тоже у ASR-ра 2-я версия. Суть проблемы: 1 Сам по вашим статьям научился распаковывать ASProtect 1.22-1.23 ,1.23 RC4, 1.24(проги типа Electra, Куриная месть.Первая разборка, скринсейвер и т.д. с затиранием репой краденого начала проги и без). 2 Нужно двигаться дальше и тут с удивлением обнаруживаю, что статей по распаковке версий 1.3-2.0 нет вааще(может я в шары долблюсь, незнаю). Плиз, если можно, то ссылку на подобную статью, а то руководство как починить велосипед есть(1.21-1.22), как починить мопед-есть(1.23 RC4), как починить боинг747 и космический челнок-есть(2.0x-2.12xx и выше). А вот как отремонтировать просто машину нет. 3 Из всех имеющихся статей более всего понятно было у SergSh в "Распаковка нового ASProtect на примере Advanced Archive Password Recovery v.3.00", но тут такой казус. Проискав в инете подопытную прогу версии 3.0 нашел две ссылки, скачал, инсталятор обещал версия 3.0 (как в статье),- в итоге версия 3.01, чем забиты все ссылки на эту прогу в инете и PEID говорит не ASProtect 1.2-1.3 registered(2.0x по словам SergSh),а ASProtect 2.1x SKE. Ну ладно: а)34раз Shift+F9 ставим бряк на ближайший переход внизу, ещё раз Shift+F9, снимаем бряк,ставим на Alt+M на секцию кода(401000), но не снова Shift+F9, как в статье, а trace into(а то EOP будет на две команды ниже и затруться два Push-а). Останавливаемся на EOP 42A910. Ctrl+A и всё видится чинно и благородно. б)Читаем статейку дальше и пробуем запустить его скрипт(в папку его,в Script , в Олю, в виде txt предварительно). И оля повисает пробовал подождать 1,5 часа думал это скрипт так долго на более свежей версии ASp-ра трудится(хрен то там:s14. Запущено как положено без бряков и с OEP после trace into и я в plugin->IsDebuggerPresent ->Hide, с полным игнором исключений. в) Руками по его совету IAT пока не пробовал, всё так пока трудно для понимания и непривычно и завтра на работу а уже 2ночи. Граждане, слезно молю дайте ссылку на настоящий Advanced Archive Password Recovery v.3.00, а то шатл починить не могу пока, дайте хоть чертежи к боингу. А если почти серьезно, то научиться распаковывать ASPr до второй версии включительно руками хочется так, что аж эти руки зудят. P.S. Не пинайте сильно за дурацкие просьбы самого маленького. Это первый выход в свет. Начал реверсить 18.12.06 с нуля. Реверсил даже в новогоднюю ночь. Для меня это очень важно(научиться распаковывать)! |
|
Создано: 24 мая 2007 08:23 · Поправил: Demon666 · Личное сообщение · #2 tar4 пишет: В ЕСХ - счетчик Не ты его так запутаешь еще больше, там нет префикса rep и ecx тут не причем… (MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] выполнится только один раз) Происходит копирование байта из [esi](значит readme разрешено) по адресу, который в edi находиться, у него нет прав доступа к этому участку памяти на запись, отсюда и наг, но на чтение и исполнение есть… ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 24 мая 2007 09:47 · Личное сообщение · #3 Demon666 прав ибо я уже попробовал вариант когда EAX приёмник EBX источник, да ещё и явно задал единицу в ECX. Один хрен хоть по F7 хоть по F8 при попытке выполнить MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] результатом описанное выше исключение. Странно ещё и то, что секция 400000(PE-заголовок) имеет RWE,- я так понял,что чтение, запись разрешена. ЧТО за хрень ведь ODBgScript 1.48 как то получает право на запись(он три раза в скрипте PE_kill-а пишет в эту секцию хренову тучу байт), я пытаюсь один байтик сменить и хрен то там. Это не может быть какая нибудь Олькина настройка о которой я не подозреваю на изменение PE-заголовка или его секции? Как получают права доступа к секции PE-заголовка на запись? Demon666 плиз если знаешь, как получить права?! Дальнейшая работа стоит из за этого. |
|
Создано: 24 мая 2007 10:02 · Личное сообщение · #4 |
|
Создано: 24 мая 2007 10:55 · Личное сообщение · #5 Hellspawn на может пропустил что в скрипте пе-килла? Нет я вообще не меняю его код, а только внутри ассемблерной вставки в нужный момент пушую то что у него в нескольких регистрах произвожу свои действия и возвращаю как было. Единственным результатом работы моего участка будет то что в единственной его строке будет меняться значение (ххFF) то15FF, то25FF. На ты уверен, что посмотрел в тот столбик? (Access) вообще там должно стоять "R". Сейчас проверю, мог и зевануть(дело происходит на работе, постоянно кто то отвлекает и сушит мозги). Кто, где задаёт эти R или W в свойстве Access? Млин, как это менять если там найду не то что нужно? |
|
Создано: 24 мая 2007 13:27 · Личное сообщение · #6 Alt+M, выбери (обязательно!) секцию PE header, ПКМ->Set access->Full access (получишь доступ RWE CopyOnWr.. в Access ко всем секциям проги (сразу на все Imag ???????? в Type)) После этого можешь писать по этим адресам что хочешь, НО это только для теста того, что ты делаешь(!) не более… ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 24 мая 2007 18:57 · Поправил: Sturgeon · Личное сообщение · #7 Hellspawn пишет: должно стоять "R" Сейчас вот тоже посмотрел все анпакми и пару прог, запакованных разными версиями аспра. В колонке Access у ФФФСЕХ секций стоит атрибут "R". Как оно вообще работает непонятно%). А в колонке Initial access опять же у всех секций стоит RWE. Что это за колонка Initial access? И чем она отличается от просто Access? P.S. Small_S, не мог бы ты перезалить куда нибудь Advanced Archive Password Recovery v.3.00. Ссылка в первых постах уже сдохла, а скачивается отовсюду только v.3.01. Может плохо искал. Ты кстати ковырял эту версию? Там тоже вроде аспр 2.11. Првда она от того, что написано в статье, отличается. P.P.S. Это я решил пройти путь Small_S с самого начала, опираясь на то, что уже было здесь написано. P.P.P.S. Херня какая-то. У меня для вообще всех прог Олька показывает ля всех секций Access "R", а Initial access "RWE". Надо попробовать другую сборку себе поставить. |
|
Создано: 24 мая 2007 22:10 · Личное сообщение · #8 Sturgeon на У меня для вообще всех прог Олька показывает ля всех секций Access "R" сборка тут не при чём. И у меня показывает для всех секций. Ещё днём на работе я провёл два эксперимента. 1 В асм коде PE_kill-а вида mov word ptr ds:[ebx], 15ff засунул нужный мне на тот момент адрес внутри секции пе-заголовка(00400E72). Оля как я и подозревал упала в знакомое исключение. Этим я установил, что код ПЕ_килла имеет те же права доступа, что и мой(это не удивительно так как мой код вставка в его). 2 Зарядил в приведённую выше свою конструкцию адрес приёмника в секции кода(нашел там не распознанную команду FFFF- 00401F15). Как я и ожидал мой байт число-15 был благополучно напечатан по требуемому адресу. Откуда следует вполне определённый вывод: несмотря на то что все секции разрешены только на чтение(Access - R) вполне реально в них можно писать из любой секции, включая и секцию пе заголовка. Доступ же на запись в эту секцию можно получить только какими то неведомыми мне пока способами. Пораскинув мозгами, я понял, что потеряю ещё очень много времени пока узнаю как это делается, если не найду другого выхода и он был найден. В который уже раз я внимательно прошёл по PE_kill-овской подпрограмме скрипта ребилд апи и заметил, что адрес изменяемой аспровой функции оказывается не только на первом run в ecx, но и на последнем в ebx. И тут я понял: зачем в извращенной форме насиловать пе-секцию заставляя записаться в неё 1 байт в такое место. MOV WORD PTR DS:[EBX],15FF лучше заменить эту команду группой своих. Вот новый код и новая сигнатура для последней(третьей посчёту инжекции кода скрипта PE_kill-а) по поговорке а ларчик просто открывался: 00400E18---------------------PUSH EDI 00400E19---------------------PUSH EAX 00400E1A---------------------CALL kernel32.GetProcAddress 00400E1F ---------------------NOP 00400E20 -------------------- ADD ECX,4 00400E23 -------------------- CMP ECX,EDX 00400E25 -------------------- JA SHORT ARCHPR.00400E2D 00400E27 -------------------- CMP DWORD PTR DS:[ECX],EAX 00400E29 -------------------- JNZ SHORT ARCHPR.00400E20 00400E2B -------------------- JMP SHORT ARCHPR.00400E3C 00400E2D -------------------- CMP ESI,EDI 00400E2F -------------------- JE SHORT ARCHPR.00400E3A 00400E31 --------------------- MOV DWORD PTR DS:[ECX],0 00400E37 --------------------- ADD ECX,4 00400E3A ---------------------MOV DWORD PTR DS:[ECX],EAX 00400E3C ----------------------PUSH ECX 00400E3D ----------------------MOV ECX,DWORD PTR DS:[EBX-1] 00400E40 --------------------CMP CL,2E 00400E43 ---------------------JE SHORT ARCHPR.00400E4D 00400E45 ---------------------MOV WORD PTR DS:[EBX],25FF 00400E4A ---------------------POP ECX 00400E4B ---------------------JMP SHORT ARCHPR.00400E53 00400E4D --------------------- MOV WORD PTR DS:[EBX],15FF 00400E52 --------------------- POP ECX 00400E53 --------------------- MOV DWORD PTR DS:[EBX+2],ECX 00400E56 --------------------- ADD BYTE PTR DS:[EAX],AL Остальные изменения отпишу завтра нет уже сил. Завтра ещё бухать на работе надо выспаться. Скрипт проверил только на адвансед пассворд рековери. Не знаю как он пойдёт на других прогах, но здесь просто сказка. Он ещё пошустрее стал работать так как из скрипта при каждом прогоне не исправляет код перехода это во вставке выше(всё таки асм код шустрее скриптового). Если бы не необходимость задавать границы IAT, то вообще бы всё прошло на автомате. После прохода до OEP описанным ранее фаиндером, сразу модернизированный скрипт, оллидамп, сразу импрект. Запуск и никаких падений или вылетов, хоть закрывай, хоть смоти эбаут хоть запускай, хоть сохраняй, хоть что делай. Sturgeon завтра залью, но если ты внимательно читал, то там я как раз и шпарю 3.01 и сейчас проверяю на ней. |
|
Создано: 24 мая 2007 22:15 · Личное сообщение · #9 |
|
Создано: 25 мая 2007 18:54 · Поправил: Small_S · Личное сообщение · #10 Sturgeon вот долгожданный файл, в том виде как мне его предоставил SergSh. _http://dump.ru/files/3/320086937/ Огромная просьба ко всем. Завтра, послезавтра буду делать скрипту автоматический поиск границ IAT и возможно очистку IAT от мусора. Нужны будут испытания. Как вы понимаете испытывать удобно на тех прогах, что покрыты аспром не по самое нихочу, а только с защитой импорта как у адвенсед пассворд рековери. Унпакми приведённые Sturgeon подходят для этих целей мало. |
|
Создано: 26 мая 2007 16:20 · Личное сообщение · #11 1.Ну наконец то свершилось и я уже перешёл на новый ODBgScript v1.62.3.VC6 (26 May 2007) 1.62 (26 May 2007) + Indent/color ASM Blocks (EXEC/ENDE) + Added GCI parameter COMMAND to get asm command string (like OPCODE), SIZE, CONDITION, TYPE + TICK without variable set time from start in text, in "%d ms" format. log purpose. + Added SCMP,SCMPI size parameter, to compare addr data. * DF/SF flags fixed * EOB with EXEC/ENDE fixed * After Error Script Cursor, also added "!" symbol in front of line * Fixed SUB <reg> command <---------Вот это мешало нормально работать скрипту по IAT * Fixed Value History in commands using DoMOV данная версия стала достаточно устойчивой, чтобы уверенно с ней работать. 2. Наконец привожу первую модефикацию скрипта о которой писал ночью 24.05.07 По заявленным ранее причинам я не стану аттачить или постить изменённый скрипт PE_kill-а целиком(пока разрешение на это не получено).Поскольку хотелось бы всё таки провести испытания модификации скрипта, да и новичкам было бы легче обращаться с корректно работающим скриптом,- то поступлю следующим образом: поясняю те строки в скрипте, которые должны быть изменены. Итак перед вами и передо мной исходный скрипт PE_kill-а из его рар статьи, о примере FontExpert 2005. 1. Вводим новые переменные, необходимые для работы: после var OEP(в исходном тексте) вводим var colich_call var colich_jmp var prov mov colich_call,0 // и тутже задаём нулевые значения для двух из них mov colich_jmp,0 Кроме того в блоке инициализации можно убрать переменную var type_api 2. Чуть ниже удаляем диалог выбора типа изменяемых скриптом переходов(место где задаётся var type_api). je @halt mov IAT_end ,$RESULT //Вот после этого //mov type_api,15 //msgyn "Do you want to use opcod "call" (FF15) for recovering redirector? If you choose "No" will be used opcod "jmp" (FF25)." //cmp $RESULT,1 //je @init //mov type_api,25 3. Теперь спускаемся в подпрограмму @repuild_api_init: в самое важное место для работы mov addr_iat_reb,eip mov [eip],#5750E8099E407C9083C1043BCA7706390175F5EB0F3BF77409C701000000008 3C104890 166C703FF00894B02# //ВОТ ЭТУ СИГНАТУРУ НУЖНО ПОМЕНЯТЬ (ОНА БУДЕТ САМА МЕНЯТЬ JMP И CALL) по новому строка будет выглядеть так: mov [eip],#5750E8099E407C9083C1043BCA7706390175F5EB0F3BF77409C701000000008 3C104890 1518B4BFF80F92E740866C703FF2559EB0666C703FF1559894B020000# 4. В этой же подпрограмме меняем ниже такой блок bp eip add eip,37 //25- это старое значение у нас теперь код длиннее bp eip //sub eip,4 - А это место вообще глушим оно раньше принудительно задавало тип //add [eip],type_api перехода JMP или CALL 5. Теперь спускаемся в подпрограмму @repuild_api: и находим такой блок mov edi,DLL_lost bc eip run // сразу за run добавляем блок проверки какой переход найден и две его подпрограммы OPCODE ebx - 1 mov prov, $RESULT ATOI prov mov prov, $RESULT cmp prov,2E je call_15 JMP call_25 call_15: mov colich_call,colich_call + 1 jmp pusk call_25: mov colich_jmp, colich_jmp + 1 pusk: //Добавим необходимую метку sub eip,37 //25- это значение старое у нас код длиннее 6. Идём в подпрограмму @end: и меняем значения в блоке затирающем следы работы скрипта в секции PE-заголовка add eip,7 bc eip add eip,37 //25- это значение старое у нас код длиннее bc eip dec addr_finder fill addr_finder,56,00 //,44,00- это значение старое у нас код длиннее иначе не bphwc LoadLibrary // затрёт полностью В этой же подпрограмме меняем строку выводящую информацию о работе скрипта eval "Script finished! In total {counter} functions are restored!" на эту: eval "Script finished! In total {counter} functions are restored! Восстановлено {colich_call} Call и {colich_jmp} jmp переходов." ВСЁ РАДОСТНО ИСПЫТЫВАЕМ СКРИПТ! МНОЙ ПОКА ОШИБОК В РАБОТЕ НЕ ОБНАРУЖЕНО! ТЕСТИРУЕМ(ЖЕЛАТЕЛЬНО НА ПРОГАХ ТОЛЬКО С ЗАЩИТОЙ ИМПОРТА, ТАК ПРОВЕРЯТЬ ЛЕГЧЕ) ЕСЛИ ОБНАРУЖИВАЕМ КОСЯКИ, ТО ПИШЕМ В ЭТОТ ТОПИК. |
|
Создано: 27 мая 2007 07:12 · Личное сообщение · #12 И снова я поторопился. Скрипт работает только на файлах типа Адвенседа.Сорри перед всеми. Прийдётся учитывать в ассемблерной вставке, то что я делал ранее в прототипе на скриптовом языке(анализатор того что перед аспровым кэллом) и от чего отказался, или ещё более глубоко рыть в самой процедуре после переходника(в командной секции аспра) и искать закономерности. Всё равно будет правильно для 2.1х определять хоть я год буду возиться!!! Повторяю просьбу. Нужно много различных прог только с защищённым импортом для тестирования и проверки различных конструкций. |
|
Создано: 27 мая 2007 16:00 · Личное сообщение · #13 Hellspawn есть идея и возник вопрос точнее два вопроса. Появилась идея использовать для скрипта сигнатуры или их общие части(так например заглянув в сигнатуры ПЕ тулса можно увидеть что в трёх версиях Borland Delphi v4.0 - v5.0; Borland Delphi v4.0 - v5.0; Borland Delphi v3.0 используется общая часть из всех трёх сигнатур 50 6A 00 E8 ?? ?? FF FF BA ?? ?? ?? ?? 52 89 05 ?? ?? ?? ?? 89 42 04). Общая схема о которой я сейчас думаю: а) Определяем, что этот файл принадлежит такой то версии делфи или там С, С++ б) Подставляем в третью часть инжекционного кода PE_kill-а(та что отвечает за восстановление перехода)необходимую сигнатуру, учитывающую особенности перехода JMP или CALL в данной версии. Почему вопрос именно тебе? Да потому что ИМХО DIE на сегодняшний день лучший анализатор паковки, компилинга. Так например PEID говорит на распакованный мной Иконловер не имеет вида, а DIE-Делфи 5 Вопросы: 1. На какой стадии и в какой секции нужно искать наличие сигнатур?(что то я попробовал поискать средствами Оли обозначенную выше сигну в иконловере который на Делфи и ни в каких вариантах не нашёл, толи сигна плохая, но DIE показывает делфи5) 2. Вообще какой алгоритм поиска сигнатур в незнакомых версиях компиляторов?(меня сейчас как сам понимаешь волнуют сигны компиляторов или если есть в них различие сигны компиляторов под протекторами). Hellspawn пожалуйста, ответь на эти вопросы. Я понимаю, многим ветеранам, возможно и тебе могут быть непонятны мои усилия. Зачем так рыть носом землю, если есть мастера, которые всё уже разработали. Но я хочу научиться всему, чтобы самому иметь подобные навыки и знания. |
|
Создано: 27 мая 2007 16:47 · Поправил: Hellspawn · Личное сообщение · #14 Small_S пишет: 1. На какой стадии и в какой секции нужно искать наличие сигнатур? вообще в первой секции: CODE (но это до упаковки) вот тебе мои нароботки: Delphi 6,7 (_InitExe) 538BD833C0A3????????6A00E8????????A3????????A1????????A3????????33C0A3 ????????33C0A3 ????????E8????????BA????????8BC3E8 Delphi 4,5 (_InitExe) 506A00E8????????BA????????5289??????????89????C7420800000000C7420C0000 0000E8 ????????5A58E8 Delphi 3 (_InitExe) 506A00E8????????BA????????528905????????8942??E8????????5A58E8 + я юзаю методу от ДеДе Small_S пишет: 2. Вообще какой алгоритм поиска сигнатур в незнакомых версиях компиляторов? пакуешь несколько файлов с разными опциями и смотришь одинаковое (кол-во секций, их хар-ки, расположение, нахождение импорта - в какой он секции и т.д.) ----- [nice coder and reverser] |
|
Создано: 27 мая 2007 21:23 · Личное сообщение · #15 Hellspawn фенкс за помощь. Уже копаю в этом напрвлении. Правда пока даже в распакованном мной файле в секции кода не могу найти сигнатуры: Delphi 4,5 (_InitExe) 506A00E8????????BA????????5289??????????89????C7420800000000C7420C0000 0000E8 ????????5A58E8 Максимум что встречается(правда часто) из этого ряда это 506A00E8???????? Например: 006B588B---- 50-----------------------PUSH EAX 006B588C----6A 00--------------------PUSH 0 006B588E----E8 6925D5FF----------CALL <JMP.&user32.MessageBoxA> Ну да я согласен, что конструкция явно дельфовая, но всёж хотелось бы для приличия полную сигнатуру поймать. Может правда делфи разный бывает DIE пишет: Borland Delphi[ver:5] Object Pascal Есть отличия в сигнатурах Borland Delphi[ver:5] Object Pascal и Delphi 4,5? |
|
Создано: 27 мая 2007 21:49 · Личное сообщение · #16 |
|
Создано: 27 мая 2007 21:59 · Личное сообщение · #17 Hellspawn Фенкс до меня начинает доходить почему на точке входа в запакованных, но остановленных перед самым запуском прогах не могу найти нужной сигны. Начало то спёрто в отдельную секцию да ещё и разбавлено мусором. Но вот почему я в распакованной NewSec не нахожу, пока недопёр. Я ж в неё восстановил начало скриптом SergSh. По идее основные конструкции должны сохраняться прога то работает. |
|
Создано: 27 мая 2007 22:33 · Личное сообщение · #18 Кажется нашел в NewSec только как же бедняжку перекурочило: было сначала 50 потом через JMP 007B7D7B 6A 00 PUSH 0 007B7D7D 68 A57C7B00 PUSH damp2_ic.007B7CA5 007B7D82 - E9 39F4C4FF JMP <JMP.&kernel32.GetModuleHandleA> потом прыг в первую секцию кода. Н-да.! Это целая история найти и интерпретировать её как дельфовую. У тебя там DIE по ходу умеет мусорный код разгребать? |
|
Создано: 01 июня 2007 23:19 · Поправил: Small_S · Личное сообщение · #19 Привет всем. На работе прилично прижали со временем, пришлось временно замолчать. Из новостей скрипт теперь правильно работает на трёх тестовых прогах (Иконловере, Адвенседе и Фонтэксперте), а может даже и на многих дельфовых, и на многих сишных, не знаю, нужно тестить. Ключевой участок кода выглядит так: GMEMI OEP, MEMORYBASE find $RESULT,#8BC0FF25????????8BC0# CMP $RESULT,0 je Cwat mov [eip],#5750E8099E407C9083C1043BCA7706390175F5EB0F3BF77409C701000000008 3C1048901518B4BFE80F98B740F8B4B0680F98B740766C703FF15EB0566C703FF25598 94B020000# mov nastroika1,3E mov nastroika2,5D jmp PRODOLJ Cwat: GMEMI OEP, MEMORYBASE find $RESULT,#6A002EFF15????????# CMP $RESULT,0 je Cnorm mov [eip],#5750E8099E407C9083C1043BCA7706390175F5EB0F3BF77409C701000000008 3C1048901518B4BFF80F92E740866C703FF2559EB0666C703FF1559894B020000# mov nastroika1,37 mov nastroika2,56 jmp PRODOLJ Cnorm: //#506A00E8????????# mov [eip],#5750E8099E407C9083C1043BCA7706390175F5EB0F3BF77409C701000000008 3C104890166C703FF00894B02# mov nastroika1,25 mov nastroika2,44 PRODOLJ: add eip,2 Однако постить полностью все изменения рано(кому нужно будет сами инициализируйте две новые переменные и там где идёт учёт смещений бряков и освобождения памяти из за разной длины сигнатуры вставляйте эти переменные). Есть и ещё причины: если на Адвенседе и Фонтэксперте скрипт ведёт исправление и подсчёт безукоризненно, то при работе с иконловером присутствует целых 2 бага: а) Первая исправляемая функция одновременно является и точкой входа в прогу, на которую ставит бряк скрипт из за чего видимо там в адресе(в даблворде отвечающем за адрес) появляется не нулевой старший байт(B4). Из за этого адрес переходника смотрит не на скажем 006С45FE(точно не помню это от балды взято для примера) а на B46C45FE,- тоесть черте куда. Я в конец скрипта вставил проверку, там где eip на значение OEP переходит, этого байта, но тут как в поговорке"не верь глазам своим" при прогоне видно, что он нулевой(00), дык какого черта в окне CPU пишем B4. Знаю что в статье SergSh это место вручную правится, хотя там скрипт на другом принципе и тоже видимо косяк(но там вообще аспровый кэлл не преобразуется). б)Когда прогоняется скрипт исправляет он 83h переходов типа jmp а пишет 73h. Уже проверял каждый аспровый кэлл в ручную по условию есть mov eax,eax до или после вызова. Хоть сверху, хоть снизу есть хотя бы по одному и правит правильно(83 перехода). Пока недопёр почему счётчик работающий идеально в двух других прогах всбрыкивает в этой. Вот код обновлённого счётчика(инициализируется ещё одна переменная): mov nastroika,ebx FIND nastroika,#25# mov nastroika,nastroika + 1 cmp $RESULT,nastroika //prov,25 je call_25 call_15: mov colich_call,colich_call + 1 jmp pusk call_25: mov colich_jmp, colich_jmp + 1 pusk: Есть и ещё причина участок кода, где задаются сигнатуры 3-ей инжекции будет не там где он сейчас, а в самом начале скрипта, он же будет одновременно не только задавать переменные для инжекции но и искать по типичным для каждой версии сигнам обращений к IAT, начало IAT. Все наверное заметили, что я отказался пока от идеи определять по полной сигнатуре тип компилятора и уже затем подгружать тот или иной вариант инжекции. Искать полное первое обращение к скажем гетмодулехандле у дельфовой проги под VM - это потребует недетской изворотливости от скрипта(там и кода наверное будет ещё треть от того, что уже есть в скрипте), а это всего один вариант и фиг его знает сколько там всяких сюрьпризов в этом мусорном коде(в общем до времён когда или кодить буду мощнее или прижмёт, что деваться некуда). К томуже и так заставил правильно работать. |
|
Создано: 02 июня 2007 20:55 · Личное сообщение · #20 Привет всем по поводу вчерашнего бага а) удалось разобраться написать в конце скрипта процедурку по коррекции этого бага. Сорри за плохую память и уточняю байт который там висит B4, сейчас исправлю в посте выше. Однако это не связано с постановкой бряка на точке входа. Я доходил до последнего исключения и последнего джеемпе и по Cntrl+G переходил на адрес 004071С0 без всяких бряков, В4 там всё равно висит. Причины этого байта мне непонятны может кто то пояснит из ветеранов? Одно могу сказать точно обычными способами перезаписать из скрипта поверх B4 00,- не возможно(я перепробовал всяко, даже ставил eip посреди слова адреса и тёр нулями DWORD, результат один байты адреса перезаписываются, заколдованный байт нет). Я поступил в связи с таким непонятным косяком в своей обычной манере,- если перелезть через гору никак, то обойдём её. Ниже участок кода, добавленный в конце скрипта. Он не требует инициализации новых переменных, используются 3 старых(их значения можно менять к этому времени) и пару регистров(аналогично). bc eip @CORREKCIA: mov nastroika,OEP FIND nastroika,#FF25??????B48BC0# CMP $RESULT,0 mov nastroika,$RESULT je @endend FIND nastroika,#000000000000000000000000000000000000# cmp $RESULT,0 je @sorry mov nastroika1,$RESULT + 8 mov nastroika2,nastroika1-nastroika-5 mov eip,nastroika mov [eip],#E9# mov ebx,nastroika2 mov eax,[eip+2] mov [eip+1],ebx mov eip,nastroika1 mov [eip],#FF25# mov [eip+2],eax mov [eip+6],#8Bc0# mov [eip+8],#E9# xor ebx,ebx mov [eip+9],ebx - nastroika2 - A mov eip,OEP JMP @endend @sorry: eval "Вижу ошибку адресации IAT по адресу {nastroika}, но не могу найти достаточно свободного места, чтобы исправить!" msg $RESULT @endend: eval "Script finished! In total {counter} functions are restored! Восстановлено {colich_call} Call и {colich_jmp} jmp переходов." msg $RESULT Логика подпрограммы проста. Ищет по сигнатуре этот косяк(после отработки основной части скрипта), если не нашёл то заканчиваем. Если нашёл, то ищем достаточно места,запоминаем адрес вызова API в таблице, в eax. Далее формируем переход туда пишем там нормальный вызов из таблицы, добавляем mov eax,eax и записываем переход назад, но уже к следующему вызову API. Данная доработка сделана не зря снял ради эксперимента дамп без устранения бага и нашёл в дампе B4. То есть без этого дополнения прейдёться править руками. Обойти то обошёл, но просто любопытно что это за B4 такое нестираемое??????????? |
|
Создано: 04 июня 2007 23:02 · Личное сообщение · #21 Привет всем. И снова нужна помощь. Кто знает хорошо API. Мне нужна функция которая бы по адресу (четырёхбайтовому), что в IAT выясняла бы начало это АПИ-функи или нет(соответственно если не начало, то ноль в каком нибудь регистре). Лоадлайбрари, насколько я понял из статьи PE_kill-а возвращает в EAX базу библиотеки, а в edi - указатель на строку названия функции(вроде не подходит ибо даже если и будет показывать не на строку названия, а куда то ещё, то как в асме различить на строку это или нет и если на строку то на какую). Зачем я думаю все понимают и против мусора, и для механизма поиска. Встречаются мусорные строки указывающие на область адресов API, но они явно левые, так как оля которая мигом пишет, имя API по 4-хбайтовому адресу просто молча показывает адрес. Пожалуйста не молчим, пожалуй только это держит, уже продуман и выполнен механизм поиска границ IAT. Возможно, что и без такого определения будет работать, но хотелось бы сделать точно, всё левое вычистить, нормальные вызовы в API и в прогу оставить. |
|
Создано: 05 июня 2007 14:41 · Личное сообщение · #22 Small_S Ну насколько я видел разные анализаторы и т.д. Если им просто тыкают на какой-то адрес в пространстве процесса и спрашивают, это адрес АПИ-функции или нет, то они просто начинают парсить все экспортируемые функции из всех библиотек в этом процессе и просто сравнивать. Если совпало-АПИ, нет-значит нет. Способ хреновый и медленный, но лучше я не видел, если вопрос так понял. |
|
Создано: 05 июня 2007 14:58 · Личное сообщение · #23 Archer правильно понял. У меня уже есть задумка, по формальным признакам начала АПИ проверять прям по её коду, каждый вызов. В асм вставке это будет наверное довольно шустро. Я думаю пару байт сравнить у нескольких сотен функций за секунду пробежит. Пока проверяю эту версию и пока против этого ничего не говорит, но крайне мало времени. Режим на работе до 21-21_30, ужин, отлежаться пол часа. И до 2х ночи больше не могу, сильно спать хочется на работе, на утро(с 8ми работаю). Просто я думал есть АПИ какая нить ей кидаешь адрес, а она название функи + в другом регистре ноль если не точка входа в функу(начало функи), не знаю как правильно выразиться. Читать, искать некогда, Archer не знаешь как там в апи устроено. В секции кода понятно код фунок, а где эти сами названия(строки) и как они связаны с началом этого кода?? |
|
Создано: 05 июня 2007 15:50 · Личное сообщение · #24 |
|
Создано: 05 июня 2007 17:03 · Личное сообщение · #25 Small_S Насчёт связи названия функи с началом её кода-надо смотреть в сторону таблицы экспорта, как она устроена. Тут устройство что для АПИ, что для любой библиотеки одинаковое. И лучше тут ничего нет, имхо, как парсить её именно руками, ибо так быстрее, чем вытаскивать оттуда имя, а потом через GetProcAddress искать её код. Своего кода у меня на это нет, так что поделиццо не могу. Логика, имхо, побыстрее будет, но скорее всего не это место будет самым узким по скорости. |
|
Создано: 06 июня 2007 04:30 · Личное сообщение · #26 Small_S пишет: Ещё интересный для меня вопрос: Что выполняется в асме быстрее- mov ecx, 00000000h или xor ecx,ecx. xor ecx,ecx Small_S пишет: по формальным признакам начала АПИ проверять прям по её коду, Мне кажется, ты слишком много хочешь от скрипта. Эта операция, если да же ты ее реализуешь, будет занимать много времени. Да и, насколько я помню, аспр забирает часть кода начала апи и у тебя могут возникнуть проблемы с распознованием одной и той же функции в разных прогах... p.s. Может пора тебе перейти на "чистый асм" и писать лоадер? |
|
Создано: 06 июня 2007 09:59 · Личное сообщение · #27 Привет всем. tar4, немного недопонял меня. Сейчас идёт работа над правильным распознаванием скриптом начала и конца IAT, с одновременным распознаванием и удалением адресов не имеющих отношения к вызовам АПИ и к вызовам в тело(в любые адреса) проги. В идеале после работы распознавателя начала-конца и одновременно чистильщика всей секции, где находится таблица вызовов IAT, в данной секции должны остаться только вызовы АПИ и вызовы адресов, что ведут в прогу.И вся эта часть ещё до работы движка PE_kill-а, так как именно она "сообщит" движку исходные границы таблицы IAT. Поэтому, я думаю, скрипт не будет волновать аспр забирает часть кода начала апи , ведь он забирает у спертых(защищённых), а мы чистим мусор среди неспёртых вызовов. Или я ошибаюсь и он прёт даже у фунок, которые имеют изначально нормальный вызов в проге, и как вирь или драйвер размещает в системных библиотеках свои jmp на свой участок кода? Определитель начала-конца+чистильщик будет в виде асм вставки. К великому сожалению в последние дни меня сильно выматывают на работе, видимо основной результат будет на праздниках, когда появится хотя бы один спокойный день. Так то всё готово, подход к вставке готов, признаки начала АПИ(по которым буду смотреть мусор, не мусор) в секции кода системных библиотек изучены вчера. Осталось закодить вставку со свежей головой. |
|
Создано: 06 июня 2007 12:33 · Личное сообщение · #28 |
|
Создано: 06 июня 2007 20:23 · Личное сообщение · #29 PE_Kill , приветствую и на страницах топика!(в личке уже написал). мой последний скрипт именно так и делал. А что за скрипт? Его где то найти можно или это что то приватное? можно ничего не чистить, а просто похукать заполнение IAT адресами - Это очень интересно и будет непременно изучено. Просто сейчас я уже в шаге от выполнения того, чего задумал, уж дожму.(да и сколько времени потрачено ибо я не Гейтс, не Торвальдс и не Вирт,- вьезжаю ме-ее-едленно :s1 |
|
Создано: 07 июня 2007 06:30 · Личное сообщение · #30 Small_S пишет: А что за скрипт? Его где то найти можно или это что то приватное? После стотьи дописывал скрипты. Когда скрипты превратились по размеру в толковые словари (ХЗ сколько тысяч строк там было) я их все грохнул, ибо скриптисы - зло, сильно держат в своих рамках и не дают создать что то действительно стоящее. ----- Yann Tiersen best and do not fuck |
|
Создано: 07 июня 2007 22:33 · Личное сообщение · #31 Привет всем. Хотел я сегодня порадовать общество доделанным поисковиком чистильщиком, но случилась одна загвоздка. Вставка(асм) работает нормально и весьма быстро, пока проверяемые адреса имеют истиное значение, но среди мусора попадается некоторые значения, которые хотя и лежат в области АПИ библиотек, но в несуществующих адресах(там же секции не перекрывают полностью всё пространство). Вот когда асм вставка пытается прочесть признаки начала АПИ по такому адресу наступает исключение чтения чёрте от куда. Знатоки функций АПИ, к вам обращаюсь!!! НУЖНА АПИ КОТОРАЯ БЕРЁТ ЛЮБОЙ АДРЕС И ВОЗВРАЩАЕТ НОЛЬ(АДРЕС НЕ СУЩЕСТВУЕТ), 1 (АДРЕС СУЩЕСТВУЕТ). Ни в жизнь не поверю, что такой нет на свете. Как это чудо зовётся? Мне не надо о ней дайте мне только имя уж я её нахлобучу как надо. Я сейчас пытаюсь подстроить сюда eoe команду скрипта, но это гон, асм в 1000раз быстрее, к тому же eoe весьма глючное существо (я уже имел с ним дело ранее) PE_Kill зло то оно зло но пока без них никуда. Не молчим, вот оно, уже работает, хреновы исключения мешают!!! Ну или как на асме обработать исключение чтения из никуда???????????????? |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 12 . 13 . >> |
eXeL@B —› Софт, инструменты —› Распаковка AsProtect на примерах |