RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

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

Ковырял я когда-то 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 вылазит и "Полезные советы"...

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

При публикации статьи помогли:
Сайта про прокат авто Одесса, который будет интересен водителям этой региональной столицы
Все гостиницы калининграда в одном месте - обзор, цены, бронирование.
Rambler's Top100