Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pEntity
12 / 7 / 1
Регистрация: 12.12.2012
Сообщений: 433
#1

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

10.02.2013, 17:07. Просмотров 772. Ответов 4
Метки нет (Все метки)

Здравствуйте.

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

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



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

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 ),но я не изучал ассамблер и делаю под копирку с других статей или гуглю эту команду,которую не знаю,но не всегда нагугливается нужное.Вопрос заключается в том,где можно посмотреть весь список команд ? Гугл конкретного чего-то не дает.. Или не так гуглил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2013, 17:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск команд ASM (C++):

c++ asm - C++
_asm {} какие библиотеки нужно подключать , чтобы заставить работать ассемблер на с++ и как правильно записывать всё это дело ...

C++ И ASM - C++
Всем привет. Мне нужно создать функцию на С++, но особенную. Мне нужно, чтобы она была пустая, при void Func(){}, компилятор уже...

C++ и ASM - C++
Всем привет. Необходимо посчитать уравнение на языке ASM и вывести ответ на языке С++. Вот готовая программа на ASM с выводом на...

asm в VS - C++
вот такой код не работает. строит нормально, но во время запуска выводит "необр. искл" пытаюсь запустить слип() #include <Windows.h> ...

Asm + C++ - C++
Помогите на C++ считает нормально , а на asm #include<iostream> #include<stdio.h> #include <iomanip> using namespace std; bool...

c++ и ASM - C++
помогите найти ошибку #pragma once #include <stdlib.h> #include <iostream> class bbyte { private: void...

4
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
10.02.2013, 17:40 #2
Цитата Сообщение от pEntity Посмотреть сообщение
Вопрос заключается в том,где можно посмотреть весь список команд ?
Правильно говорить "инструкций". Все инструкции описаны в Intel manual.
Вообще не совсем понял, чем ты занимаешся. Если тебе нужны опкоды инструкций, то их можно найти там же, НО нужно понимать, что для кодирования инструкции также может применяться т.н. ModR/M байт и далее может (но не обязан) следовать т.н. sib - байт. Итого +2 байта на кодирование одной инструкции. Могу расказать более подробно, но, повторюсь, я не понял, что тебе нужно.

Добавлено через 2 минуты
Intel manual, там главы 3-4 содержат описание всех инструкций (в т.ч. и их опкоды).
1
pEntity
12 / 7 / 1
Регистрация: 12.12.2012
Сообщений: 433
10.02.2013, 17:52  [ТС] #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;
}
Ну вот и проблема как составить правильную сигнануру.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
11.02.2013, 10:17 #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 как раз адрес, который будет постоянно меняться
Стоп, я гоню. С чего он менятся то будет в скомпилированом коде? Ни чего меняться не будет, бери байты как есть и все.
1
pEntity
12 / 7 / 1
Регистрация: 12.12.2012
Сообщений: 433
11.02.2013, 10:33  [ТС] #5
Это всё круто и интересно. Но есть какая нибудь статья,как вызывать функцию из библиотек? Я использую код выше,который мне предоставил друг, сам бы я не написал. Минус кода,что он может вызвать функцию из библиотеки,а именно участок кода походу нет.

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

Я знаю,чтоб заблочить участок кода,нужно заменить какое-то кол-во байт на nop,но как отловить участок кода и какое кол-во байт заблокировать я не знаю.
0
11.02.2013, 10:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 10:33
Привет! Вот еще темы с ответами:

asm вставка в C++ - C++
#include &lt;iostream&gt; int a = 10; void func( int&amp; aIn ) { __asm { mov aIn, 15 } }

Интерпретатор(asm) - C++
Хотел бы услышать советы по написанию интерпретатора языка ассемблер.

Прерывания asm - C++
Не могу использовать прерывания(int) в встроенном ассемблере. Вылезает ошибка доступа. Помогите пожалуйста помогите.

Вставка asm в С++ - C++
Здравствуйте! Помогите пожалуйста! Задание: Вычислить арифметическое выражение. Требуется написать функцию на языке C++ с вставкой на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru