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