Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> надежный способ идентифицировать программу. 
:(
    Опции темы
boostcoder
Дата 15.7.2011, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



всем привет.

ситуация такая:
написал античит для онлайн игрушки. античит периодично с сервера запрашивает инфу из БД известных читов(имя_файла + CRC_сумму + текст_заголовка_окна), периодично сканит систему на предмет поиска известных читов, и, если находит - прибивает. это все отлично работает.
но попался очень хитрый чит. а хитер он тем, что он доступен в исходниках, т.е. тупая перекомпиляция разными версиями компиляторов тупо произведет exe`шники с разной CRC-суммой. в добавок, в опциях можно самому настраивать/указывать текст заголовка.

вопрос: как идентифицировать такой чит?

всем спасибо.


Это сообщение отредактировал(а) boostcoder - 15.7.2011, 06:51
PM WWW   Вверх
ZVano
Дата 15.7.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(boostcoder @  15.7.2011,  06:50 Найти цитируемый пост)
как идентифицировать такой чит?

Предположение: контрольная сумма названий экспортируемых функций в верхнем регистре и отсортированых по алфавиту.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
boostcoder
Дата 15.7.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(ZVano @  15.7.2011,  09:42 Найти цитируемый пост)
контрольная сумма названий экспортируемых функций в верхнем регистре и отсортированых по алфавиту.

вариант smile 
а не подскажите случайно, как имена можно извлечь без использования "инструмента" ?

Добавлено через 9 минут и 27 секунд
хотя... если чит доступен в исходниках, значит набор/имена экспортируемых функций могут часто меняться..
PM WWW   Вверх
ZVano
Дата 15.7.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(boostcoder @  15.7.2011,  09:44 Найти цитируемый пост)
ак имена можно извлечь без использования "инструмента" ?

Могу дать только направление.

Нужно прочитать таблицу импорта из заголовка PE -файла.
Тут  исходник.
Тут поисковый запрос гугла.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
boostcoder
Дата 15.7.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



спасибо. ушел читать.

Добавлено через 28 секунд
может кто-то подкинет еще какую-то идею...
PM WWW   Вверх
ASMatic
Дата 15.7.2011, 23:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



количество\относительное расположение окон(дочерных)...
С импортом - не особо хорошо считать контрольную сумму, я бы проверял на наличие некоторых ключевых импортируемых фунок + окна(например) - если все сошлось 99% что можно бить)
Но это все ничего не даст - до сраки, поправили код и уже нету фунок в импорте = поможет вам только ядро и неплохая логика, дабы читу не дать открыть процесс и т.п.
в2. - инжект во все создаваемые процессы и там уже перехват NtOpenProcess(), NtWriteVirtualMemory, etc = опять таки можно на ваши перехваты забить)

Вот сорс на си, почти что вам нужно...(по поводу импорта)

Код

PVOID
peGetProcAddrByModule(
    IN      PBYTE       Base,
    IN      DWORD       ProcHash
    )
{
    PIMAGE_NT_HEADERS32         ImageNtHeader;
    PIMAGE_EXPORT_DIRECTORY     ied;
    WCHAR       LibraryName[MAX_PATH];
    CHAR        buff[MAX_PATH];
    PULONG_PTR  Names,
                Functions;
    PUSHORT     NameOrdinals;
    PCHAR       Name;
    PVOID       Addr;
    ULONG       i;

    Addr = NULL;
    if (Base) {

        ImageNtHeader = (PIMAGE_NT_HEADERS32)( ((PIMAGE_DOS_HEADER)Base)->e_lfanew + (ULONG_PTR)Base );
        ied = (PIMAGE_EXPORT_DIRECTORY)ImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT ].VirtualAddress;
        if (ied) {

            ied = (PIMAGE_EXPORT_DIRECTORY)( (ULONG_PTR)ied + (ULONG_PTR)Base );
            Names = (PULONG_PTR)( (ULONG_PTR)Base + ied->AddressOfNames );
            Functions = (PULONG_PTR)( (ULONG_PTR)Base + ied->AddressOfFunctions );
            NameOrdinals = (PUSHORT)( (ULONG_PTR)Base + ied->AddressOfNameOrdinals );

            for (i = 0; i < ied->NumberOfNames; i++) {
                Name = (PCHAR)( (ULONG_PTR)Base + Names[i] );
                if (ProcHash == HashStr( Name )) {
                    Addr = (PVOID)( Functions[ NameOrdinals[i] ] + (ULONG_PTR)Base);

                    if ( ((ULONG_PTR)Addr >= (ULONG_PTR)ied)
                        && ((ULONG_PTR)Addr <= (ULONG_PTR)ied + ImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT ].Size)) {

                        //This is forwarded proc, begin load library and get proc addr
                        i = 0;
                        while (((PCHAR)Addr)[i] != '\0'){
                            buff[i] = ((PCHAR)Addr)[i];
                            if (((PCHAR)Addr)[i] == '.')
                                break;
                            i++;
                        }
                        *(PDWORD)&buff[++i] = '\0lld';

                        AtoW( LibraryName,
                              buff );

                        WcsToLower( LibraryName );
                        ProcHash = HashStr( &((PCHAR)Addr)[i] );
                        Addr = peGetProcAddr( LibraryName,
                                              ProcHash );
                    }
                    break;
                }
            }
        }
    }

    return Addr;
}


Это сообщение отредактировал(а) ASMatic - 15.7.2011, 23:06
PM MAIL   Вверх
boostcoder
Дата 15.7.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(ASMatic @  15.7.2011,  23:03 Найти цитируемый пост)
инжект во все создаваемые процессы и там уже перехват NtOpenProcess(), NtWriteVirtualMemory, etc = опять таки можно на ваши перехваты забить)

слишком сложно для меня. не силен я в системном программировании для виндоус :(
PM WWW   Вверх
ASMatic
Дата 15.7.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



Цитата(boostcoder @  15.7.2011,  21:05 Найти цитируемый пост)
 не силен я в системном программировании для виндоус

трудновато тогды будет бороться с читами.)
PM MAIL   Вверх
Dik0n
Дата 16.7.2011, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



Цитата(ASMatic @  15.7.2011,  23:03 Найти цитируемый пост)
в2. - инжект во все создаваемые процессы и там уже перехват NtOpenProcess(), NtWriteVirtualMemory, etc = опять таки можно на ваши перехваты забить) 

такая защита только от пионеров, даже если написать драйвер хукающий эти и другие функции, что мешает заинжектить свою DLL в игру и работать изнутри процесса, в общем способов море, обхода всяческих защит. Защита Frost еще как-то справляется, да и то ее переодически нагибают, хотя ее разрабатывают действительно профессионалы своего дела.
Цитата

трудновато тогды будет бороться с читами.

Увы, что правда то правда.
Цитата

вопрос: как идентифицировать такой чит?

Наверное так-же, как это делают антивирусные программы smile по сигнатурам, определенных участков файла (кода) только кто эти сигнатуры будет создавать ? Да и запаковать можно чит. Ох, да и хлопотное это дело вести базу читов, их же великое множество попробуй уследи за всеми.
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
volatile
Дата 16.7.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



boostcoder, если есть исходники чита, нужно копать их.
Там к чему нибудь можно наверное прикрепиться.
Самое простое - возможно есть какие-то текстовые строки.

PM MAIL   Вверх
boostcoder
Дата 16.7.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



volatile, уже работаю в этом направлении. еще беда(для меня) в том, что чит написан на дельфе smile 

Это сообщение отредактировал(а) boostcoder - 16.7.2011, 00:17
PM WWW   Вверх
ASMatic
Дата 16.7.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



Dik0n, все зависит что и как хучить. Если в ядре строить защиту = можно создать чот вполне приемлимое, но с читами трудно боротся, т.к. юзер сам заинтересован в "трояне")
понятно что от лома нет приёма, тут никто не спорит - но задачка опенсорс чит деактивировать..
PM MAIL   Вверх
volatile
Дата 16.7.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(boostcoder @  16.7.2011,  00:16 Найти цитируемый пост)
еще беда(для меня) в том, что чит написан на дельфе  

В данном конкретном случае это даже лучше.
Если бы было на С++, то код очень сильно отличался бы в зависимости от компилятора.
А Дельфи - один. И код будет примерно одинаковым.

Можно попробовать выделить какую-нибудь сигнатуру ... 

PM MAIL   Вверх
boostcoder
Дата 16.7.2011, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(volatile @  16.7.2011,  01:06 Найти цитируемый пост)
Если бы было на С++, то код очень сильно отличался бы в зависимости от компилятора.
А Дельфи - один. И код будет примерно одинаковым.

кстати я не подумал об этом smile

Цитата(volatile @  16.7.2011,  01:06 Найти цитируемый пост)
Можно попробовать выделить какую-нибудь сигнатуру ... 

значит нужно нагуглить как можно больше бинарей этого чита, и каким-то бинарным diff`ом выделить одинаковые участки. и их уже можно анализировать на предмет поиска связи с исходниками. smile 
PM WWW   Вверх
volatile
Дата 16.7.2011, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(boostcoder @  16.7.2011,  01:10 Найти цитируемый пост)
значит нужно нагуглить как можно больше бинарей этого чита, и каким-то бинарным diff`ом выделить одинаковые участки. и их уже можно анализировать на предмет поиска связи с исходниками. 

Ну, да. Как 1 из вариантов можно попробовать  smile 

Для сигнатуры в принципе достаточно не очень длинной последовательности. байт 16...32
Антивирусы примерно так работают.
Но байты сигнатуры могут идти не подряд.
например:
C2 BE F3 ?? ?? ?? ?? 01 2A ?? ?? ?? 3E
Ну вы меня поняли.

Попробуйте..
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.