Загрузка...

Guide - C++ Defense Cheats

Thread in Programming created by alsoyka Oct 31, 2017. 795 views

  1. alsoyka
    alsoyka Topic starter Oct 31, 2017 131 Oct 22, 2016
    Просто солью класс проверки целостности функций за неактуальностью в моих кругах.
    Code
    #include <windows.h>
    #include <vector>

    static BYTE ContentPattern[42] =
    {
    0xEB, 0x28, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
    0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
    0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
    0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
    };

    #define MARKER_NORM 0x90
    #define POLY_SIZE 0x2A
    #define POLY_JUMP_DIST POLY_SIZE - 2

    #define CONTENT_NORM \
    __asm _emit 0xEB \
    __asm _emit POLY_JUMP_DIST \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM \
    __asm _emit MARKER_NORM

    #define PATTERN "x?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    struct Content
    {
    DWORD StartPoint;
    size_t sizeofContent;
    void* Buffer;
    Content(DWORD _StartPoint, size_t _sizeofContent, void* _Buffer) : StartPoint(_StartPoint), sizeofContent(_sizeofContent), Buffer(_Buffer){ }
    };

    class SecureContent
    {
    public:
    SecureContent();

    bool Compare(const BYTE* pData, const BYTE* bMask, const char* szMask);
    DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE* bMask, char* szMask);

    Content GetContent(void* address);
    bool CompareContent(void* address, Content original);
    void FreeContentBuffer(Content content);

    ~SecureContent();
    };
    Code
    #include "SecureContent.h"

    SecureContent::SecureContent() { }

    bool SecureContent::Compare(const BYTE* pData, const BYTE* bMask, const char* szMask) {
    for (; *szMask; ++szMask, ++pData, ++bMask)
    if (*szMask == 'x' && *pData != *bMask)
    return false;
    return (*szMask) == NULL;
    }

    DWORD SecureContent::FindPattern(DWORD dwAddress, DWORD dwLen, BYTE* bMask, char* szMask) {
    for (DWORD i = 0; i < dwLen; i++)
    if (this->Compare((BYTE*)(dwAddress + i), bMask, szMask))
    return (DWORD)(dwAddress + i);
    return NULL;
    }

    Content SecureContent::GetContent(void* address) {
    //ищим первый макрос
    DWORD dwStartContent = this->FindPattern(reinterpret_cast<DWORD>(address), POLY_SIZE, ContentPattern, (char*)PATTERN);
    //если нашло
    if (dwStartContent) {
    //Добавляем размер макроса
    dwStartContent += POLY_SIZE;
    //ищем второй макрос, конец контента
    DWORD dwEndContent = this->FindPattern(dwStartContent, POLY_SIZE, ContentPattern, (char*)PATTERN);
    //нашло конец контента
    if (dwEndContent) {
    //Размер контента
    DWORD offset_data = (dwEndContent - dwStartContent);
    //если >=1
    if (offset_data >= 1) {
    //выделяем блок памяти размером в контент
    void* block = malloc(offset_data);
    //копируем контент в выделенную память
    memcpy(block, reinterpret_cast<void*>(dwStartContent), offset_data);
    //возвращаем структуру.
    return Content(dwStartContent, offset_data, block);
    }
    }
    }
    //Нуль
    return Content(NULL, NULL, NULL);
    }
    bool SecureContent::CompareContent(void* address, Content original) {
    //Получаем контент в режиме реального времени
    Content timeLine = this->GetContent(address);
    //Если контент реального времени прошел проверки
    if (timeLine.StartPoint && timeLine.sizeofContent && timeLine.Buffer) {
    //сравниваем память
    bool status = memcmp(timeLine.Buffer, original.Buffer, original.sizeofContent) == 0;
    //осовбождаем буфер
    this->FreeContentBuffer(timeLine);
    //возвращаем значение.
    return status;
    }
    return false;
    }

    void SecureContent::FreeContentBuffer(Content content) {
    if (content.Buffer) {
    free(content.Buffer);
    }
    }

    SecureContent::~SecureContent() { }
    С чем это жевать?
    Code
    #include <windows.h>

    #include <iostream>
    #include "SecureContent.h"
    void testContent()
    {
    CONTENT_NORM//макрос херачит буфер байт, для поиска начала контента
    int a = 4, b = 4;
    printf("content Test1: %d\n", a + b);
    printf("content Test2: %d\n", a * b);
    printf("content Test3: %d\n", a - b);
    CONTENT_NORM//конец контента. все что между двумя макросами является контентом который будет чекатся.
    }
    int main()
    {
    //Класс
    SecureContent ContentFree;
    //хапаем контент
    Content test = ContentFree.GetContent(&testContent);
    //дергаем адресс начала контента, чтобы пропатчить в се и проверить)))
    printf("content start address: 0x%X\n", test.StartPoint);
    system("pause");
    //сравниваем контент
    if (ContentFree.CompareContent(&testContent, test)) {
    //совпал
    testContent();
    //особождаем буфер
    ContentFree.FreeContentBuffer(test);
    }
    else
    {
    //Контент не совпал!
    printf("content no!\n");
    }
    system("pause");
    return 0;
    }

    Суть кода проста: делает дубликат участка кода, а после, сравнивает))
    Что это значит? Это значит, что эта фича делает копию некого кода, которую потом, перед выполнением этого самого кода, можно сравнить и если этот самый код, целостность которого нужно проверять, не совпадает с скопированным кодом, это будет означать что он модифицирован, отладчиком на пример. И что же можно проверять спросите вы? на пример проверку лицензии в чите. если проверку лицензии пропатчили, это будет видно.
     
  2. TORONTO_inactive116149
    TORONTO_inactive116149 Oct 31, 2017 BAD TORONTO 109 May 23, 2017
    Пездато
     
  3. TORONTO_inactive116149
    TORONTO_inactive116149 Nov 2, 2017 BAD TORONTO 109 May 23, 2017
    Симпу завтра поставлю,ибо лимит соре :с
     
  4. rscx
    rscx Apr 8, 2018 2136 Feb 17, 2018
    thank
     
  5. romanq_inactive136547
    В чем проблема обойти это? делается элементарный хук в main перед началом всех функций. Не говорю уже о элементарном затирании этих маркеров проверки
     
Top
Loading...