Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Новый 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. Дамп брать нужно также как я говорил в предидущих статьях.

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay