Пишем кряк

Автор - OverG

Эту статью можно назвать продолжением статьи "Взламываем защиту CDRWin".

Сегодня мы рассмотрим то, как простейшим образом написать кряк. Делать это мы будем на 3 самых популярных в данное время языках программирования: Делфи, Си и ассемблер.
Использовать будем функции WinAPI: CreateFile, SetFilePointer, WriteFile. Думаю что первая и третья функции у вас не вызовут вопросов, название говорит само за себя. Для тех кто не знает скажу, что функция SetFilePointer делает смещение в нужное нам место(offset).
Мы уже знаем, что нам надо заменить в файле cdrwin5.exe байты, расположенные по адресам 003D99 и 0018871, на байт EB (в 16ом виде), чтобы переход был безусловным.

Итак, приступим. Я сразу приведу все 3 исходных кода с комментариями.

Delphi:

program cdrwincrk;
{$APPTYPE CONSOLE}
uses Windows;

var iByteWrt:Cardinal;
hFile:THandle;
const JmpByte:integer=$EB;

Begin
Writeln('Crack for CDRWin v5.01 - 5.02 by Over G[DWC Gr0up]');
hFile:=CreateFile('cdrwin5.exe',GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
SetFilePointer(hFile,$3D99,nil,0); //Смещение на 003D99
WriteFile(hFile, JmpByte, 1, iByteWrt, nil); //Пишем байт $EB по адресу 003D99
SetFilePointer(hFile,$18871,nil,0); //Смещение на 0018871
WriteFile(hFile, JmpByte, 1, iByteWrt, nil); //Пишем байт $EB по адресу 0018871
CloseHandle(hFile);//Закрываем файл
Writeln('File Successfull cracked!'+#13#10+'Press ENTER to exit');
Readln;
End.

C++

#include "windows.h"

int main(int argc, char* argv[])
{
char JmpByte[] = "\xeb";

HANDLE hFile;
DWORD iByteWrt = 0;

printf("Crack for CDRWin v5.01 - 5.02 by Over G[DWC Gr0up]\n");
hFile=CreateFile("cdrwin5.exe",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
SetFilePointer(hFile,0x3D99,NULL,0); //Смещение на 003D99
WriteFile(hFile, JmpByte, 1, &iByteWrt, NULL); //Пишем байт EB по адресу 003D99
SetFilePointer(hFile,0x18871,NULL,0); //Смещение на 0018871
WriteFile(hFile, JmpByte, 1, &iByteWrt, NULL); //Пишем байт EB по адресу 0018871
CloseHandle(hFile); //Закрываем файл
printf("File Successfull cracked!");
return 0;
}

ASM:


.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib


.data
AppName db "Crack for CDRWin v5.01 - 5.02 by Over G[DWC Gr0up]",0
isOK db " File successfull cracked!",0
CrkPrg db "cdrwin5.exe",0
JmpByte db 0EBh

.data?
hFile HANDLE ?
hWnd HANDLE ?
SizeWrite DWORD ?

.code
start:
invoke MessageBox,hWnd,ADDR AppName,ADDR AppName,64
invoke CreateFile,ADDR CrkPrg,GENERIC_WRITE, FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
mov hFile,eax
invoke SetFilePointer,hFile,03D99h,NULL,0 //Смещение на 003D99
invoke WriteFile,hFile,ADDR JmpByte,1,ADDR SizeWrite,NULL //Пишем байт EB по адресу 003D99
invoke SetFilePointer,hFile,018871h,NULL,0 //Смещение на 0018871
invoke WriteFile,hFile,ADDR JmpByte,1,ADDR SizeWrite,NULL //Пишем байт EB по адресу 0018871
invoke CloseHandle,hFile
invoke MessageBox,hWnd,ADDR isOK,ADDR AppName,64
ret
end start