Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Новая фишка для любителей 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 вылазит и "Полезные советы"...

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay