Новый ASProtect в EldoS TimelyWeb

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Дождались… Радуйтесь! Вот оно 🙂

Новые фичи:

Изначально 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. Дамп брать нужно также как я говорил в предидущих статьях.

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

{/codecitation}

Добавить комментарий