Фундаментальные основы хакерства




Способ 0. Бряк на оригинальный пароль. - часть 6


#include <stdio.h>

#include <windows.h>

__declspec(dllexport) void Demo()

^^^^^^^^^^^^^^^^^^^^^

{

#define PASSWORD_SIZE 100

#define PASSWORD      "myGOODpassword\n"

int count=0;

char buff[PASSWORD_SIZE]="";

for(;;)

{

printf("Enter password:");

fgets(&buff[0],PASSWORD_SIZE-1,stdin);

if (strcmp(&buff[0],PASSWORD))

printf("Wrong password\n");

else break;

if (++count>2) return -1;        

}

printf("Password OK\n");

}

main()

{

HMODULE hmod;

void (*zzz)();

if ((hmod=LoadLibrary("crack0~1.exe"))

&& (zzz=(void (*)())GetProcAddress(h,"Demo")))

zzz();

}

Листинг 2 Исходный текст защиты crackme 0x3

Какой, однако, извращенный способ вызова функции! Защита экспортирует ее непосредственно из самого исполняемого файла и этот же файл загружает как DLL (да, один и тот же файл может быть одновременно и исполняемым приложением и динамической библиотекой!).

"Все равно ничего не сходится", - возразит программист средней квалификации, - "всем же известно, что Windows не настолько глупа, чтобы дважды грузить один и тот же файл, - LoadLibrary всего лишь возвратит базовый адрес модуля crackme0x03, но не станет выделять для него память". А вот как бы не так! Хитрая защита обращается к файлу по его альтернативному короткому имени, вводя системный загрузчик в глубокое заблуждение!

Система выделяет память и возвращает базовый адрес загружаемого модуля в переменной hmod. Очевидно, код и данные этого модуля смещены на расстояние hmod – base, где base – базовый адрес модуля – тот, с которым работают HIEW и дизассемблер. Базовый адрес узнать нетрудно – достаточно вызвать тот же DUMPBIN с ключом "/HEADERS" (его ответ приведен в сокращенном виде)

>dumpbin /HEADERS crack0x03

OPTIONAL HEADER VALUES

...

400000 image base

^^^^^^^^^^^^^^^^^

...




Содержание  Назад  Вперед