Новая фишка для любителей Asprotect
Автор: 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 вылазит и "Полезные советы"...
Дыр-дыр-дыр, занавес и аплодисменты.
|