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