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

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

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

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

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

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

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

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

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
Посмотрите здесь:

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

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

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

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

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

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

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

Добавлено через 2 минуты
Intel manual, там главы 3-4 содержат описание всех инструкций (в т.ч. и их опкоды).
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 386
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
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 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 как раз адрес, который будет постоянно меняться
Стоп, я гоню. С чего он менятся то будет в скомпилированом коде? Ни чего меняться не будет, бери байты как есть и все.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 10:33     Поиск команд ASM
Еще ссылки по теме:

asm вставка в C++ - C++
есть код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; slozh(int* pi1, int...

C++ + ASM FASM - C++
Всем привет. Можно ли в с++ коде вызывать функции написанные на FASM синтаксисе? Visual Studio 2012

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

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

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

Asm в Builder - C++
Делаю ассемблеровскую вставку в Builder 6; в консоле. Проблема в 14 строке int main(int argc, _TCHAR* argv) { short S, R, Q; ...


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

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

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

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

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