Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2016, 23:49   #1
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию Копирование API-фкнкции в локальный буфер

При запуске на исполнение получаю ошибку доступа при попытке получения дескриптора консоли. Блок кода с ошибкой начинается с
Код:
// ДЕМОНСТРАЦИОННЫЙ ЗАЩИТНЫЙ МЕХАНИЗМ
    // =======================================================================
Код:
/* ---------------------------------------------------------------------------
 * демонстрация противодействия программным (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");
}
StillPhelix вне форума Ответить с цитированием
Старый 22.02.2016, 12:04   #2
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 35
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
копирование ячеек на лист 2 и по условию копирование строки в буфер FiataliS Microsoft Office Excel 7 11.05.2020 18:19
C++ WIN 32 API Буфер обмена amerhant Помощь студентам 1 06.02.2012 22:05
Копирование в буфер обмена motorway JavaScript, Ajax 1 10.04.2011 07:36
Копирование в буфер обмена Xanex Общие вопросы Delphi 5 18.05.2009 23:13
Копирование в буфер Windows NeiL Общие вопросы Delphi 3 23.04.2008 21:46