Форум программистов, компьютерный форум CyberForum.ru

Поиск команд ASM - C++

Восстановить пароль Регистрация
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
10.02.2013, 17:07     Поиск команд ASM #1
Здравствуйте.

Я пытаюсь отловить с помощью своего модуля,функцию другого модуля.

Составляю сигнатуру и хукаю. Не слишком сложные я без проблем хукаю,большие с трудом,проблема с узнаванием является ли данная команда адресом или нет.

http://s019.***********/i630/1302/99/dd166108fa2f.png

Такую я составил как:

0x53, 0x56, 0x8B, 0x74, -1, -1, 0x57, 0x8B, 0xCE, 0xE8, -1, -1, -1, -1, 0x84, 0xC0, 0x74, 0x39, 0x8B, 0x06, 0x8B, 0xCE, 0xFF, 0x50, -1, 0x8B, 0x4E, -1, 0x8D, 0x74, -1, 0x85, 0xC9, 0x74, 0x09, 0x8B, 0x46, -1, 0x8B, 0x11, 0x50, 0xFF, 0x52, -1


Это очень легко,если знать какая команда больше или ровна пяти ( Тобиш будет являться адресом и мы заменим её на -1 ),но я не изучал ассамблер и делаю под копирку с других статей или гуглю эту команду,которую не знаю,но не всегда нагугливается нужное.Вопрос заключается в том,где можно посмотреть весь список команд ? Гугл конкретного чего-то не дает.. Или не так гуглил.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2013, 17:07     Поиск команд ASM
Посмотрите здесь:

C++ c++ и ASM
Asm + C++ C++
asm вставка в C++ C++
C++ и ASM C++
C++ C++ И ASM
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.02.2013, 17:40     Поиск команд ASM #2
Цитата Сообщение от pEntity Посмотреть сообщение
Вопрос заключается в том,где можно посмотреть весь список команд ?
Правильно говорить "инструкций". Все инструкции описаны в Intel manual.
Вообще не совсем понял, чем ты занимаешся. Если тебе нужны опкоды инструкций, то их можно найти там же, НО нужно понимать, что для кодирования инструкции также может применяться т.н. ModR/M байт и далее может (но не обязан) следовать т.н. sib - байт. Итого +2 байта на кодирование одной инструкции. Могу расказать более подробно, но, повторюсь, я не понял, что тебе нужно.

Добавлено через 2 минуты
Intel manual, там главы 3-4 содержат описание всех инструкций (в т.ч. и их опкоды).
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
10.02.2013, 17:52  [ТС]     Поиск команд ASM #3
Есть игра. К ней можно подключать свою библиотеку.

Я же своей библиотекой вызываю какие угодно функции с движка игры.

Тобиш по сигнатуре функции.

Открываю с помощью IDA mp.dll ( Библиотека игры ) нахожу нужную функцию,ловлю её.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
bool CreateHook()
{
    short pattern[] = {0x53,0x56,0x33,0xDB,0x68,-1,0x39,-1,-1,0x8B,0xF1,0x53,0xE8,-1,-1,0x03,0x00,0x83,0xC4,0x08,0x85,0xC0,0x74,0x0A,0xC6,0x46,0x7E,0x01,0xC6,0x46,0x7F,0x01,0xEB,0x1E};
    
    int pLength = sizeof(pattern)/sizeof(short);
 
    bool findet = false;
 
    HMODULE module;
    if(GetModuleHandleEx(0,(LPCSTR)"mp.dll",&module))
    {
        HANDLE process =  GetCurrentProcess();
        _MODULEINFO moduleInfo;
        
        if(GetModuleInformation(process,module,&moduleInfo,sizeof moduleInfo))
        {
            
            CloseHandle(process);
 
            unsigned char * baseAdress =  (unsigned char *) moduleInfo.lpBaseOfDll;
            DWORD length = moduleInfo.SizeOfImage;
 
            
            for(unsigned int i=0; i <= length - pLength ;i++)
            {
                if (comparePattern(pattern, baseAdress + i, pLength))
                {
                    findet = true;
 
                    pathAddr = baseAdress + i;
                }
                
            }
        }
    }
    else
    {
        SERVER_PRINT("Error locate module mp.dll");
        return false;
    }
 
    if (!findet)
    {
        SERVER_PRINT("Cant find patch!");
        return false;
    }
 
    p = (void (*)(int *))pathAddr;
 
    memcpy((void *)originalBytes, pathAddr, 5);
 
    pathedBytes[0] = 0xE9;
    *((long*)(&pathedBytes[1])) = (char*)HooK__MyFunction - (char*)pathAddr - 5;
 
    DWORD oldProtection;
 
    if(VirtualProtect(pathAddr, 5, PAGE_EXECUTE_READWRITE, &oldProtection))
        return true;
 
    return false;
}
Ну вот и проблема как составить правильную сигнануру.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.02.2013, 10:17     Поиск команд ASM #4
А, вроде понял. Т.е. например в последовательности байт 0xE8, 0x12, 0xA5, 0x00, 0x00 (call sub+_что-то_там со скрина) нужно определить где опкод инструкции call, а где адрес вызываемой процедуры.
Ну да, тут надо знать св-во инструкций. Например в условных переходах "адрес" прыжка на самом деле не адрес, а смещение относительно текущей инструкции. А вот в call как раз адрес, который будет постоянно меняться, т.е. его нужно выкинуть из сигнатуры. Но на самом деле таких инструкций не так много, главное помнить, что адреса в опкодах пишутся после самого опкода инструкции и занимают 4 байта, так что например в вышепреведенном call'e опкод это 0xE8, а адрес процедуры 0x0000A512 (помним про little-endian).

Добавлено через 10 минут
Смотрим Intel manual
Opcode Instruction Description
E8 cd CALL rel32 Call near, relative, displacement relative to next instruction.
Так и есть, опкод 0xE8, но при использовании опкода 0xE8 вместо адреса используется смещение (там есть еще другие опкоды для call, при использовании которых вместо смещения пишется адрес).
Что нам это говорит? А то, что в данном случае смещение для call можно не выкидывать из сигнатуры, т.к. оно не будет менятся при перезагрузке dll.

Цитата Сообщение от Kastaneda Посмотреть сообщение
А вот в call как раз адрес, который будет постоянно меняться
Стоп, я гоню. С чего он менятся то будет в скомпилированом коде? Ни чего меняться не будет, бери байты как есть и все.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
11.02.2013, 10:33  [ТС]     Поиск команд ASM #5
Это всё круто и интересно. Но есть какая нибудь статья,как вызывать функцию из библиотек? Я использую код выше,который мне предоставил друг, сам бы я не написал. Минус кода,что он может вызвать функцию из библиотеки,а именно участок кода походу нет.

Так же не понятно как заблокировать этот участок кода,функцию я легко блочу,просто не вызывая оригинальную,хук функции пустым оставляю.

Я знаю,чтоб заблочить участок кода,нужно заменить какое-то кол-во байт на nop,но как отловить участок кода и какое кол-во байт заблокировать я не знаю.
Yandex
Объявления
11.02.2013, 10:33     Поиск команд ASM
Ответ Создать тему
Опции темы

Текущее время: 01:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru