Новая фишка для любителей Asprotect

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

Автор: Hex

Ковырял я когда-то PowerStrip. Распаковал, все ок, только одна мелочь — не вылазит popup menu на иконки в трэе. Я и так и эдак — не нашел в чем глюк. Но вот попалась мне в руки прога Advanced Administrative tools которая пролила свет на эту тайну…

Если распаковать Aatools(там новый аспр который кусок кода в себе зажал), прога будет работать, тока где не нажмешь «Start» будет вылетать то «Invalid Pointer», то еще какой-то другой мат. Сел я разбираться и нашел вот такое интересное место:

seg000:006FFF03 push ebp

seg000:006FFF04 push offset loc_0_6FFF25

seg000:006FFF09 push dword ptr fs:[eax]

seg000:006FFF0C mov fs:[eax], esp

seg000:006FFF0F push offset loc_0_4079F8 — Это адрес jmp GetStartupInfoA

seg000:006FFF14 mov eax, ds:dword_0_713048

seg000:006FFF19 call eax ; sub_0_70BD88

……………

seg001:0070BD88 pop ebx

seg001:0070BD89 pop eax — Это адрес jmp GetStartupInfoA

seg001:0070BD8A mov eax, [eax 2] — сдвигаемся на 2 байта чтоб пропустить опкод jmp

seg001:0070BD8D mov eax, [eax] — читаем адрес операнда jmp (т.е. адрес в таблице импорта)

seg001:0070BD8F push dword ptr [eax] — сохраняем в стэк 4 байта

seg001:0070BD91 pop dword ptr [eax] — пишем эти байты туда откуда взяли

seg001:0070BD93 jmp ebx

И чо оно такое творит? Если аспротект есть то push dword ptr [eax] сохраняет в стэк первые 4 байта переходника к апи GetStartupInfoA. Дальше по команде pop dword ptr [eax] ничего страшного не произойдет, т.к. в область памяти где лежат переходники аспротекта можно писать. Но что произойдет если аспротекта нет? Команда push dword ptr [eax] сохранит в стэк первые 4 байта апи GetStartupInfoA. А потом при pop dword ptr [eax] попытается записать данные в kernel32.dll… ОС такое не прощает 🙂 Вот так то. Как бороться? Занопить push dword ptr [eax] и pop dword ptr [eax]. Это еще не все! Для того чтобы, мы немножко еще мозги понапрягали таких мест несколько и они динамически раскриптовываются по хитрющему алгоритму «-x x» 🙂 Вот к примеру «раскриптовка»:

seg000:00664245 mov eax, [ebp var_C]

seg000:00664248 sub byte ptr ds:unk_0_711BAF[eax], 2 (побайтно -2)

seg000:0066424F inc [ebp var_C]

seg000:00664252 cmp [ebp var_C], 0Eh

seg000:00664256 jnz short loc_0_664245

seg000:00664258 xor eax, eax

Ну это понятно:

seg000:0066425A push ebp

seg000:0066425B push offset loc_0_66427C

seg000:00664260 push dword ptr fs:[eax]

seg000:00664263 mov fs:[eax], esp

seg000:00664266 push offset loc_0_407A60

seg000:0066426B mov eax, offset unk_0_711BB0

seg000:00664270 call eax ; unk_0_711BB0 — тут опять проверяет импорт

Закриптовка:

seg000:006642A3 mov eax, [ebp var_C]

seg000:006642A6 add byte ptr ds:unk_0_711BAF[eax], 2 (побайтно 2)

seg000:006642AD inc [ebp var_C]

seg000:006642B0 cmp [ebp var_C], 0Eh

seg000:006642B4 jnz short loc_0_6642A3

Ну тут придется в закриптованном куске сделать не 90909090 а 92929292 🙂

В PowerStrip 3.29 имеется вот такое

seg000:0050D1A7 mov eax, offset loc_0_53F1D4

seg000:0050D1AC

seg000:0050D1AC loc_0_50D1AC: ; CODE XREF: seg000:0050D1B0j

seg000:0050D1AC dec byte ptr [eax]

seg000:0050D1AE inc eax

seg000:0050D1AF dec ebx

seg000:0050D1B0 jnz short loc_0_50D1AC

А тут — 91919191 🙂 Как только тут подправим — сразу и popup вылазит и «Полезные советы»…

Дыр-дыр-дыр, занавес и аплодисменты.

{/codecitation}

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