скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Новый ASProtect в EldoS TimelyWeb


Дождались... Радуйтесь! Вот оно :)

Новые фичи:

  • Изначально IAT загажена мусором, а помере создания импорта некоторые части этого мусора заменяются на нормальные адреса.
  • Переходники к апи теперь имеют вид похожий на Starforce.
  • Статические АПИ(ну типа у которых возвращаемое значение одинаковое) теперь имеют другой вид.
  • Часть кода первоначальной проги(от OEP до первого CALL) забирается в код аспротекта. Т.е. в дампе там 00 00 ...

Как вывод из 1) - "Iat autosearch" даст неправильные результаты; вывод из 2) и 3) - апи не определяются. Ну и фиг с ним :)

Чтоб не было мусора нужно просто забить нолями секцию импорта перед тем как аспротект начнет туда писать адреса апи. Чтобы не долбаться с восстановлением апи сделаем похитрому :) Если посидеть и подолбаться то можно поставив bpr на секцию импорта увидеть место, где аспротект подменяет адрес реальной апи на адрес своего переходника, а потом пишет адрес переходника в импорт. Вот расскрою военную тайну о том как найти такое место :) Все как обычно: bpx mapviewoffile и потом bpx getprocaddress. После первого срабатывания bpx getprocaddress жмем 3 раза F12. Видим вот такое дело:


Mov EAX, [EBP+C]
Push EAX
Call xxxxxx - мы выйдем отсюда, в EAX будет адрес реального апи
Call yyyyyy - Тут идет создание переходника и в EAX возвращается адрес переходника.
Mov EDX, [EDI]
Mov [EDX], EAX - записываем в IAT адрес переходника

Таким образом если занопить Call yyyyyy то Mov [EDX], EAX будет заполнять IAT адресами реальных апи :) Но если все вот так и бросить, то аспротект рухнет после создания импорта т.к. он блюдет целостность своего кода :) Поэтому после создания импорта надо все вернуть наместо(т.е. нопы вернуть на родину). Таким образом мы получим практически полный импорт. Будет не хватать 9 функций 2 повторяются итого 7. Эти функции можно легко определить вручную(также как Kola делал), А.С. не сильно их изменил.

Вот они:


1 0022D244 kernel32.dll 01A3 GetProcAddress *
1 0022D248 kernel32.dll 018D GetModuleHandleA
1 0022D258 kernel32.dll 0149 GetCommandLineA
1 0022D3B0 kernel32.dll 023E LockResource
1 0022D3F8 kernel32.dll 01DC GetVersion
1 0022D418 kernel32.dll 01A3 GetProcAddress *
1 0022D420 kernel32.dll 018D GetModuleHandleA
1 0022D44C kernel32.dll 015B GetCurrentProcessId
1 0022D45C kernel32.dll 0135 FreeResource

* - ну почти, тут как обычно есть добавка для получении имени юзера и дней триала. OEP находим как обычно через BPR, тока тут оно сработает не перед прыжком на oep, а на тех байтах которые аспр спер у проги :)

Типа так:


015F:00EA66A3 CALL 00EA66A8 - тут bpr сработает.
015F:00EA66A8 POP EBP
015F:00EA66A9 SUB EBP,00496FBD
015F:00EA66AF LEA ECX,[EBP+00496FD1]
015F:00EA66B5 ADD ECX,EBX
015F:00EA66B7 MOV [ECX+01],EAX
015F:00EA66BA JMP 00EA66BC
015F:00EA66BC PUSH EBP *
015F:00EA66BD MOV EBP,ESP *
015F:00EA66BF ADD ESP,-0C *
015F:00EA66C2 PUSH EBX *
015F:00EA66C3 PUSH ESI *
015F:00EA66C4 PUSH EDI *
015F:00EA66C5 MOV EAX,0062167C *
015F:00EA66CA PUSH 90909090 - это выход к OEP, пока что тут NOP
015F:00EA66CF RET

* - то что должно быть в начале проги.

Входим в CALL 00EA66A8 и у JMP 00EA66BC команда PUSH 90909090 превратится в PUSH 00621E22. Т.е. OEP почти 621E22 :) Нужно только дописать байты из аспра в дамп с адреса 621E14. Там как раз ноли идут и ждут когда их вернут на родину. Т.е. OEP = 621E14. Дамп брать нужно также как я говорил в предидущих статьях.

Вот в принципе и весь новый аспр.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook