Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Копирование API-фкнкции в локальный буфер

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

sunstars

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При запуске на исполнение получаю ошибку доступа при попытке получения дескриптора консоли.
Блок кода с ошибкой начинается с  

Код:
// ДЕМОНСТРАЦИОННЫЙ ЗАЩИТНЫЙ МЕХАНИЗМ
    // =======================================================================
 

 

Код:
/* ---------------------------------------------------------------------------
 * демонстрация противодействия программным (CCh) точкам останова,
 * установленным на API функции, путем их копирования целиком  в  своей
 * локальный буфер
----------------------------------------------------------------------------*/
#include <stdio.h>
#include <windows.h>
 
#define Year_EXPIRED     2000
#define MAX_CODE_SIZE    (69*1024)
 
// ПРОСТЕЙШИЙ КОПИРОВЩИК API-ФУНКЦИЙ
// =================================
//        копирует всю функцию в свой локальный буфер целиком и возращает адрес
// точки входа
//
// ARG:
//        p        -    указатль на API-функцию
//        dst        -    указатель на буфер куда копировать
//                    (размер буфера должет составлять не менее 69 Кб)
//
// RET:
//         !NULL    -    указатель на точку входа
//
// NOTE:
//        1) если программная точка останова на API функцию уже установлена,  
// то под отладчиком защищенное приложение просто грохнется
void* ZenCpy(char *p, char *dst)
{
    memcpy(dst, p - MAX_CODE_SIZE/2, MAX_CODE_SIZE);
    return dst + MAX_CODE_SIZE/2;
}
 
int main()
{
 
    int            a;
    HANDLE        h;
    DWORD        xl;
    HINSTANCE    hdll;
    OVERLAPPED    over;
    SYSTEMTIME    SystemTime;
 
    // буфера для копирования начала API-функций
    HANDLE ZGetStdHandle[MAX_CODE_SIZE];
    HANDLE ZGetLocalTime[MAX_CODE_SIZE];
    HANDLE ZWriteConsole[MAX_CODE_SIZE];
 
    // строка, которая будет выводится на экран ("trial expired\n")
    char EXPIRED[]    =    "\x12\x14\x0F\x07\x0A\x46\x03\x1E\x16\x0F\x14\x03\x02\x6B\x6C\x6B\x6C\x6B\x6C";
    char s[]="*";
    
 
    // объявляем указатели на динамически загружаемые фунции
    HANDLE(WINAPI *XGetStdHandle)(DWORD nStdHandle);
    void  (WINAPI *XGetLocalTime)(LPSYSTEMTIME lpSystemTime);
    BOOL  (WINAPI *XWriteConsole)(HANDLE hConsoleOutput, CONST VOID *lpBuffer,
                                  DWORD nNumberOfCharsToWrite,
                                  LPDWORD lpNumberOfCharsWritten,
                                  LPVOID lpReserved);
 
    fprintf(stderr, "CopyAPI\n");
 
    // ПОЛУЧАЕМ ОПИСАТЕЛЬ БИБЛИОТЕКИ KERNEL32.DLL
    // ==========================================
    // (это наиболее уязвимое место защиты и в реальных защитах лучше
    //  использовать stealth-загрузку)
    hdll = LoadLibrary("KERNEL32.DLL"); if (!hdll) return 0;
 
 
    // ПОЛУЧАЕМ АДРЕСА НЕОБХОДИМЫХ ФУНКЦИЙ
    // =======================================================================
    // (в реальных программах лучше использовать _собственную_ реализацию
    //  GetProcAddress, иначе хакер вас быстро раскусит)
    XGetStdHandle =    (HANDLE (WINAPI*)(DWORD nStdHandle)) GetProcAddress    (hdll, "GetStdHandle");
    if (!XGetStdHandle) return 0;
 
    XGetLocalTime = (void (WINAPI*)(LPSYSTEMTIME lpSystemTime)) GetProcAddress(hdll, "GetLocalTime");
    if (!XGetLocalTime) return 0;
 
    XWriteConsole = (BOOL (WINAPI*)(HANDLE hConsoleOutput,CONST VOID *lpBuffer,
                    DWORD nNumberOfCharsToWrite,LPDWORD lpNumberOfCharsWritten,
                    LPVOID lpReserved)) GetProcAddress(hdll, "WriteConsoleA");
                    if (!XWriteConsole) return 0;
 
 
    // КОПИРУЕМ ФУНКЦИИ В СВОЙ ЛОКАЛЬНЫЙ БУФЕР
    // =======================================================================
    XGetStdHandle = (HANDLE (WINAPI*)(DWORD nStdHandle)) ZenCpy((char *) XGetStdHandle, (char *)ZGetStdHandle);
 
    // обрабатываем GetLocalTime
    XGetLocalTime = (void (WINAPI*)(LPSYSTEMTIME lpSystemTime)) ZenCpy((char *) XGetLocalTime, (char *)ZGetLocalTime);
 
    // обрабатываем WriteConsoleA
    XWriteConsole = (BOOL (WINAPI*)(HANDLE hConsoleOutput, CONST VOID *lpBuffer, DWORD nNumberOfCharsToWrite,
                        LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)) ZenCpy((char *) XWriteConsole, (char *)ZWriteConsole);
 
 
    // ДЕМОНСТРАЦИОННЫЙ ЗАЩИТНЫЙ МЕХАНИЗМ
    // =======================================================================
 
 
    // получаем описатель консоли
    h = XGetStdHandle(STD_OUTPUT_HANDLE);//здесь получаем ошибку
 
    // опрашиваем текущее время
    XGetLocalTime(&SystemTime);//скорее всего и здесь будет ошибка
 
    // лицензия истекла?
    if ((SystemTime.wYear >= Year_EXPIRED))
    {
        // расшифровываем строку и выводим ругательство на экран
        for (a = 0; a < strlen(EXPIRED); a++)
        {
            s[0] = (EXPIRED[a] ^ 0x66);
            XWriteConsole(h, &s[0], 1, &xl, &over);
        }
        // выходим
        exit(-1);
    }
    printf("OK\n");
}
 
 
 

Всего записей: 22 | Зарегистр. 06-01-2016 | Отправлено: 21:21 21-02-2016
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Локальные переменные на стеке, ZGetStdHandle[] в том числе, не имеют аттрибута E(xecute), только RW. Надо ещё с VirtualProtect() поработать.
Но это в итоге ничего не даст, так как прога вылетит при выполнении первого скопированного call'a. Выход- или полностью писать свои GetStdHandle(), GetLocalTime(), итд, или копировать и исполнять на стеке только первую часть кода до первого call'a.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 10:13 22-02-2016
sunstars

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понято. Спасибо.

Всего записей: 22 | Зарегистр. 06-01-2016 | Отправлено: 12:01 22-02-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Копирование API-фкнкции в локальный буфер


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru