Исследование Winamp Skin Maker v1.2

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.cracklab.narod.ru

Предисловие Сама защита в этой программе — почти никакая, и все обычно ограничиваются нахождением кода для своего имени, а кейгенов я до сих пор не видел. Однако алгоритм генерации ключа если не сложный, то довольно муторный, и разбираться в не хочется. Но кейген писать придётся. Воспользуемся особенностью нашего человека — нестандартным мышлением.

Приступим к делу. Что нам сейчас нужно:

Softice 4.*

Icedump 6.* — только для того, чтобы копировать текст из Softice»а на диск.

Можете заменить его W32Dasm и ручкой с бумагой.

Hiew 32 6.5

Delphi 4-6 (6 recommended).

ResHacker, WinRar.

Итак, запускаем программу(перед этим Softice и т.д.).

Идем на Help->About->Register. Вводим РИ. Ставим брейкпоинт на hmemcpy.

Жмем OK. Попадаем в Softice. Снимаем брейкпоинт.

Теперь жмем F12 до тех пор, пока не вылезем в Skinner.exe. После этого наблюдаем следующее:

—————————————————byte—————PROT—(0)—

-вырезано-

————————————————————————-PROT32-

-вырезано-

016F:00406D7A MOV EDI,[USER32!GetDlgItemTextA]

016F:00406D80 PUSH ESI

016F:00406D81 CALL EDI (То есть USER32!GetDlgItemTextA) Name>

016F:00406D83 LEA EAX,[ESP 38]

016F:00406D87 PUSH 29

016F:00406D89 PUSH EAX

016F:00406D8A PUSH 000003FD

016F:00406D8F PUSH ESI

016F:00406D90 CALL EDI (То есть USER32!GetDlgItemTextA) Our reg.#>

016F:00406D92 LEA EAX,[ESP 0C]

016F:00406D96 PUSH EAX

016F:00406D97 CALL 00407E30

016F:00406D9C ADD ESP,04

016F:00406D9F MOV EBX,EAX

————————————SKINNER!.text 5D64—————————

Break due to BPX KERNEL!HMEMCPY (ET=1.26 seconds)

:bc *

:/Screendump C:\f1.dos

Далее:

016F:00406DA1 LEA EAX,[ESP 38]

016F:00406DA5 PUSH EAX

016F:00406DA6 CALL 00407D00

016F:00406DAB ADD ESP,04

016F:00406DAE MOV EDI,EAXТеперь в EDI результат (код)!

016F:00406DB0 TEST EDI,EDI

016F:00406DB2 JNZ 00406DEB

И вот:

016F:00406DEB CMP ED(наш>,EBX(правильный>

016F:00406DED JNZ 00406E24

А EBX мы последний раз меняли ещё в первом случае!

Теперь остаётся «всего-то» узнать значение EBX программным способом для Skinner.exe в момент сравнения кодов :)!

Я видел где-то старый некрасивый способ, который предполагает спровоцировать сбой, Windows 95/98 покажет вам табличку с регистрами и сообщением об ошибке. Потом надо взять значение EBX , перевести в десят. систему и это будет код. Нудно, некрасиво, и не работает под другими ОС.

Я нашел способ, который проще и лучше. На это I’ve spent 24 hours.

Мне всегда нравилась функция ExitProcess(ExitCode:Cardinal). Говорят, что под Win X в ExitCode можно ставить любое число.

Пишем свой код после: (using Hiew)

016F:00406D97 CALL 00407E30

016F:00406D9C ADD ESP,04

push eax

call Kernel32!ExitProcess

это ассемблируется до:

50 FF1548244300,

причем второе я подсмотрел в Imported Functions в W32Dasm, а 1-е написал сам Hiew.

Ну что, теперь программа по нажатию О.К. просто закрывается. Надо как-нибудь получить то, что она передаёт из EAX. Воспользуемся Delphi 6.

Sources:

program Project1;

uses Windows, SysUtils, Messages; //необходимый миниму>

{$APPTYPE GUI} //У нас Gui-приложение>

{$R Icon.res} //иконку возьме>

{$R Dlg.res} //и диалог тож>

var

rc: Cardinal; //код на>

StartupInfo: TStartupInfo; //необ. с>

ProcessInfo: TProcessInformation; //необ. с>

procedure StartProcess(hWnd: THandle); //процедура наш>

begin

rc := 0;

FillChar(StartupInfo, Sizeof(StartupInfo), #0); //заполняем с>

StartupInfo.cb := Sizeof(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;

StartupInfo.wShowWindow := SW_SHOWDEFAULT;

CreateProcess(nil, Pchar(‘WSV1.20.KG.exe’), nil, nil, false,

NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); //создаем процес>

WaitforSingleObject(ProcessInfo.hProcess, INFINITE); //ждем завершени>

GetExitCodeProcess(ProcessInfo.hProcess, rc); //получаем ко>

if rc

Добавить комментарий