566078958
|
Главная » Все для взлома! Все виды и программы.
|
|
|
|
Сегодня я немного расскажу основы крэкинга, разберём программы используемые для взлома, а также
взломаем тренировочную программу. Это моя первая статья поэтому прошу ногами не бить! Многие знающие
люди могут сказать, что я пишу что-то неправильно или не точно, просто я старался писать понятно для
новичков.
Итак, начнём с того, что давным-давно люди сделали процессор, который работал только с битами,
программы писались в машинных кодах, что-то типа: 0010010010 и т.д. Позже программисты придумали HEX-
коды, что-то промежуточное между тем, что понятно человек и процессору, то есть что-то близкое к
машинным кодам, но более понятное программисту. Позже были придуманы компиляторы. Это программы
которые читали человеческие слова и переводили их в биты(машинные кода). То есть с помощью
компиляторов из исходного кода получался исполняемый файл. Это были первые компиляторы ассемблера.
Позже начали появляться всякие: pascal, C, C++, Delphi и т.д. ... Читать дальше »
|
Скрины:
Дата: 17.01.2010
Добавил: xakep
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
Все нижесказанное, помеченное *, является моими советами в дизассемблировании в среде WinDasm.
Сколько я не лазил в этой проге, не нашел, где генерируется рег. ключ,
поэтому не отчаявшись (самое главное! никогда не бросать начатое!), я
решил не обойти саму защиту, а сделать так, чтобы прога сама
зарегистрировалась (хе-хе).
Ломать будем в WinDasm v8.93, т.к. я считаю маловато про WinDasm в этих статьях сказано, а ведь
такая вещица классная, многие с нее начинали. Многого знать не надо ну
кроме базисов, вроде основные в статье Dr.Golova описаны.
TOOLZ:
WinDasm 8.93, Hiew 6.11, Far (или NC), ну и самаOpera 3.61
Ну, вернемся к нашим бар.. Opera.
Заходим в браузер... Мда непорядок, первое, что бросается в глаза - это
"unregistered" вверху экрана, да и еще, если успели заметить, при
загрузке идет Registered to : unregistered. Вот и начнем отсюда.
Выходим из проги, заходим в Far( NC или что там у вас), в директории
Opera, копируем файл opera.exe в opera.xxx и opera.w32
*Я советую использовать именно эти расширения, т.к. они являются
наиболее удобными, где *.xxx - backup; *.w32 - этот файл мы будем
дизассемблировать; а в opera.exe будем с помощью HIEW вносить
изменения. Т.е. если что-нибудь запорем, то дорога в "copy opera.xxx
opera.exe" ;))
Так, выходим из Far по Alt+Tab, т.к. он нам еще пригодится. Заходим в
WinDasm и дизассемблируем файл opera.w32.......................
;)))))))))))))))
*Следующий шаг - это просмотр SDR (т.е. String Data Reference), в меню Refs - последний пункт.
Здесь то мы и должны найти наш "unregistered".
*Если прога объемная, как в этом случае с Оперой, то удобно будет скопировать все references кнопкой Copy All.
Ура нашли: String Resource ID=21428: " (unregistered)", чтобы попасть в это место достаточно дважды щелкнуть по строке.
*ОЧЕНЬ ВАЖНО! В проге может быть не одно это место, а несколько, так что щелкайте несколько раз, и смотрите на адреса.
Смотрим первое совпадение:
* Referenced by a (U)nconditional or (C)onditional Jump at Address: <- Первый переход
|:0045F8EF(C)
|
:0045F91F 381D58F55200 cmp byte ptr [0052F558], bl
:0045F925 7535 jne 0045F95C
:0045F927 BE80000000 mov esi, 00000080
:0045F92C 56 push esi
:0045F92D 57 push edi
* Possible Reference to String Resource ID=20092: "Opera 3.61"
|
:0045F92E 687C4E0000 push 00004E7C
:0045F933 8BCD mov ecx, ebp
:0045F935 E8850D0000 call 004606BF
:0045F93A 57 push edi
:0045F93B E8E0A60800 call 004EA020
:0045F940 59 pop ecx
:0045F941 2BF0 sub esi, eax
:0045F943 A30CF55200 mov dword ptr [0052F50C], eax
:0045F948 56 push esi
:0045F949 8D8058F55200 lea eax, dword ptr [eax+0052F558]
:0045F94F 50 push eax
* Possible Reference to String Resource ID=21428: " (unregistered)" <---- Это наш
"unregistered"
|
:0045F950 68B4530000 push 000053B4
:0045F955 8BCD mov ecx, ebp
:0045F957 E8630D0000 call 004606BF
************ ТОЖЕ ВАЖНО! ************
Q: Почему в WinDasm все пишут основные строчки внизу, а не вверху, это неудобно!
A: Т.к. Программа идет сверху вниз ;), а нам нужно посмотреть ЧТО вызвало этот "unregistered"
Q: До какого момента мы смотрим вверх, где останавливаться???
A: Обычно в WinDasm идем вверх до первого jne/je ; jl/jbl; test; cmp ... или до Reference Jump.
***************************************
На данном этапе необходимо остановиться и задуматься, а то ли это
место, ведь посмотрите: есть и "unregistered", и "Opera 3.61", и
переходов между ними нет, а может это всего лишь: "Opera 3.61
(unregistered)" в главном окне вверху... ИСТИННУ ГЛАГОЛИШЬ.
Смотрим другой адрес (надеюсь, еще не забыли то правило, насчет нескольких мест):
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B27, "Opera 3.60" <--- Странно,
3.60, что разработчики по этому поводу думают?
|
:00495F64 68272B0000 push 00002B27
:00495F69 FF7508 push [ebp+08]
:00495F6C FFD6 call esi
:00495F6E 8D8540FBFFFF lea eax, dword ptr [ebp+FFFFFB40]
:00495F74 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B25, " "
|
:00495F75 68252B0000 push 00002B25
:00495F7A FF7508 push [ebp+08]
:00495F7D FFD6 call esi
:00495F7F 8D856CFCFFFF lea eax, dword ptr [ebp+FFFFFC6C]
:00495F85 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B26, " "
|
:00495F86 68262B0000 push 00002B26
:00495F8B FF7508 push [ebp+08]
:00495F8E FFD6 call esi
:00495F90 393D64005300 cmp dword ptr [00530064], edi <---Сравнивание с edi
:00495F96 752A jne 00495FC2 <--- "ПЕРвЫй переХод"
:00495F98 68FF000000 push 000000FF
:00495F9D 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]
:00495FA3 50 push eax
* Possible Reference to String Resource ID=21428: " (unregistered)" <--- Вот ОН наш
REAL unreg.
|
:00495FA4 68B4530000 push 000053B4
:00495FA9 FF3570FA5200 push dword ptr [0052FA70]
:00495FAF FFD3 call ebx
:00495FB1 8D85C5FEFFFF lea eax, dword ptr [ebp+FFFFFEC5]
:00495FB7 50 push eax
МДАСССССС, спокуха, это все фигня на самом деле.
ТАК, как всегда, ловим первый попавшийся переход, вот и он:
:00495F90 393D64005300 cmp dword ptr [00530064], edi
:00495F96 752A jne 00495FC2 <--- "ПЕРвЫй переХод"
*Je/Jne - Unconditional(jump if equal)/Conditional(jump if not
equal); здесь важно понять эти действия: "Если [00530064] НЕРАВНО edi,
то перейти на ПРАВИЛЬНУЮ РЕГИСТРАЦИЮ". (Действительно запутывающе).
Смотрите, до него идет сравнивание значения в [00530064] с edi. Ну,
поняли? Всего лишь осталось сделать так, чтобы в этом значении И БЫЛО
ЭТО edi !!!
Давайте снова остановимся и задумаемся, каким образом сравнивается
значение из [00530064] с edi? Ведь для того, чтобы сравнить что-либо,
нужно поместить туда что-нибудь, А КАК ПОМЕСТИТЬ?
Чтобы найти, место, где помещается определенное значение в [00530064],
сделаем так: в WinDasm жмем поиск и печатаем, почти ничего не изменяя:
mov dword ptr [00530064]
Согласитесь, логично, если там cmp, то здесь mov (*ЧИТАТЬ СТАТЬЮ Dr.Golova ОБ ОСНОВАХ АССЕМБЛЕРА !)
И WinDasm найдет нам всего лишь одну (в случае с Оперой) ссылку, туда и пойдем:
:00495E1F E8C3630200 call 004BC1E7
:00495E24 3BC7 cmp eax, edi
:00495E26 A364005300 mov dword ptr [00530064], eax <--- То, что искали.
ЧТО отсюда можно извлечь? Самое главное: все происходит в
:00495E1F E8C3630200 call 004BC1E7
Идем в эту функцию:
:004BC1E7 8D8138010000 lea eax, dword ptr [ecx+00000138]
:004BC1ED 85C0 test eax, eax
:004BC1EF 741A je 004BC20B <--- 1 Переход.
:004BC1F1 803800 cmp byte ptr [eax], 00
:004BC1F4 7415 je 004BC20B <--- 2 Переход.
:004BC1F6 81C190030000 add ecx, 00000390
:004BC1FC 51 push ecx
:004BC1FD E8A647FDFF call 004909A8
:004BC202 85C0 test eax, eax
:004BC204 59 pop ecx
:004BC205 7404 je 004BC20B <--- 3 Переход.
:004BC207 6A01 push 00000001 <--- Еденицу на стек.
:004BC209 58 pop eax <--- Снимаем еденицу из стека в еах.
:004BC20A C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BC1EF(C), :004BC1F4(C), :004BC205(C)
|
:004BC20B 33C0 xor eax, eax
:004BC20D C3 ret
Видим чудеса: 3 перехода на обнуление и выход да еще видим сравнение
eax с 0 и снова выход, что же здесь думать-то, если после последнего
перехода есть установка этой самой единицы!!!
Нус, осталось всего-то с первого перехода прыгнуть на установку единицы!
Теперь убеждаемся, что в WinDasm строка установлена на 4BC1EF (горит
зеленым), потом на 4BC207 и смотрим внизу на смещение (Offset), это
BC1EF и BC207.
*Для использования в HIEW смещения (offsets) из WinDasm берем БЕЗ
последней h (например "BC1EFh" из WinDasm) для использования в HIEW
возьмем только "BC1EF".
Переходим в Far Manager по Alt-Tab (remember the very begining?), и
"hiew opera.exe", там переходим в F4 > Decode Mode, потом F5 >
Search BC1EF и наконец редактируем: жмем F3 (Edit), потом F2 (Asm) и
пишем: jmps BC207 (вместо je...), и наконец жмем F9 (Update), чтобы
сохранить изменения.
(* Прим. Dr.Golova: Можно сделать иначе, поскольку HIEW умеет преводить
виртуальные адреса из WinDasm в реальные файловые. Мы сразу наберем
адрес 4BC1EF из WinDasm в окошке "GoTo" HIEW'a (те же самые F4 >
DecodeMode > F5), только его надо дополнить точкой и нулями до вида
".004BC1EF". Попадем в то же самое место. Как проще - решать вам, но
так по крайней мере не надо смотреть offset. *)
THAT's All folks ;))))
Вот мой патч на ПАСКАЛЕ:
------------------------------cut--------------------------------
program opera161_crack;
Const A: Array[1..2] of Record
A : Longint;
B : Byte;
End = ( (A : $BC1EF; B : $EB),
(A : $BC1F0; B : $16) );
Var Ch : Char;
I : Byte;
F : File;
Begin
Writeln('Kondor''s patch', #10#13, 'Crack for Opera v1.61');
Assign(F, 'OPERA.EXE');
Reset(F, 1);
If IOResult <> 0 then
begin
Writeln('File not found!');
Halt(1);
end;
For I := 1 to 2 do
Begin
Seek(F, A[I].A);
Ch := Char(A[I].B);
BlockWrite(F, Ch, 1);
End;
Writeln(#10#13, 'File successfully patched!');
End.
-------------------------------cut---------------------------
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
|
Вам всем наверное очень хорошо известен
архиватор WinRar. Это версия архиватора RAR под ОС Windows 95/98. Сама
проверка регистрационного имени и кода очень запутанная, но если хорошо
присмотреться то можно (конечно не с первого раза) обнаружить очень слабое место
в защите программы. С помошью всеми нами любимого SoftICE 4.0 и
W32Dasm а также HIEW 6.11 можно очень быстро заставить прогу вам
поверить и зарегистрировать вас с любым именем и номером.
Ну что же, приступим к делу. Прежде всего любой взломщик тщательно изучаеть
взламываемый объект. Начнем с того (довольно однообразное действие), что
попытаемся ввести свои данные в поле (Enter your registration (AV) text) и любой
код от фонаря в поле (Enter your registration code). Например я ввел
JAM в поле имени и код 1234. Жмем OK и
что-же.... Довольно глупое сообщение о том что вы что-то неправильно сделали и
Registration Failed. Запускаем W32Dasm и смотрим импортируемые функции.
Ага ... из библиотеки USER32 наша прога импортирует функции
GetDlgItemTextA.
Это должно навести вас на мысль что прога откуда-то получает текст, а
возможно - имя регистрации и код. Ладно, активизируем SoftICE (Ctrl+D для тех
кто не знает) ставим точку останова на функции GetDlgItemTextA командой
bpx GetDlgItemTextA. Теперь запускаем WinRar и пробуем
зарегистрится снова ... . Жмем OK. Ура сработало - мы в начале функции. Значит с
помошью этой функции WinRar и получает имя и код. Жмем F12 чтобы
возвратиться в место откуда была вызвана функция.
Примерно это выглядит так
:
* Reference To: USER32.GetDlgItemTextA, Ord:0000h | :00413BF1 E8180D0100 Call 0042490E ; сначала происходит считывание рег. имени :00413BF6 8D459C lea eax, dword ptr [ebp-64] :00413BF9 50 push eax ; прячем адреса строк в стек :00413BFA 8D559C lea edx, dword ptr [ebp-64] :00413BFD 52 push edx * Reference To: USER32.CharToOemA, Ord:0000h | :00413BFE E8210C0100 Call 00424824 ; вызываем функцию которая что-то вытворяет ; с регистрационным именем (не суть важно, что) * Possible Reference to String Resource ID=00070: "Authenticity verification FAILED" | :00413C03 6A46 push 00000046 :00413C05 8D8D54FFFFFF lea ecx, dword ptr [ebp+FFFFFF54] :00413C0B 51 push ecx * Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:0066, "Authenticity verification" | * Possible Reference to String Resource ID=00102: "Unknown format" | :00413C0C 6A66 push 00000066 :00413C0E FF7508 push [ebp+08] * Reference To: USER32.GetDlgItemTextA, Ord:0000h | :00413C11 E8F80C0100 Call 0042490E ; Тут прога получает сам код (1234) :00413C16 80BD54FFFFFF00 cmp byte ptr [ebp+FFFFFF54], 00 ; проверка длины полученной строки :00413C1D 751A jne 00413C39 ; переход если длина возвращаемой ; не равна 0
Попробуем выполнить переход по этому адресу, немного перейдя вниз можно
наткнуться на интересный кусок кода. Внимательно присмотритесь к коду начиная
с адреса 00413C4A. Именно здесь и вызывается функция, в которую передаются двумя
параметрами имя и код. Вызывается эта функция по адресу 00413C55.
Дотрассировав SoftICE'ом до этого места можно убедится в том что ваше имя и рег.
код находятся в стеке, откуда потом и используются функцией.
Примерно эту функцию я описал так:
function
Check_Registration(Char* RegName, Char*
RegCode); stdcall;
Параметры функции передаютя в функцию в обратном порядке, согласно правилам
языка C/C++ (для тех кто этого еще не знает).
:00413C4A 8D8D54FFFFFF lea ecx, dword ptr [ebp+FFFFFF54] ; второй параметр (1234) :00413C50 51 push ecx ; адрес строки :00413C51 8D459C lea eax, dword ptr [ebp-64] ; первый параметр (JAM) :00413C54 50 push eax ; адрес строки :00413C55 E84B68FFFF call 0040A4A5 ; вызов функции :00413C5A 83C408 add esp, 00000008 ; коррекция стека
Идем
дальше ..... Интересно а что это за проверка eax на 0 сразу после вызова
функции. Уж не возвращает ли функция в регистре eax 0, если регистрация
неправильная и 1, если правильная.
:00413C5D 85C0 test eax, eax ; проверка eax :00413C5F E92F000000 jne 00413C93 ; если 1 то переход
Убедится
в том что здесь и выполняется проверка, помогают следующие строки. Предлагаю
всмотреться в них повнимательнее !!! Наверное невооруженным глазом видно что
если в eax возвращается 0 то перехода не будет и на экран будет выведено
сообщение о том что Registration Falied. Ну а если в eax 1, то мы
зарегистрированы.
:00413C68 0000 add byte ptr [eax], al :00413C6A 59 pop ecx :00413C6B 50 push eax * Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:006A, "" | * Possible Reference to String Resource ID=00106: "Registration failed" | :00413C6C 6A6A push 0000006A :00413C6E E8F5640000 call 0041A168 :00413C73 59 pop ecx :00413C74 50 push eax :00413C75 FF7508 push [ebp+08] * Reference To: USER32.MessageBoxA, Ord:0000h | :00413C78 E86D0C0100 Call 004248EA :00413C7D 33D2 xor edx, edx :00413C7F 89155C574200 mov dword ptr [0042575C], edx :00413C85 891538564200 mov dword ptr [00425638], edx :00413C8B 89154C564200 mov dword ptr [0042564C], edx :00413C91 EB56 jmp 00413CE9 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00413C5F(U) * Possible StringData Ref from Data Obj ->"WinRAR" | :00413C93 68DC6A4200 push 00426ADC :00413C98 FF35A0644200 push dword ptr [004264A0] * Reference To: USER32.SetWindowTextA, Ord:0000h | :00413C9E E8C30B0100 Call 00424866 ; здесь мы станем зарегистрированными * Possible Reference to String Resource ID=00048: "Normal" | :00413CA3 6A30 push 00000030 * Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:006C, "" | * Possible Reference to String Resource ID=00108: "Correct registration" | :00413CA5 6A6C push 0000006C :00413CA7 E8BC640000 call 0041A168 :00413CAC 59 pop ecx :00413CAD 50 push eax * Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:006B, "" | * Possible Reference to String Resource ID=00107: "Thank you for support" | :00413CAE 6A6B push 0000006B :00413CB0 E8B3640000 call 0041A168
Что может быть проще как
исправить команду jne 00413C93 на jmp 00413C93 и все в порядке.
Запускаем HIEW, открываем файл winrar95.exe и нажимаем F5 чтобы перейти
на нужный нам адрес. Набираем .00413C5F жмем Enter и видим
знакомый текст. Для тех кто не знает как править код поясняю. Жмем сначала F3,
потом F2 и вводим нужную нам команду. Жмем F9 чтобы записать изменения. Пробуем
зарегистрироваться еще раз.. Вау !!!! Получилось, работает !! Выглядит это так:
Казалось что нам еще нужно. Выходим из программы чтобы проверить исчезла ли
дурацкая строчка evaluation copy в заголовке окна. Не тут-то было.
Похоже разработчики программы не полные дураки.
При последующем запуске видим
следующее (внимание на заголовок окна):
Что же будем думать дальше. Логика подсказывает что где при запуске программа
делает еще одну проверку на правильность регистрации. А то ведь так можно просто
текст в ini - файле подправить и все. Кстати вот и кусок текста в файле
Rar.ini
[registration] regname=JAM regcode=1234
Снова запускаем W32Dasm и ищем где еще вызывается функция
находящаяся по адресу [0040A4A5] Ну как ...... Вызов происходит во всей
проге всего 2 раза в начале и при самой регистрации. Вот кусок кода который
исполняется при инициализации программы
:00408045 6880AD4200 push 0042AD80 ; наше 1234 :0040804A 6830AD4200 push 0042AD30 ; и соответственно JAM :0040804F E851240000 call 0040A4A5 ; вызов проверки :00408054 83C408 add esp, 00000008 ; коррекция стека
Для тех
кому интересно как же считывается имя и код может посмотреть дизассемблированный
листинг немного повыше до того места где вызывается функция
GetPrivateProfileStringA которая и считывает из файла
rar.ini имя и код.
Ладно вернемся к нашему листингу. Надо найти место где выполняется проверка
eax на 0 или на 1. Но что это, значение eax после вызова функции нагло
затирается на 1. Выглядит это так
:00408057 B801000000 mov eax, 00000001 ; здесь в eax записывается 1 :0040805C 5F pop edi ; дальше не интересно :0040805D 5E pop esi :0040805E 5B pop ebx
Уж не хотят ли разработчики чтобы прога
всегда оставалась зарегистренной. Оказывается нет. Не хотят. Видать как я уже
писал они не полные дураки. Проверок eax на 1 или 0 дальше не оказалось. Теперь
пришло время обратиться к тексту самой функции которая скрывается под адресом
[0040A4A5]. Тело самой функции крайне неинтересно, т.к. в нем выполняется
множество всевозможных проверок и модификации имени и кода, но вот кусок кода в
самом конце функции наводит на определенные размышления. Вот он:
:0040A77D C60300 mov byte ptr [ebx], 00 ; неинтересно
:0040A780 A15C574200 mov eax, dword ptr [0042575C] ; ВОТ ТУТ !!! * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0040A4FF(U), :0040A53C(U) | :0040A785 5F pop edi ; Стандартное завершение функции - :0040A786 5E pop esi ; восстановление всех регистров :0040A787 5B pop ... Читать дальше »
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
В этой статье мы попытаемся почувствовать себя настоящими
исследователями программ. Конечно, это будут только первые робкие шаги, но
именно они обычно являются определяющими для всей остальной работы в этом
направлении. Нашей целью будет регистрация всемирно известной программы WinZip
7.0 (beta). В статье рассматривается build 1243, для более новой программы
возможны некоторые отличия в адресах. Скопировать программу Вы можете с нашего
FTP-сервера.
Устанавливаем и запускаем WinZip. Сразу после старта появляется окно,
сообщающее о том, что программа не зарегистрирована. Если программу не
зарегистрировать это окно будет появляться при каждом новом запуске.
Это неудобно! В меню Help выбираем пункт About WinZip... В появившемся
окне нажимаем кнопку Register.
Открывается окно регистрации. Вводим в поле Имя имя, под которым хотим
зарегистрировать программу (я использовал Fox Mulder). В поле РН вводим
любую информацию (я обычно использую 200001, чтобы потом при
необходимости его легко было опознать) и нажимаем кнопку ОК. Появляется
окно, сообщающее, что введена неполная или неверная информация. Обращаю
Ваше вниманиена это окно. Это типичное окно MessageBox (окно
сообщения). Его отличительными чертами являются:
- неактивная кнопка закрытия окна наличие внутри окна иконки (вид иконки
зависит от типа сообщения) наличие одной или нескольких кнопок (их названия
и количество также зависит от типа сообщения)
В программе окно MessageBox может создаваться с помощью четырех функций:
MessageBox()
MessageBoxA()
MessageBoxIndirect()
MessageBoxIndirectA().
Функции, не оканчивающиеся символом A (MessageBox(),
MessageBoxIndirect()) используются преимущественно приложениями Win16
(Windows 3.x) и на них мы будем рассчитывать меньше всего. Остаются две
функции: MessageBoxA() и MessageBoxIndirectA(). Какая из них
используется программой, определяем опытным путем:
Закрываем окно сообщения Активизируем SoftICE
(Ctrl+D) Устанавливаем точки прерывания на вызов MessageBoxA()
MessageBoxIndirectA() (bpx MessageBoxA,bpx MessageBoxIndirectA) Возвращаемся
в Windows (F5)
Нажимаем кнопку ОК в окне регистрации, программа
прерывается при вызове функции и передает управление SoftICE. В окне команд
сообщается, что программа прервалась при вызове функции MessageBoxIndirectA() из
модуля USER32. И действительно в окне кода мы видим, что курсор стоит на первой
строке этой функции и, что имя текущего модуля USER32 (написано внизу окна
кода). Дальше мы тоже знаем, что делать:
Нажимаем F12 (команда p ret),
для продолжения программы до выполнения команды ret. Перед нами вновь появляется
знакомое окно сообщения, при нажатии в нем на кнопку ОК программа прерывается и
управление передается SoftICE. Мы видим, что теперь программа остановилась в
модуле WINZIP32:
0137:00426920 FF15C4AF4700 call
[USER32!MessageBoxIndirectA]
0137:00426926 EB14 jmp 0042693C <- в этой
строке находится курсор
Вот мы и нашли то место, где вызывается функция
MessageBoxIndirectA() и создается окно сообщения. Теперь можно удалить
установленные точки прерывания (команда bc *), т.к. они нам больше не
понадобятся. В этой статье мы больше ничего, связанного с функцией
MessageBoxIndirectA(), не узнаем. Использовали мы ее по двум причинам:
1.Чтобы Вы научились устанавливать точки прерывания на вызовы
API-функций, и находит место их вызова в программе. 2.Чтобы прервать
программу в модуле WINZIP32. Это необходимо для установки точек прерывания на
конкретные адреса в памяти. Как я уже говорил в статье о распределении памяти,
каждая программа работает в своем адресном пространстве. Причем, практически у
всех запущенных приложений есть разные участки кода с одинаковыми адресами.
Поэтому, для установки точки прерывания на некоторый адрес памяти кроме самого
этого адреса, необходимо еще правильно указать нужное адресное пространство (или
модуль, что в данном случае одно и тоже). Особенностью SoftICE является то, что
он устанавливает точку прерывания на адрес в том модуле, в котором прервалось
выполнение. Вот почему, для установки точки прерывания на адрес памяти (нам ее
еще только предстоит установить) пришлось воспользоваться точкой прерывания на
вызов функции MessageBoxIndirectA()
Здесь уместным был бы Ваш вопрос о
том, почему для установки этой точки прерывания не пришлось прибегать к
каким-либо хитростям? Все очень просто! Точка прерывания на вызов
MessageBoxIndirectA() устанавливается на первую команду кода этой функции в
модуле USER32. Этот модуль находится в области памяти, которая является общей
для всех запущенных приложений Windows (она расположена выше 2-го Гб), поэтому
здесь никаких трудностей не возникает.
Итак, продолжим:
Мы все еще находимся в SoftICE. Устанавливаем точку прерывания на выполнение
команды по адресу 00407CA5 (команда bpx 407CA5). Выходим в Windows (F5)
и вновь пытаемся зарегистрироваться. При этом программа прерывается при
выполнении команды по адресу 00407CA5, в окне команд SoftICE сообщается,
что программа остановилась на точке прерывания по адресу 0137:00407CA5.
Вводим команду db eax (показать в окне данных содержимое памяти в виде
байт, начиная с адреса содержащегося в регистре eax) и переписываем 8 символов
нашего регистрационного номера (у меня это 409A11AA).Убираем не нужную
уже точку прерывания (команда bc *) и выходим в Windows (F5). Наступает
решающий момент. Вводим в поле РН полученный регистрационный номер и нажимаем
кнопку ОК. Программа просит подтвердить регистрационную информацию, и после
нажатия ОК Вы уже являетесь владельцем личного WinZip'а.
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
|
30 января в свет появилась новая версия DrWeb - 4.16.
Недавно я слил его себе и установил на винт.
Запустил, и обнаружил, что программа является ознакомительной
версией и без регистрационного ключа имеет функциональные ограничения, в том
числе одни, на мой взгляд, из самых важных - проверка архивов, включение опции
"эвристический анализ" и лечение зараженных объектов, о чем в свою очередь и
предупреждает, выводя сообщение при начальной загрузке.
Вас не раздражает вывод подобных сообщений, каждый раз при
новой загрузке ? Меня безумно.
Поэтому я отправился на кухню, заварил себе кофе ( благородный
напиток ), запасся табаком ( время то уже было 2 ночи ) и решил подправить прогу
и включить все и вся.
Итак, если у вас все нужное под рукой, приступим.
А что нам надо :
SoftIce - любой версии
Hiew - тоже любой версии или любой
другой правщик файлов
WDasm or IDA Pro
Где
найти DrWeb 4.16 :
ftp://ftp.dials.ru/
Для начала попробуем убрать сообщение об ознакомительной
версии. ( Сразу скажу, что может и есть более короткий путь для изменения кода,
но я опишу тот, по которому прошел сам).
Для этого залезаем в отладчик ( Ctl+D ) и ставим брекпоинт на
сообщение -
bpx MessageBoxA bpx MessageBoxExA
Запускаем прогу и что мы видим? Айс вывалился на "
MessageBoxA". F12 - выходим из айса, ok - обратно в айс, в вызывающую
функцию. Стираем все брекпоинты - bc * и смотрим код.
:0044EE74 FF7778 push [edi+78]
:0044EE77 FF7508 push
[ebp+08]
:0044EE7A 50 push eax
* Reference To: USER32.MessageBoxA, Ord:0195h
:0044EE7B FF1534AA4700 Call dword ptr [0047AA34]
--------> вывод сообщения
:0044EE81 891E mov dword ptr [esi],
ebx
:0044EE83 837DFC00 cmp dword ptr [ebp-04], 00000000
:0044EE87 89450C
mov dword ptr [ebp+0C], eax
Ничего интересного, кроме каких-то проверок и
подготовки самого сообщения для вывода на экран.Нажимаем опять F12 и опять
попадаем в вызывающую процедуру.
:0044EEBC 8B10 mov edx, dword ptr
[eax]
:0044EEBE FF74240C push [esp+0C]
:0044EEC2 FF9294000000 call dword
ptr [edx+00000094]
------------> процедура, описанная
выше
:0044EEC8 C20C00 ret 000C
-------->
сюда возвращается
айс.
Теперь F10 и снова попадаем в вызывающую процедуру.
:00403ED9 6A30 push 00000030
:00403EDB 50 push
eax
:00403EDC E8C9AF0400 call 0044EEAA
:00403EE1 8D4C2418 lea ecx, dword
ptr [esp+18]
----------------> сюда мы
вернулись
:00403EE5 C684240402000007 mov byte ptr [esp+00000204],
07
Опять смотрим код чуть-чуть выше места, куда нас вернул айс. И по
адресу 00403E82 находим переход,
обходящий сообщение:
:00403E71 3BF3 cmp esi, ebx
:00403E73 750F jne
00403E84
:00403E75 A194524700 mov eax, dword ptr [00475294]
:00403E7A
8A8818020000 mov cl, byte ptr [eax+00000218]
:00403E80 84C9 test cl,
cl
:00403E82 746E je 00403EF2
------------------>
Обходим
сообщение
:00403E84 8D4C2418 lea ecx, dword ptr [esp+18]
:00403E88
E825610400 call 00449FB2
Но если быть более внимательным, то можно
увидеть, что на 15 байт выше есть переход, который может нам испортить все. Он
находится по адресу 00403E73.
Поэтому именно и на него мы ставим очередной брекпоинт.
Загружаем заново программу и видим, что отладчик вывалился на нашем брекпоинте.
Условие перехода - если регистры ESI и EBX не равны. Что мы имеем ? Флаг ЗЕРО
опущен, потому-что в EBX - 0 , а в ESI - 4. Этот переход все нам и портит.
Поэтому делаем условие не выполнимо. Есть 3 варианта :
1. меняем CMP ESI, EBX на CMP ESI, ESI или CMP EBX, EBX 2.
делаем переход на следующую строчку ( JNE 00403E84 меняем на JNE 00403E75 ) -
что я и сделал 3. забиваем переход командой NOP
Далее трассируем и
видим, что по адресу 00403E7A в CL копируется 0 и условие нужного нам
перехода положительное. Нажимаем F5 и ........ Сообщение исчезло. Первый этап
выполнен. Но чтобы быть точно уверенным, можно и здесь поставить безусловный
переход. Продолжаем ... Лезим в DrWeb, в настройки, и пробуем включить опцию
скажем " Эвристический анализ". Ну как вышло ? Не хочет он совсем включатся
..... :-(( Опять ставим брекпоинт на MessageBoxA.
bpx
MessageBoxA bpx MessageBoxExA
F5 - выходим из отладчика и снова пробуем включить эту опцию.
Выскакивает айс, --> F12, --> messagebox, --> OK, --> мы в айсе, в
модуле DrWeb32w.exe.
Все та же функция для сообщения (0044EE7B ), все тот же
выход на команду RET по адресу 0044EEC8 ( см. выше ). Еще раз F10 и мы
выходим в нужные нам просторы ...... :-)) Снова и снова прокручиваем чуть-чуть
вверх и смотрим код. Вот вся процедура с момента входа в неё
:0041A970 A194524700 mov eax, dword ptr [00475294]
:0041A975 56 push esi
:0041A976 8BF1 mov esi,
ecx
:0041A978 8A8820020000 mov cl, byte ptr
[eax+00000220]
:0041A97E 84C9 test cl, cl
-----------------------------> проверка условия перехода
:0041A980
7521 jne 0041A9A3
--------------------------->
нужный нам
переход
:0041A982 8B0D18524700 mov ecx, dword ptr
[00475218]
:0041A988 6A00 push 00000000
:0041A98A 6A30 push 00000030
:0041A98C
8B91B4060000 mov edx, dword ptr [ecx+000006B4]
:0041A992
52 push edx
:0041A993 E812450300 call
0044EEAA
-----------------> MessageBox о недоступной
опции
:0041A998 6A00 push 00000000
:0041A99A 8BCE mov ecx, esi
:0041A99C E8A0E60200
call 00449041
:0041A9A1 5E pop esi
:0041A9A2 C3 ret
Можно конечно было бы по адресу
0041A980 поставить безусловный переход, выйти из функции, посмотреть
результат, и изменить еще переход или переходы, что бы все включилось, но я
пошел по другому пути. Ведь без регистрационного ключа очень много опций
недоступно, поэтому каждая может иметь подобный участок проверки и вывода
сообщения. Менять каждую долго, хотя здесь кому как нравится ......Итак, я
сделал вот как ... По адресу 0041A978 в регистр CL
заносится число из стека с адресом [eax+00000220] .... Ставим брекпоинт на
строчку -
0041A976 8BF1 mov esi, ecx
и снова пробуем включить
опцию .... Выскакивает Айс, мы делаем шаг на следующую строчку ( F10 ) и смотрим
адрес, из которого происходит занос числа в CL. Это - 0070F298. Адрес
этот запомним или лучше запишем .... В дальнейшем наверняка пригодится, если
придётся ставить брекпоинт, на участок памяти, по этому адресу .... Теперь
попробуем узнать, где и в каком месте программа заносит сюда 0 и при каких
условиях....Для начала дизассемблируем файл drweb32w.exe и поищем, нет ли еще
где-то в файле строчки - byte ptr [eax+00000220] и не
заносится ли где 0 при не выполнении определенных условий.... Включаем поиск и
ищем .....Сразу, после первого же нажатия, программа показывает код :
*
Referenced by a (U)nconditional or (C)onditional Jump at
Address:
:00403B3A(C)
:00403CA3 3BF3 cmp esi, ebx
:00403CA5 7465 je
00403D0C
:00403CA7 8B1594524700 mov edx, dword ptr [00475294]
--------> в
EDX адрес
:00403CAD C6821902000000 mov byte ptr [edx+00000219], 00
------------->
по адресу из
EDX+00000219 занести 0
:00403CB4 A194524700 mov
eax, dword ptr [00475294]
---------> снова адрес
:00403CB9 C6801A02000000 mov byte ptr [eax+0000021A], 00
----------------> и снова занести 0
:00403CC0 8B0D94524700 mov ecx,
dword ptr [00475294]
-----------> и так далее ...
:00403CC6 C6811B02000000 mov byte ptr [ecx+0000021B], 00
:00403CCD 8B1594524700 mov edx, dword ptr [00475294]
:00403CD3 C6821C02000000 mov byte ptr [edx+0000021C], 00
:00403CDA A194524700 mov eax, dword ptr [00475294]
:00403CDF C6801D02000000 mov byte ptr [eax+0000021D], 00
:00403CE6 8B0D94524700 mov ecx, dword ptr [00475294]
:00403CEC C6811E02000000 mov byte ptr [ecx+0000021E], 00
:00403CF3 8B1594524700 mov edx, dword ptr [00475294]
:00403CF9 C6821F02000000 mov byte ptr [edx+0000021F], 00
:00403D00 A194524700 mov eax, dword ptr [00475294]
:00403D05 C6802002000000 mov byte ptr [eax+00000220], 00
-----------> а вот и заносится 0, для дальнейшей проверки на опцию "эвристический
анализ"
:00403D05 C6802002000000 mov byte ptr [eax+00000220], 00
:00403D0C 8B0D94524700 mov ecx, dword ptr [00475294]
:00403D12 8A8119020000 mov al, byte ptr [ecx+00000219]
:00403D18 84C0 test al, al
:00403D1A A198454700
mov eax, dword ptr [00474598]
Но нам надо просмотреть все места, поэтому продолжаем поиск ...
Еще одно место, где есть такая строчка - адрес -0041A978. Ну как знакомое число ? Конечно !!! Это
то место, где выполняется проверка, и в зависимости от результата становится
доступен или нет "эвристический анализ". Больше в файле подобных мест нет. Если
взять любой другой адрес, скажем 00403CEC, то узнаем, повторив все выше
перечисленное, что этот адрес отвечает за возможность "проверки архивов".
Итак, место, что все нам портит и не дает нормально настроить
DrWEB найдено.Теперь записываем адрес ( 00403CAC - на него мы поставим
брекпоинт ), и загружаем drweb32w.exe. Далее, как вам угодно, попадите в
отладчик и поставьте брекпоинт на 00403CAC.
Выпа... Читать дальше »
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
Сначала нужно выяснить с чем нам нужно бороться. Сразу при запуске в глаза
бросается надпись [Unregistered] в заголовке окна.
Смотрим Help->About.
Там написано, что это версия триальная на 30 дней. Тут же находиться кнопка Register Now.
Но для начала не будем торопиться ее нажимать, а лучше проверим правда
ли все это чем нас так напугали. Переустанавливаем дату.
Ага в Help->About сказано, что халява кончилась - надо регистриться.
Ну это мы переживем :) Но дальше - хуже. Время от времени при просмотре
картинок выскакивает противное окно с требованием регистриться :( Ну ладно
глянем чего у нас в Register Now. А там как обычно просят ввести имя и
регистрационный номер(далее просто РН). А вот РН мы и не знаем :( Вот теперь
уже можно загружать(если не загрузили раньше) Soft-Ice.
Pапускаемся. Вводим любые имя и код(я вводил I am Cr0cK и 12345678).Жмем
ОК - облом не угадали РН ;) Появился MessageBox с этим самым обломом. Ладно.
Попробуем ломать програму с конца - найдем откуда вызывается этот месагабокс
и где-то перед его вызовом должна быть проверка РН. Вызываем Soft-Ice(ctrl+D).
Ставим брекпоинт на функции с помощью которых может вызываться MessageBox.
Это MessageBoxA и MessageBoxIndirectA (есть еще аналогичные функции но
без A на конце - они для 16-ти разрядных приложений, но у нас в названии
даже сказано ACdSee_32_) Задаем брекпоинт по выплонению: bpx MessageBoxA,bpx
MessageBoxIndirectA Возвращаемся - F5. Снова жмем ОК. Теперь мы попали
в функцию MessageBoxA. Жмем F12. Вылазит месагабокс, а мы жмем ОК. Вот
мы уже в самом ACDSee. Смотрим чуть выше текущей команды - там ничего полезного
нет - просто подготовка к выводу месагабокса. Жмем F12. Теперь мы уже в
другом месте. Смотрим что есть интересного в верху... А там:
00406F6C push
offset a294378973
>00406F71 call sub_0_458A90
00406F76 add esp,
10h
>00406F79 test eax, eax
>00406F7B jz short
loc_0_406F9C
;Очень напоминает защиту:
;вызвали функцию, которая проверяет
РН
;проверили результат в EAX
;если в EAX нуль то выводиться мсгбокс с
обломом
;если в EAX не нуль то выводим какое-то другое диалоговое
окно
00406F7D push 0
00406F7F push offset loc_0_406980
00406F84 push
edi
00406F85 push 3FEh
00406F8A push 0FFFFFFFAh
00406F8C push
edi
00406F8D call ds:GetWindowLongA
00406F93 push eax
00406F94 call
ds:DialogBoxParamA
00406F9A jmp short loc_0_406FBD
00406F9C ;
-----------------------------------------
00406F9C loc_0_406F9C:
00406F9C
push 0FFFFFFFAh
00406F9E push edi
00406F9F call
ds:GetWindowLongA
00406FA5 mov edx, dword_0_4E01F0
00406FAB push
0
00406FAD push edx
00406FAE push 236h
00406FB3 push edi
00406FB4
push eax
00406FB5 call sub_0_44ACE0
;Мы вернулись сюда
>00406FBA add
esp, 14h
Неужели все так просто? Проверим. Ставик брекпоинт на адрес 00406F7B(это
можно сделать двойным кликом мыши по команде с этим адресом). Брекпоинт
на MessageBoxA и MessageBoxIndirectA можно уже убрать(команда bc). Жмем
F5. И снова пытаемся регистриться. После нажатия на ОК вываливаемся в софтайз.
В EAX нуль и соответственно ZF установлен. Сбрасываем его и вперед по F5.
Урааааа!!! :)) Ой. Облоооооом :((( Появилось окно где сказано, что
мы ввели РН для предыдущей версии, а это обновление и РН для него стоит $8.
Вроде все правильно сделали. Но почему не прокатывает? Единственный разумный
ответ - РН проверяется в нескольких местах программы и все проверки, кроме
последней(где мы ручками подправили), не прокатили. Вот она и думает, что РН от
старой версии. Тогда другой вопрос. Что делать? Ладно. Мы пойдем другим путем...
Будем ломать не с конца, а с начала. Удаляем все брекпоинты и ставим новый на
выполнение GetDlgItemTextA. С помощю этой функции программа считывает текст из
всяких окошек ввода. Ну давайте попробуем. F5, жмем ОК в окне регистрации. И
попадаем в GetDlgItemTextA. F12. И видим вот что:
00406DA0
loc_0_406DA0:
00406DA0 mov edi, [esp+2C8h]
>00406DA7 mov esi,
ds:GetDlgItemTextA
00406DAD lea eax, [esp+1Ch]
00406DB1 push
1Fh
00406DB3 push eax
00406DB4 push 6Bh
00406DB6 push
edi
>00406DB7 call esi
;Вызов GetDlgItemTextA
00406DB9 lea ecx,
[esp+7Ch]
00406DBD push 1F5h
00406DC2 push ecx
00406DC3 push
82h
00406DC8 push edi
>00406DC9 call esi
;Вызов
GetDlgItemTextA
;GetDlgItemTextA вызывается два раза, т.к. нучно прочитать
две строки:
;имя и РН.
00406DCB xor ebx, ebx
00406DCD mov
dword_0_4E0040, 0
00406DD7 mov al, [esp+1Ch]
00406DDB lea esi,
[esp+1Ch]
00406DDF test al, al
>00406DE1 jz loc_0_406F33
;не даст
ввести имя нулевой длины
00406DE7
00406DE7 loc_0_406DE7:
00406DE7 movsx
edx, byte ptr [esi]
00406DEA push edx
00406DEB call _isalpha
00406DF0
add esp, 4
00406DF3 test eax, eax
00406DF5 jz short
loc_0_406DF8
00406DF7 inc ebx
00406DF8
00406DF8
loc_0_406DF8:
00406DF8 mov al, [esi+1]
00406DFB inc esi
00406DFC test
al, al
00406DFE jnz short loc_0_406DE7
>00406E00 cmp bx, 5
;Наверное стоит обратить на это внимение.
;Здесь проверяется чтобы в имени было не менее пяти _букв_(поэтому, кстати,
я и ввел не "Cr0cK", а "I am Cr0cK"
;) И еще, если интересно: функция проверки РН отсеивает все цифры и прочие
левые символы и приводит имя к верхнему регистру. И "I am Cr0cK"
эт а @#$% превратила в "I AM CRCK"
;( Это все можно увидеть заглянув в саму функцию проверки РН
00406E04 jl loc_0_406F33
00406E0A lea eax, [esp+7Ch]
00406E0E push
0
00406E10 lea ecx, [esp+20h]
00406E14 push eax
00406E15 push
ecx
00406E16 push offset a314159265
>00406E1B call sub_0_458A90
;
Ага! Да это же та самая функция проверки РН
00406E20 add esp, 10h
00406E23
neg eax
00406E25 sbb eax, eax
00406E27 neg eax
00406E29 test eax,
eax
00406E2B mov dword_0_4E0040, eax
00406E30 jle
loc_0_406F33
Дальше код я приводить не буду - посмотрите сами, но хочу
обратить ваше внимание на то, что если РН прокатывает, то при помощи
RegSetValueExA будут созданы два ключа в реестре: RegName и RegCode. Куда
занесется введенное имя и РН. Значит мы попали куда нужно. И теперь со 100%
гарантией можем сказать, что по адресу 0458A90 находится функция проверки
РН.
Ну что теперь?
Для новичка достаточно одного взгляда на эту функцию, что б отказаться
от идей писать кейгенератор :) Поэтому не буду загружать вас этим, а просто
взломаем битхаком. Так смотрим где у нас вызывается эта функция. Для этого
удобнее юзать ИДУ. Становимся на sub_0_458A90 и жмем ENTER. Попадаем на
начало функции проверки РН. Ставим курсор на начало функции(если он уже
успел куда-нить убежать:) и делаем View->Cross references.
Получаем окно:
+-[_]------ xrefs to sub_0_458A90 ----3-[]-+
іType Address Text
і p .text:00406772 call sub_0_458A90 _
і p .text:004068A9 call
sub_0_458A90 _
і p .text:00406E1B call sub_0_458A90 _
і p .text:00406F71
call sub_0_458A90 _
і p .text:0040734A call sub_0_458A90
+1/5
_______________________________-+
Оно показывает, что эта функция вызывается
из 5 различных мест в программе. Значит легче не патчить каждую проверку после
вызова функции, а пропатчить саму функцию. Тем более что функция может
вызываться косвенно например как нибудь вроде этого:
mov ebx,
ds:sub_0_458A90
call ebx
А ИДА этого не засечет.
Конечно она может и не вызываться так :) Но лучше подстарховаться. Тем
более что не во всех защитах сделано также. Значит нужно сделать чтоб в
EAX возвращался не 0. Для этого юзаем HiEW. В начале функции проверки РН
меняем:
.00458A90: 8B4C2408 mov
ecx,[esp][00008]
.00458A94: 81EC84000000 sub esp,000000084 ;" Д"
например
на:
.00458A90: B801000000 mov eax,000000001 ;" "
.00458A95: C3
retn
Теперь запускаем ACDSee. Регистримся с любым именем и РН. И с гордостью
видим: registration complete! Теперь осталась только одна вещь. При следующем
запуске выскочит окно со всякой лапшой про РН к предыдущей версии, но мы
отмечаем чекбокс, говорящий про то, что можно не показывать больше это
окно, и жмем ОК. Все - теперь у вас личный зареганый AcdSee32 v2.4
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
В этот раз потребуется
внимание и усидчивость, а так же знание некотрых функций Win32 API. Заодно
придется использовать дизассемблер.
Вступление Наверное, всем
известен "легендарный" Евгений Касперский и его антивирусный пакет Antiviral
Toolkit Pro. Не буду рассматривать его антивирусные свойства - каждый может
оценить их сам. Это дело вкуса. В этой статье рассматриваются свойства защиты
этого самого AVP. В исследуемой демо-версии отключена возможность лечения
зараженных файлов, анализатор кода, проверка архивов и сжатых файлов. Также
отсутсвует возможность проверки писем и почтовых баз данных. Скопировать
программу можно с сайта Kaspersky Lab.
Инструменты 1.SoftICE
3.23 for Win95 2.Любой шестнадцатиричный редактор файлов 3.IDA Pro
версии выше 3.74
Часть 1. Антивирус своими руками Как я и
говорил, для того, чтобы эту программу заставить заработать следует изучить
функции Win32 API, связанные с отображением органов управления. Кроме того,
сперва всегда следует выяснить, действительно ли перед нами урезанная и
бесполезная демо-версия, или это полностью работоспособная программа с
отключенными функциями. В данном случае для этого удобно использовать продукт
The Customiser фирмы Wanga International.
Для проверки запустим AVP и
посмотрим для начала закладку Обьекты. Сразу видно, что программа не проверяет
архивы и упакованые исполняемые файлы. Выбрать эти пункты нельзя - они отключены
(disabled) . Запустим The Customiser (который, кстати тоже защищен - возможно
появится статья и о нем). Выберем Edit Windows ... а там пометим Enable и нажмем
кнопку ON. Теперь появившимся уродливым курсором щелкнем на затененном пункте
Упакованные Файлы. Неожиданно он перестанет быть затененным и станет обычным,
нормальным пунктом. То же проделайте со следующим пунктом (архивы). Теперь
отключите Customiser и выберите эти возврещенные к жизни опции. Запустите
антивирус, и убедитесь, что теперь он проверяет и архивы. Остановите проверку.
Посмотрите на закладку Обьекты. Требуемые опции опять отключены. Ничего
удивительного, с помощью Customiser'а мы лишь на время изменили их
состояние.
Теперь, убедившись в том, что программа имеет требуемую
функциональность продолжим исследование программы. Некоторые скажут, что мы
проверили не все. Например мы не проверяли закладку Действия. Особенно пункт
Лечить без запроса. Скажу сразу, лично я все это проверил. Попробуйте и Вы,
поработайте немного самостоятельно.
Когда сомнения Вас покинут и Вы
окончательно убедитесь, что программа в порядке, следует приниматься за более
серьезные дела. Например запустить IDA Pro и дизассемблировать файл avp32.exe.
Пока он дизассемблируется, откройте Win32 API Help и найдите функцию, отвечающую
за состояние органов управления. Для тех, кто не знает такой функции, скажу -
это EnableWindow. В файле помощи по API-функциям (Microsoft) эта функция описана
так:
BOOL EnableWindow( HWND hWnd, // указатель на окно (орган
управления) BOOL bEnable // флаг возможности ввода)
В зависимости
от значения bEnable компонент может быть в состоянии Включен/Отключен
(Enabled/Disabled). В состоянии Отключен орган управления игнорирует сообщения,
поступающие от мыши и клавиатуры. Нам требуется обратное. Если
дизассемблирование закончилось, поищите, откуда вызывается функция EnableWindow.
Таких мест в программе множество. Кстати, обратите внимание на типичные
последовательности вызовов - при работе над другими программами с аналогичной
защитой Вам это пригодится. Типичная последовательность такова:
1.Вызывается функция GetDlgItem [в качестве аргументов - указатель на
окно диалога и идентификатор органа управления]. Функция возвращает указатель на
этот орган управления. 2.Вызывается функция EnableWindow [в качестве
аргументов - указатель на орган управления и флаг bEnable (0 - Отключен, 1 -
Включен)]. Функция делает орган управления неактивным (т.к. bEnable = 0).
Теперь у вас есть вся информация, необходимая для взлома. Как именно это
сделать - Вы должны решать сами. Тем более, что взлом можно осуществить,
минимум, пятью разными способами. Перечислю некоторые из них:
1.Найти
функцию, в которой отключаются требуемые пункты меню, и сделать так, чтобы они
включились. Cводится к поиску EnableWindow и замене предшествующей ей команды
push 00 на push 01. Подсказка: так как при отключении требуется заносить в стек
0, в этой программе обнуляется регистр ebx и выполняется команда push ebx. Все,
что требуется - записать в ebx 1. Преимущества - быстрота. Недостатки -
недостаточно корректный взлом (об этом позже). 2.Исследовать алгоритм,
проверяющий ключевой файл avp.key, и попытаться на основе этого алгоритма
вычислить, какая информация в avp.key должна быть. Преимущества - в случае
успеха вы становитесь "зарегистрированным" пользователем этой, а возможно и
будущих версий программы без всяких побочных эффектов. Недостатки - медленно и
сложно.
Есть еще и другие варианты. Вы можете выбрать любой из
них.
После того, как Вы все это сделали, осталась небольшая проблемка -
при запуске появляется окно с напоминанием о том, что программу необходимо
зарегистрировать. Решение: создайте в директории, в которой установлен AVP, файл
avp.key с любым содержанием и все проблемы исчезнут.
Часть 2. Монитор,
и как с ним бороться Вторая важная часть системы AVP - это монитор. Он
проверяет все файлы, которые открываются во время вашей работы, и если
обнаруживается вирус, то имеется возможность предварительно его (вирус)
обезвредить и продолжить работу. Лично я монитором не пользовался и не собираюсь
- лучше один раз проверить, то что приносишь, чем постоянно сидеть под
наблюдением, результатом чего является снижение производительности. Но надо
довести начатое дело до конца. Получить рабочую версия AVP из нерабочей
демо-версии. Вообще-то, ничего нового здесь нет. Функциональность монитора
урезана точно так же, как и антивируса. Я сделал так. С помощью Borland Resource
Workshop открыл файл avpm.exe и посмотрел на ресурсы. В данном случае меня
интересовали окна диалогов. Например ресурс с номером 113, соответсвующий окну
Действия. Дважды щелкнув на нем, попадаем в окно редактировани диалога. Но
редактировать ничего не будем. Двойным щелчком на RadioButton с текстом
Disinifect Automatically откроем окно Button Style. В этом окне содержится
некоторая необходимая информация. А именно Control ID . Для упомянутого элемента
это значение равно 406h. Запомните это число - оно пригодится. Откроем IDA Pro и
запустим дизассемблирование файла AVPM.EXE(если вы сами этого еще не сделали).
Нажмем Alt+T для поиска текста и зададим 406h. После нескольких попыток мы
обнаружим такой участок кода:
loc_4023CE: ; CODE XREF:
.text:004023C0 ; .text:004023C7 xor ebx, ebx cmp dword_4122EC,
ebx jz short loc_40240E push ebx push 405h ; ID Number нашего
компонента push dword ptr [ebp+8] call esi push eax call
ds:EnableWindow ; Enable/disable mouse and keyboard input push ebx push
406h ; ID Number нашего компонента push dword ptr [ebp+8] call esi push
eax call ds:EnableWindow ; Enable/disable mouse and keyboard input push
ebx push 407h ; ID Number нашего компонента push dword ptr [ebp+8] call
esi push eax call ds:EnableWindow ; Enable/disable mouse and keyboard
input loc_40240E:
Надеюсь, всем ясно, что делает этот код. В общих
чертах - обнуляется регистр EBX, сравнивается с некоторой переменной. В
результате сравнение осуществляется переход на ту часть программы, где
блокируются соответсвующие визуальные элементы(сторого говоря, не осуществляется
переход на ту часть программы, котрая продолжает работу без блокировки).
Вариантов взлома - множество. Я вданном случае заменил переход jz short
loc_40240E на jmp short loc_40240E. Для этого следует поменять байт 074h(jz) на
0EBh(jmp).
Самостоятельно изучите листинг программы, найдите
соответсвующие инструкции. С помощью IDA внесите изменения там, где посчитаете
нужным. Запустите модифицированный файл. Посмотрите, работает ли то,что не
работало. Если вы все сделали правильно, то вы должны получить возможность
выбора лечения зараженных файлов. Остается проделать тот же трюк с закладкой
Обьекты и Настройки. Это вы вполне можете сделать сами. Так же, в качестве
упражения уберите собщение о том, что отсутсвует ключевой файл(наличие этого
собщения наводит на мысли - для антивируса достаточно создать файл AVP.KEY как
он сразу перестает выбрасывать это же сообщение, хотя и работать от этого не
начинает. Для монитора этот номер не проходит. Может монитор все-таки использует
информацию из ключевого файла - проверьте сами). Побочным эффектом данного
метода является то, что устанавливаемые опции не сохраняются, и в следующей
сессии их приходится устанавливать еще раз. Эта проблема тоже имеет решение. Но
мне хватило того, что сделал себе рабочую версию.
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
|
Введение
Цель данной статьи - ответы на вопросы, которые задают новички:
- Что такое SoftIce, и для чего он нужен?
- Я поставил SoftIce, что мне делать дальше?
- Где взять русскую документацию?
- Почему у меня ничего не работает?
Все эти вопросы возникают по одной простой причине: вся документация, которую
можно найти в Internet'e, написана на английском языке, автору известна
только одна статья на русском языке, и та, к сожалению, очень не полная.
Чтобы заполнить этот информационный вакуум, и было написано это эссе. Сколько
человек, столкнувшись с этими проблемами, "снесли" SoftIce и
забыли о нем как о страшном сне, подсчитать трудно, а жаль - ведь это лучший
отладчик на сегодняшний день.
Сразу хочется сделать несколько замечаний: первое, если вы после прочтения
этой статьи все-таки возьметесь за SoftIce, то вам придется заняться английским
языком, хотите вы этого или нет (почему - см.выше); второе, данная статья не
претендует на роль документации, она была составлена как обзор той информации,
которая была у автора на английском языке, а это фирменное руководство от фирмы
NuMega - автора
SoftIce-a, статьи и эссе, найденные в Интернете на различных сайтах, посвященных
SoftIce и Reverse Engineering. По этой причине в статье возможны ошибки и
неточности, автор будет благодарен за их исправление. В статье описывается
последняя версия SoftIce 3.24 для WIN95, но большая часть сказанного относится и
к предыдущим версиям. Предполагается, что читающие эту статью имеют минимальные
знания об устройстве процессора и компьютера и представляют, что такое
ассемблер.
Что такое SoftIce?
SoftIce состоит из отладчика уровня ядра (kernel mode debugger)
(собственно, это и есть отладчик) и утилиты загрузчик отладочной информации
(Symbol Loader). SoftIce – это универсальный отладчик, которым можно
отладить любой код, включая подпрограммы прерывания и драйверы ввода-вывода.
Утилита Symbol Loader загружает отладочную информацию для вашего модуля,
позволяет настроить SoftIce, и дает возможность записать историю комманд
(history buffer) в файл.
SoftIce совмещает в себе мощь аппаратного отладчика и удобство символьного,
он имеет следующие возможности:
- Символьная отладка 32-битных приложений, отладка драйверов устройств для WIN
NT, драйверов для WIN95, VxD, 16-битных программ для DOS и Windows.
- Отладка фактически любого кода, включая подпрограммы прерывания и внутренние
подпрограммы WIN 95 и WIN NT.
- Установка точек останова на операции чтения/записи в память, чтения/записи
портов ввода-вывода, прерываний.
- Установка точек останова на сообщения Windows.
- Установка точек останова, срабатывающих при определенных условиях (условных
точек останова), и действий, которые должны произойти при срабатывании точки
останова.
- И многое другое ...
Symbol Loader позволяет прочитать отладочную информацию из отлаживаемых
программ (EXE, DLL, VxD, 386, OCX) и загрузить ее в отладчик, запустить ваше
приложение и автоматически установить точку останова на точку входа в программу,
записать в файл протокола отладки.
Инсталляция
Аппаратные требования (от NuMega):
- Процессор:486 или Pentium.
- ОЗУ:необходимо 16 Мб (хотя в свое время работал и на 8), желательно 32 Мб.
- Мышка:обычная или PS (интересно, а кто в виндах без нее работает?).
- Видеокарта:начиная с версии 3.2, в SoftIce входит универсальный дисплейный
адаптер, который должен работать с любой видеокартой, также есть драйвера и для
большого числа видеокарт.
SoftIce поддерживает работу с:
- одной видеокартой (стандартный вариант)
- с двумя видеокартами (вторая видеокарта должна быть MDA (Monochrome Display
Adapter) или Hercules-совместимая)
- с двумя обычными видеокартами при условии, что они будут работать вместе
- удаленную отладку (со вторым компьютером, который соединяется с первым
посредством COM-порта (remote debugging));
На диске занимает 5,8 Мб.
При инсталляции, как обычно, введите директорию, куда вы хотите поставить
SoftIce, выберите компоненты, которые хотите поставить, после чего попадете в
окно выбора видеоадаптера. SoftIce сам определяет видеокарту, если она
соответствует вашей - нажмите кнопку Test, экран должен переключится в текстовый
режим и вы увидите фразы "SoftIce is totally awesome!” на всем экране, а в
середине отсчет цифр от 5 до 1. Если вы это увидели, то значит настройка
видеоадаптера прошла успешно - жмите кнопку Next, если же у вас сбилась
развертка, пропало изображение или повисла машина, то значит у SoftIce проблемы
с видеокартой, для их решения существуют два пути: первый, включить
универсальный видеоадаптер – должно помогать всегда (на моем Matrox Mistique
проходит только этот вариант), тогда SoftIce будет работать в окне: второй,
подобрать из числа представленных видеоадаптеров аналог вашему (у меня с S3 TRIO
64 вис (правда SoftIce был 3.01), а с DS 2000 работал на-ура); вам решать какой
вариант лучше.
После выбора адаптера выберите тип мыши, которой вы пользуетесь (хотя мышь
можно и не ставить, без нее тяжело работать в SoftIce). Далее разрешите
модифицировать свой autoexec.bat для того, чтобы SoftIce загружался при старте
компьютера. Подтвердите выбранную конфигурацию и следите за тем, как SoftIce
ставится на вашу машину. На предложение перезагрузить компьютер, согласитесь.
После перезагрузки нажмите клавиши Ctrl-D. Если вместо рабочего стола вы увидите
какие-то непонятные буквы и цифры, то считайте, что установку SoftIce на машину
вы закончили, и наступает этап настройки. Если же ничего не случилось, или
машина повисла при загрузке, то проверьте все ли вы правильно сделали. Если
SoftIce не загрузился, проверьте, прописана ли в autoexec.bat строка запуска,
она всегда последняя и выглядит приблизительно так:
C:WINDEBUGSICE324WINICE.EXE, если нет - пропишите ее с вашим путем.
Если машина повисла, то причина, скорее всего в неверной конфигурации
видеоадаптера. Попробуете изменить ее.
Кстати, все настройки, которые вы проводили при инсталляции можно изменить:
Пуск – Программы – NuMega SoftIce.
Настройка:
Откройте на редактирование файл winice.dat, который находится в той же
директории что и SoftIce (в случае NT - в каталоге
%SystemPath%system32drivers), и уберите точку с запятой со следующих
строк:
; ***** Examples of export symbols that can be included for Windows 95 ***** ;Change the path to the appropriate drive and directory EXP=c:windowssystemkernel32.dll - убрать; EXP=c:windowssystemuser32.dll - убрать; EXP=c:windowssystemgdi32.dll - убрать;
Проверьте путь к файлам kernel32,user32,gdi32, он должен соответствовать
вашему (Актуально в случае, если windows ставилась в каталог отличный от
C:WINDOWS).
Эта операция нужна для того, чтобы при отладке программы при вызове системных
функций вы увидели имя вызываемой функции, а не какой-то call [xxxxxxxx].
Пример:
Call [USER32!GetWindow], вместо CALL [BFC01480].
На мой взгляд первое выглядит значительно информативней.
Исправьте строку INIT в соответствии с одним из примеров:
INIT="WR;WD;WL;X;" – если вы используете
видеодрайвер для "родной" видеокарты (полноэкранный режим).
INIT="SET FONT 3;SET ORIGIN -10 25;WR;WD 4;WL;WC
12;X;" – если вы используете универсальный видеодрайвер (оконный
режим).
INIT="SET FONT 1; SET ORIGIN 30 30;LINES 60;WIDTH
90;WR;WD 4;WL;WC 12;X;" – вариант, работающий на моей машине и выводящий
на экран максимум информации (оконный режим), возможно для вашей машины
потребуется изменить значение некоторых параметров.
Если вы хотите передвинуть окно с SoftIce, то используйте клавиши
Ctrl-Alt-(одна из клавиш управления курсором).
Более подробно команды и переменные SoftIce будут рассмотрены ниже, тогда вы
сможете настроить SoftIce на свой вкус.
Первые шаги
Если вы все еще читаете этот опус, то для вас настал долгожданный момент
истины :-), пора посмотреть как это все работает в деле. В поставку SoftIce
входит пример GdiDemo, его и будем отлаживать (придерживаясь указаний фирмы
NuMega).
Пример без проблем собрался в VC4 (не забудьте включить отладочную
информацию), в BC 5.02 пример тоже собрался, но отладочную информацию Symbol
Loader не увидел, хотя в TD она грузится. Тот, кому лень собирать проект самому,
может скачать его отсюда: Gdidemo.zip (или отсюда),
архив занимает 0.1 Мб.
1. Загрузка отлаживаемой программы.
Запускаем Symbol Loader, выбираем опцию Open module в меню File, идем туда,
где у вас лежит Gdidemo.exe, и открываем его, далее в меню Module нажимаем на
опцию Load. SL оттранслирует отладочную информацию в .NMS файл, загрузит
исходные файлы, запустит отлаживаемую программу (в данном случае Gdidemo) и
всплывет в SoftIce, где вы увидите исходный текст программы.
Подсвеченная строка с номером 35 – это точка входа (entry point) в вашу
программу. Если SL вывел сообщение типа "An error occured during symbol
translation/load", значит в отлаживаемом файле отсутствует отладочная
информация, жмите OK и наслаждайтесь [диз]ассемблером.
2. Управление SoftIce'ом.
Если Вы все правильно сделали, то вы должны увидеть SoftIce разбитый на
несколько окон. Верхнее окно – Register Window (окно регистров) – показывает
состояние рабочих регистров процессора. ... Читать дальше »
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
Хакерами не рождаются!
Ну что, приятель, задвинул на слабые попытки хакнуть банкомат
соседского сбербанка? А зря! Ты что, думал, так всё сразу получится,
подойдешь к нему с молотком и зубилом, и он тебе сразу все бабки
выложит на блюдечке с голубой каемочкой? Ни фига! Хаку надо учиться,
это искусство, это как на скейтборде кататься: вроде на доске, в
принципе, любой стоять умеет, а вот с крыши прыгнуть на четыре колеса и
шею не сломать - это децил сложнее. Поэтому готовься - если ты ещё не
крутой хацкер, но очень хочешь им быть, мне есть что тебе рассказать.
Но начну-то я, естественно, с азов - не со взлома банкоматов, а, к
примеру, с обзора несложных, но настоящих софтверных инструментов,
которыми пользуются хакеры и кракеры, чтобы юзать просроченные
`шаровары` (shareware) или под шумок утянутую из приватных каталогов
известной фирмы утилитку. Главное, начать, как любил говаривать Билли
Гейтс в начале своей карьеры.
Во-первых, любому хакеру или тому, кто хочет им стать, надобно знать
ассемблер. Со знанием одного бейсика-васика и второго трубопоскакаля
далеко не уедешь, ведь рассматривать содержимое программ, исследовать
их приходится преимущественно в совершенно `сыром` виде - машинных
кодах и ассемблере. Есть у меня один знакомый, так тот вообще может
декодировать команды из набора байтов в файле прямо в уме. Тут главное
- немного терпения. Опыт придет со временем, и все будет на все сто. А
то и на двести.
Вспомогательные утилиты
Итак, инструменты. Конечно, в первую очередь это программы, позволяющие
определить, что именно перед тобой - картинка с длинными ногами и
большими сиськами или запакованный ехе-файл. Некоторые детекторы
позволяют определить тип файла, если он был запакован (отдельную статью
о паковке exe-файлов смотри в следующих номерах журнала). И даже -
попытаться снять защиту. Рекомендую ExeInfo by Adam Lojewski - весьма
полезная вещь для анализа исполняемых файлов. Для удобства ее интерфейс
пропатчили (спасибо STI) на предмет русских названий меню и надписей -
от этого она только увеличила свою привлекательность для новичков и
тех, кто ею пользовался до этого. Отвлекусь на пару слов, отхлебну
пивка и скажу про Compare2Unlimited by Professor Nimnull. После того
как дело сделано и в программу внесены изменения, неплохо бывает
получить список измененных байтов. Выписывать вручную - слишком
утомительно, и наверное, поэтому существует большое количество программ
для автоматизации этой процедуры. Но C2U - одна из лучших. А для
создания *.xck файлов хочется отметить XCKMaker 2.0 by Spider.
Hex-редакторы
Одним из основных инструментов кул хацкера (сразу после пива) является
hex-редактор. Обычно, такая прога совмещает в себе возможности
просмотра-редактирования файлов в шестнадцатиричном/текстовом (ASCII)
формате и некоторые дополнительные фичи. Некоторые особо навороченные
позволяют декодировать байты файла в инструкции ассемблера и даже
писать на ассемблере и менять инструкции, что называется, не отходя от
кассы. Здесь можно отметить, пожалуй, только две программы, сохраняющие
популярность в течение уже ооочень большого периода времени. Программы
хорошие и, что немаловажно в совдепии, бесплатные. Хотя, как говорится,
для хакера из Багдада нет преграды... Но что-то же должно быть
бесплатным! `Не все нужно ломать, надо же на чем-то и сидеть`, - как
сказал один мой знакомый. Одна из программ называется Hacker`s View
(HIEW) by SEИ.
Несмотря на кажущуюся простоту HIEW, я уже не мыслю работы на своём
замечательном пивзаводе без неё. Кроме того что она сама управляет
пивоваренными котлами и подвальными холодильниками, она имеет
полнофункциональную поддержку pe/ne и кучи других форматов файлов и
такие очень удобные фичи, как поиск инструкции по маске (например, хочу
я найти присвоения регистру AX, тогда указываю: mov ax,? - и все - дело
в шляпе. Будут найдены и mov ax,1, и mov ax,dx и т.д.). Все это
позволяет мне сказать, что это лучший редактор. Как его (да и остальной
софт, о котором я рассказываю) использовать, я буду говорить
непосредственно перед тем, как буду этот софт юзать. Второй
HEX-редактор - QView by ABC Product. Внешне - смотрится гораздо лучше,
чем HIEW. Но вот с содержанием до HIEW ему далеко, хотя новые версии
наверняка восполнят этот пробел. Хотя, вообще-то, редактор не
обязательно должен быть красивым, как унитаз - скорее, простым, и
практичным, как туалетная бумага.
Отладчики
Третий тип инструментов взлома - нет, не фомки и не лом. Отладчики.
Наверняка все, кто хоть как-то знаком с хаком (хотя бы и понаслышке),
знают об их существовании и о том, как сильно они помогают кракерам в
их тяжелой работе. Они есть под все платформы и операционные системы.
Изначально они были призваны облегчить жизнь обычным
кодерам-программистам. Но потом стали появляться кодеры, которые
использовали отладчики не только на своих программах, но и на
программах коллег по работе/учебе. Ведь всегда интересно, что же там
эти ламеры наваяли? А некоторые считают, что гораздо круче поковыряться
в уже откомпиленном ехе-шнике и сделать такое у себя, подкрутив там и
подправив здесь, чем корпеть над этим самому. Хотя я с ними не
согласен. Ладно - вернемся к нашим баранам, то есть отладчикам. Самым
известным `фирменным` отладчиком был и остается Soft-Ice by NuMega
Corp. Его реализации есть как для DOS, так и для Windows 9x/NT. При
этом он дружит практически со всеми extender`ами вроде EMM386 и QEMM.
Установить его, научиться пользоваться им и всеми его крутыми фичами -
немалый шаг к успеху в нашем скромном предприятии, как сказал бы AtH.
Очень мощное средство. Собственно говоря, именно его я использую для
взлома всех программ для Windows и почти всех для DOS. Однако кроме
него есть еще довольно много очень приятных в использовании
трасеров-дебагеров, как их называют некоторые кракеры. Например, очень
даже неплох DeGlucker. Сделан он ручками Gorokhov и... после того, как
они его бросили, им занялся CrazyMax. Правда, у него есть некоторые
минусы (например, необходимо загружать операционку без extender`ов,
потому что DG работает только в V86 режиме и ни в каком другом), да и
свежую версию, свободную от глюков, мы не дождемся - авторы его
бросили. Правда, перед окончательным `хэппи-эндом` проекта CrazyMax
выставил на всеобщее обозрение его сорцы (исходники, стало быть). И
есть надежда, что найдутся пиплы с большим количеством свободного
времени, ума и пивы - довести это дело до ума. Говоря о дебагерах в
приложении к хаку, я почти ничего не могу сказать о таких вещах, как
Turbo Debugger фирмы Borland и CodeView от `Мелкомягких товарищей
партии`. Эти отладчики помогут отладить базу данных для родного
предприятия в случае, если имеются исходники к ней, но никак не помогут
понять устройство какой-нибудь библиотеки хитрой программы с клевым
предложением `REGISTER!` в меню. Хотя я, например, использую Turbo
Debugger, чтобы отлаживать вирии. Еще не могу обойти вниманием такой
отладчик, как AXE-Hack. В отличие от DG (обладая более расширенными
свойствами и сервис-фичами), он позволяет работать прямо в окне DOS под
Windows и эмулирует (то есть дает программе подумать, что он что-то
делает, а на самом деле - филонит по страшному) часть команд
процессора, что иногда становится серьезным подспорьем в борьбе с
какой-нибудь супер-пупер заSHITой. Вообще, не фирменных дебагеров
довольно много. Но рассказывать обо всех не имеет смысла. Для хака
вполне хватит и тех, о которых я уже рассказал.
Дизассемблеры
В некоторых случаях одними отладчиками не обойтись. И тогда на арену
выходят дизассемблеры. Но и здесь есть свои подводные камни. Такие
дизассемблеры, как Sourcer, например, просто декодируют команды и
выискивают ссылки на уже определенные участки кода. Немного
изобретательности - и Sourcer выдаст на-гора километры ненужных
file.lst, содержащих полностью перечисленные байты файла, но ни строчки
по существу. И все - больше он практически ни на что не способен. Зато
с его помощью можно получить вполне приятный дамп BIOS. А ещё
компактом, на котором этот дизазм записан, можно в кого-нибудь кинуть.
Иными словами, ему применение почти всегда найдется.
Другое дело (в хорошем смысле этого слова) IDA - Interactive
Disassembler by Ilfak Guilfanov. Автор этого чудесного дизассемблера
сделал упор на работу, прежде всего на взаимодействие с пользователем
(или, по-нашему, хакером). IDA не выдает текстовый файлик мегабайт этак
на 20, в отличие от Sourcer`а.
Нет - IDA есть приятное междумордие (interface) для юзверя и позволяет
просматривать и помечать просмотренные участки кода именами/кличками,
чтобы их потом можно было легко найти. Плюс возможность писать
комментарии везде, где только это радует глаз! И возможность писать
свои процедуры анализа на встроенном макроязыке! Такой подход позволяет
исследователю восполнить все пробелы `тупой железячки`. И это далеко не
все возможности. Дело в том, что IDA поставляется вместе с набором
специальных плагинов - для автоматического распознавания. Например,
есть программа, написанная на Borland C++ 5.0. Если IDA определит (а
она определит, то есть не если - когда), что эта прога скомпилена
именно на BC, он подгрузит соответствующий плагин и сможет распознать и
обозначать стандартные функции (например, exit и biosdisk на экране
будут не просто асмовым листингом, а именно exit и biosdisk), что
уменьшает время, необходимое для поиска `лишнего` кода. В общем, IDA
намного опередила всех своих коллег по жанру. Очень рекомендую.
INT-Мониторы
INT-Монитор - программа для отслеживания и записи всех (или только
указанных) прерываний, вызываемых подопытной программой. Для DOS это -
INTController и INTIndicator by Maxim Chirkov. Это небольшие резиденты,
которые висят на нужных прерываниях и следят за частотой их вызова. А
для win32 существует прекрасная вещь - APISPY32 by Yariv Kaplan.
Правда, чтобы `шпиён` ловил вызовы какой-нибудь апишной функции, ему
необходимо в специальном файле прописать имя этой функции и тип е... Читать дальше »
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
Внимание!!!
Эта статья написана ИСКЛЮЧИТЕЛЬНО в помощь программистам и по сути своей представляет экспертную оценку защиты.
Заметьте - бесплатную оценку :)
Пациент
{KiXscripts Editor v1.х}, (2.2мб)
Инструменты
* Numega SmartCheck любой версии
* DAMN Hash Calculator v1.5.0
* Hiew или любой дизассемблер
Запускаем программу вместе со SmartCheck. Пишем чего-нибудь в диалоге
регистрации. Я вводил "Corbio" и "1234567". Естественно получаем
сообщение, что наш серийник неверен.
-Click
| OnError
| Len returns LONG:7 // Это размер моего серийника
| MsgBox returns Integer:1 // "Registration is invalid!"
Интересно, а зачем нужен размер серийника? Смотрим в правом окошке
SmartCheck offset для строки - Len returns LONG. У меня 11С608, для
других версий этой программы будет другой offset. Смотрим в Hiew по
адресу 11С607.
call _куда-то
xor ecx,ecx
cmp eax,20h
....Ну и так далее.
Логично предположить, что раз длина серийника сравнивается с 32, то он
должен быть именно 32 символа. Проверяем это и видим что я, как всегда,
был прав :). Посмотрим на получившийся листинг. Теперь, когда размер
правилен, мы вышли на саму проверку валидности. Интересный кусок:
Rtrim$ "sHa50WFaXaND6LaMdr1n65Te3l"
String$
CryptCreateHash returns BOOL:1
Len retorns LONG:32 "CorbiosHa50WFaXaND6LaMdr1n65Te3l"
CryptHashData returns BOOL:1
Space$
CryptGetHashParam returns BOOL:1
Строка "sHa50WFaXaND6LaMdr1n65Te3l" статична, ее можно найти в
екзешнике. Похоже на то, что эта строка добавляется к имени юзера и от
результата считается какой-то хеш. Так как строка начинается с "sHa",
то я и подумал, что это алгоритм SHA.
Но посмотрим на листинг дальше. 128 битный хеш "плавно превращается" в строку. Вот она:
RTrim$ "8165591BD4EFB8B67C94925210D388AE"
CryptDestroyHash BOOL:1
Strings$
Strings$
Strings$
MsgBox returns Integer:1 // "Registration is invalid!"
Вот. А так как вводить надо было 32х символьный серийник и полученная
строка тоже 32 символа, то скорее всего, это и есть правильный
серийник. Проверяем. Так и есть.
Почти все понятно. Остался единственный вопрос - а какой все таки это
алгоритм? Тут нам поможет тулзень от Ivanopulo - DAMN Hash Calculator.
Вводим "CorbiosHa50WFaXaND6LaMdr1n65Te3l". Оказывается, это никакой не SHA а MD5.
P.S. - Конечно далеко не все программы защищенные MD5 так бесполезно
его используют. Но подавляющее большинство. Стойкость криптоалгоритмов
обесценивается неумением их применять.
Линки
Весь софт для RE - {http://www.protools.cjb.net}
Applied Cryptography - {http://www.cacr.math.uwaterloo.ca/hac/}
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
o------// Автор: Crack
Сегодня я немного расскажу основы крэкинга, разберём программы используемые для взлома, а также
взломаем тренировочную программу. Это моя первая статья поэтому прошу ногами не бить! Многие знающие
люди могут сказать, что я пишу что-то неправильно или не точно, просто я старался писать понятно для
новичков.
Итак, начнём с того, что давным-давно люди сделали процессор, который работал только с битами,
программы писались в машинных кодах, что-то типа: 0010010010 и т.д. Позже программисты придумали HEX-
коды, что-то промежуточное между тем, что понятно человек и процессору, то есть что-то близкое к
машинным кодам, но более понятное программисту. Позже были придуманы компиляторы. Это программы
которые читали человеческие слова и переводили их в биты(машинные кода). То есть с помощью
компиляторов из исходного кода получался исполняемый файл. Это были первые компиляторы ассемблера.
Позже начали появляться всякие: pascal, C, C++, Delphi и т.д.
Любую программу можно представить в виде ассемблерного кода, этим занимаются программы –
дизассемблеры, про которые мы поговорим в следующей статье. А пока я хотел - бы рассказать основы
ассемблера (основные команды и т.д.), поэтому вы должны хоть чуть-чуть понимать в программирование
иначе материал будет очень трудный для восприятия.
Регистры:
Регистры это места в оперативной памяти, где могут храниться какие-либо данные, можно сказать что
регистры – это некие переменные. Регистры, которые важны для нас это: EAX, EBX, ECX, EDX. Буква "E”
вначале имени регистра означает, что он является 32-разрядным.
Push и Pop:
Команда Push используется для помещения адреса в стэк.
Команда Pop обратная команде Push.
Стэк можно представить себе как некоторую стопку листов, где верхний лист берётся первым. Вообще он
является участками памяти, начало которого на потолке и имеет смещение 0xFFFFFFFF, и всё что мы будем
добавлять будет добавляться снизу:
0xFFFFFFFF Начало стэка.
0xFFFFFFFC Занесли некоторые данные.
0xFFFFFFF8 Занесли некоторые данные.
0xFFFFFFF4 Занесли некоторые данные.
0xFFFFFFF0 Занесли некоторые данные.
… и т.д.
Стэк растёт к меньшему адресу.
Рассмотрим пример:
PUSH EAX - мы положили в стэк верхним значение регистра EAX
POP EAX - мы вытащили со стэка последние положенные данные.
Call:
Команда Call выполняет функцию по нужному адресу.
Пример:
Call: 10284354, будет выполнена функция по адресу 10284354.
RET:
Команда RET используется для возврата из функции.
Например, нам нужно выполнить какую – либо функцию, а потом вернутся на место где она вызывалась и
продолжить выполнение программы.
Mov:
Копирует байт или значение слова из источника в конечную точку.
Пример:
Mov EAX, 00000002 – копирует в регистр EAX, значение: 2
Mov EAX, EBX – копирует в регистр EAX значение регистра EBX.
CMP:
ОЧЕНЬ важная команда для взломщиков, используется в программе для сравнения чего – либо (например,
серийного номера :) ) После сравнения устанавливается флажок (0 или 1). Флажки очень похожи на
PASCAL’евские переменные типа: BOOLEAN, которые принимают значения TRUE и FALSE.
Пример: CMP EAX, 123 – сравнение значение регистра EAX со значением 123, и если они равны флажок
устанавливается в значение: 1(или TRUE, как кому нравится).
JMP:
Команда эквивалентна Pascal’евскому GOTO, переход в заданный адрес.
Пример:
JMP 30385678, переход по адресу: 30385678.
JMP – безусловный переход.
Имеются некоторые разновидности этой программы:
JZ - Переход, если флажок Z установлен.
JNZ - Переход, если флажок Z не установлен.
Так же существуют другие команды перехода: JNE, JE, JG и т.д.
Рассмотрим пример:
CMP EAX, 123456 - сравнить реальный номер, содержащийся в регистре EAX и нами введенный.
JNE EXIT - если они Не Равны, тогда выходим.
NOP:
Команда NOP не выполняет никаких действий.
Также существует множество других команд, но они для нас пока не являются важными. Если нам
понадобится узнать, что выполняет какая – либо другая команда, я расскажу про неё позже.
Теперь пора нам заняться обзором программ для самого взлома.
Дизассемблеры
Дизассемблеры – это программы, с помощью которых любую программу можно представить в виде
ассемблерного кода. Очень популярным дизассемблером считается IDA, хотя я предпочитаю Win32Dasm,
поэтому мы будем пользоваться им. Установка не должна вызвать никаких проблем. Работу в нём мы
рассмотрим по ходу взлома нужных программ.
Отладчики
Отладчики они и в Африке отладчики. Используются для поисков глюков в программах (ведь защита в
программе – это самый большой глюк). Самый популярный отладчик – это SoftIce. Рассмотрим подробно
установку SoftIce 4.0 под Windows 98. Запускайте файл Setup.exe, вводите серийный номер, в конце
установки на вопрос про перезагрузку ответьте – «нет, перезагрузится позже».
Зайдите в каталог, куда вы установили SoftIce, и откройте файл – WinIce.dat блокнотом. Найдите в нем
строку PHYSMB=32 - это значит, что отладчик настроен на работу в системе с 32 Мб оперативной памяти,
измените значение 32 на нужное значение. После этого надо подключить экспорт символьной информации из
наиболее часто используемых системных библиотек. Для этого найдите следующие строки:
; ***** Examples of export symbols that can be included *****
; Change the path to the appropriate drive and directory
;EXP=c:windowssystemvga.drv
;EXP=c:windowssystemvga.3gr
;EXP=c:windowssystemsound.drv
;EXP=c:windowssystemmouse.drv
...
; ***** Examples of export symbols that can be included for Windows 95 *****
; Change the path to the appropriate drive and directory
;EXP=c:windowssystemkernel32.dll
;EXP=c:windowssystemuser32.dll
;EXP=c:windowssystemgdi32.dll
;EXP=c:windowssystemcomdlg32.dll
...
Точка с запятой в первой позиции строки означает, что эта строка является комментарием, и информация
n функциях из указанного файла экспортироваться не будет. Чтобы включить экспорт символьной
информации, нужно просто удалить точку с запятой. Нет необходимости экспортировать функции из всех
этих файлов, обычно бывает достаточно выполнить следующее:
EXP=c:windowssystemkernel32.dll
EXP=c:windowssystemuser32.dll
EXP=c:windowssystemgdi32.dll
EXP=c:windowssystemcomdlg32.dll
EXP=c:windowssystemshell32.dll
EXP=c:windowssystemadvapi32.dll
EXP=c:windowssystemcomctl32.dll
Осталось выбрать подходящий размер шрифта, используемые цвета и размеры окон. Для этого в SoftIce
используется строка инициализации. Если вы работаете в разрешении 800x600, строку
INIT="X;"
замените строкой
INIT="lines 41;width 98;set font 2;wc 20;wd4;wl 4;X;"
Для других разрешений можно либо выбрать более крупный шрифт, либо увеличить число строк (lines) и
символов в строке (width).
Всё! Осталось только перезагрузится. После перезагрузки нажмите Ctrl+D, и если всё сделано правильно
должно появится окно отладчика. Вверху окна отладчика находится список всех регистров, внизу строка
для ввода команд, по центру – основное окно. Нажмите Ctrl+D ещё раз, чтобы выйти из отладчика.
Для работы с SoftIce необходимо знать основные брэйкпоинты.
Общецелевые брэйкпоинты:
bpx hmemcpy
bpx MessageBox
bpx MessageBoxExA
bpx MessageBeep
bpx SendMessage
bpx GetDlgItemText
bpx GetDlgItemInt
bpx GetWindowText
bpx GetWindowWord
bpx GetWindowInt
bpx DialogBoxParamA
bpx CreateWindow
bpx CreateWindowEx
bpx ShowWindow
bpx UpdateWindow
bmsg xxxx wm_move
bmsg xxxx wm_gettext
bmsg xxxx wm_command
bmsg xxxx wm_activate
При Времянных защитах:
bpint 21 if ah==2A (DOS)
bpx GetLocalTime
bpx GetFileTime
bpx GetSystemtime
bpx GetTickCount
bpx FileTimeToSystemTime
При CD-ROM и Дисковых защитах:
bpint 13 if ah==2 (DOS)
bpint 13 if ah==3 (DOS)
bpint 13 if ah==4 (DOS)
bpx GetFileAttributesA
bpx GetFileSize
bpx GetDriveType
bpx GetVolumeInformation
bpx GetLastError
bpx ReadFile
bpio -h (Your CD-ROM Port Address) R
При защитах типа:
Dongle (HASP) bpio -h 278 R
bpio -h 378 R
На ввод с клавиатуры:
bpint 16 if ah==0 (DOS)
bpint 21 if ah==0xA (DOS)
При работе с файловыми защитами:
bpint 21 if ah==3dh (DOS)
bpint 31 if ah==3fh (DOS)
bpint 21 if ah==3dh (DOS)
bpx ReadFile
bpx WriteFile
bpx CreateFile
bpx SetFilePointer
bpx GetSystemDirectory
При работе с INI файлами:
bpx GetPrivateProfileString
bpx GetPrivateProfileInt
bpx WritePrivateProfileString
bpx WritePrivateProfileInt
При работе с Реестром:
bpx RegCreateKey
bpx RegDeleteKey
bpx RegQueryValue
bpx RegQueryValueEx
bpx RegCloseKey
bpx RegOpenKey
При Флагах в регистрах:
bpx cs:eip if EAX==0
При Флагах в памяти:
bpmb cs:eip rw if 0x30:0x45AA==0
При "подслушивающей" технике взлома:
bpx 0x30:0x45AA do "d 0x30:0x44BB"
bpx CS:0x66CC do "? EAX"
При работе с консольными приложениями:
WriteConsole/ReadConsole
SetCursorPos
HEX редакторы.
HEX редакторы используется для внесения в файл каких-либо изменений, после взлома. Я, например,
пользуюсь: HackerView’ом.
RegMon и FileMon.
Программы RegMon и FileMon используются для того чтобы пользователь мог посмотреть куда в реестр и к
каким файлам обращается нужная программа.
Пакеры и Анпакеры
Программы-пакеры программисты используют для того, чтобы их программа имела меньший вес, и для того
чтобы их код нельзя было просмотреть в Дизассемблере. Анпакеры используются для их распаковки.
Хорошим анпакером можно назвать ProcDump, он с легкостью с... Читать дальше »
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
|
Привет всем !
Несколько месяцев назад я установил прогу, которая, как заверяли разработчики, за пару месяцев могла
обучить быстрому слепому набору текста (как русскому так и английскому). Юзать эту прогу стали мои
родственники. Но прогу нашару никто не подарит. Ее надо зарегистрировать и отвалить 15 $. Все мы
люди экономные и лишние деньги нам не помешают :)
Значит сегодня мы будем ломать Соло на клавиатуре 8.1
Нам будут нужны традиционные инструменты крэкера : Дизасемблер (я использовал Ida), отладчик
SoftIce, знание ассемблера (хотя я буду давать некоторые пояснения по ходу дела). Еще нам нужна сама
программа. Найти ее можно на сайте производителя www.ergosolo.ru .
Запускаем программу. Она сразу же выводит сообщение, что надо зарегистрироваться. В одном поле для
ввода содержится серийный номер, во втором нам надо ввести регистрационный код. Пробуя ввести код,
можно заметить что кнопка "Register Now" заблокирована и только когда мы введем правильный код, она
разблокируется.
Из этого можно зделать вывод, что программа берет серийный номер, генерирует регистрационный код и
сравнивает правильный код с тем, который ввели мы (хотя возможен вариант что прога берет наш код и
на его основе генерирует серийный номер и сравнивает с правильным, такой способ громоздкий и мало
вероятный).
Теперь приступим к работе с SoftIce. "Соло на клавиатуре" может произвести считывание
регистрационого кода с помощью Api-функций GetDlgItemTextA или GetWindowTextA. Жмем Ctrl+D, всплывет
окно SoftIce (Ctrl+D стоит по-дэфолту).
Вводим команды :
bpx GetDlgItemTextA
bpx GetWindowTextA
С помощью команды bpx устанавливается точки прерывания (breakpoint) на вызов функций. Снимаются
брейкпоинты командой bc(bc номер (начиная с 0) или bc * (снять все)). Повторное нажатие Ctrl+D или
F5 закроет SoftIce.
Далее набираем в поле для ввода кода любой символ. Сразу же выскакивает SoftIce. Мы находимся
непосредственно внутри функции на которую мы ставили breakpoint (это GetWindowTextA).
После нажатия F12 мы перейдем на следущую по счету команду после вызова этой функции. Прокрутим окно
с командами вверх (Ctrl+Up). Там будет следуйщее (адреса могут отличатся) :
017F:5F4036C3 Push EAX
017F:5F4036C4 Push DWORD PTR [ESI+20]
017F:5F4036C7 Call [User32!GetWindowTextA]
Команда Push заносит значение в стек. В данном случае так передаются параметры функциям. EAX
указывает на место где будет хранится введеный код.
Чтобы выяснить значение EAX (функция попортила его), установим брейкпоинт на адресс 017F:5F4036C3
(bpx 017F:5F4036C3). Жмем F5, вводим еще один символ в поле для кода.
Мы попадаем на нужную точку. EAX = 00695150. Жмем 3 раза F10 (пошаговое выполнение команд, по вызову
(Call) переход во внутрь функции не происходит). После GetWindowTextA, по адресу в EAX запишется
считаная строка. Этот кусок памяти можно просмотреть командой :
d 00695150
Следующее с верху - окно данных. В нем мы можем наблюдать содержимое интересующего нас участка
памяти. После команды d 00695150 в этом окне будет введенный код.
Прокрутим окно данных вниз (Alt+Down). По адресу 00695100 хранится серийный номер. К нему должно
просходить обращение, когда прога генерит правильный код. Если переместится к адресу 00695100, то
можно увидеть набор цифр (!!!!!). Я определил что сюда программа пишет правильный код. Осталось его
просто ввести :)
А теперь разберем алгоритм по которому программа генерирует правильный код. После срабатывания
брейкпоинта вернемся на уровень вверх (F12). Там следущее :
00414E1A : Push ECX
Lea EDX, [ESP+0Ch]
Mov ECX, ESP
Mov [ESP+10h], ESP
Push EDX
00414E26 : Call 0042F65 ;нам не нужна
00414E2B : Call 0040165E ;генерация кода
В первом вызове нет ничего интересного, там проверка длины и другие действия. А вот второй ... :)
Когда очередь подойдет к выполнению CALL 0040165E, нужно нажать F8 (внутрь функции). После
нескольких нажатий появится следуещее :
017F:004046B1 : Mov EDI, [EAX] ; EAX = 00695100, тобиш серийный номер
; (предыдущая процедура перезаписала этот участок памяти)
Push FF
Mov EBP, [EAX+04h] ;первые 4 цифры, но не забывайте
;что они задом-на-перед
Mov EBX, [EAX+08h] ;вторые 4 цифры
Mov ECX, [EAX+0Ch] ;третие 4 цифры
Mov [ESP+28h], ECX ;ESP+28 указывает на адрес 0067F4D0
Lea ECX, [ESP+18h] ;ESP+18 указывает на адрес 00695100
Mov DX, [EAX+10h] ;EAX+10 указывает на адрес 00695100
Mov [ESP+2Ch], DX ;ESP+2C указывает на адрес 0067F4D4
Call ... ;не важно
Mov ESI, [ESP+26h] ;ESP+26 указывает на адрес 0067F4D2
Mov EDX, [ESP+24h] ;ESP+24 указывает на адрес 0067F4D0
Xor ESI, EDX
Lea ECX, [ESP+10h] ;ESP+10 указывает на адрес 0067F4BC
Xor ESI, EBX
Xor ESI, EBP
Xor ESI, EDI
Xor ESI, 0AC40A05Eh
Теперь в ESI правильный код в шестнадцетеричном виде. Теперь не составит труда написать KeyGen.
Генератор ключей для программы можно взять тут: http://rst.void.ru/download/Solo-KeyGen.zip
|
Скрины:
Дата: 02.12.2009
Добавил: admin
Комментарии: (0)
|
| |
|
|
|
|
|
|
Рассылка
|