210 / 202 / 43
Регистрация: 12.12.2012
Сообщений: 1,835
1

Поиск команд ASM

10.02.2013, 17:07. Показов 1304. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2013, 17:07
Ответы с готовыми решениями:

Синтаксис ASM команд (ATtiny2313)
Здравствуйте. Разбираю код для мк ATtiny2313 и не понимаю эти строки: ;ir1.mpas,17 :: begin...

Поиск подстроки в строке на ASM-е в Philips LCP2292 (ARM 7 TDMI)
Доброго времени суток, есть прога на ассемблере masm32 под windows по поиску подстроки в строке...

Создание проекта с участием c++ и asm модулей. Ошибка asm модуля
Доброго времени суток! Подскажите, пожалуйста, как исправить данную ошибку (А2008)?

Delphi и ASM - не работает вызов функции Invoke через asm
В Delphi не работает вызов функции Invoke через asm. часть кода: asm invoke...

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

Добавлено через 2 минуты
Intel manual, там главы 3-4 содержат описание всех инструкций (в т.ч. и их опкоды).
1
210 / 202 / 43
Регистрация: 12.12.2012
Сообщений: 1,835
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
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,006
Записей в блоге: 2
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
210 / 202 / 43
Регистрация: 12.12.2012
Сообщений: 1,835
11.02.2013, 10:33  [ТС] 5
Это всё круто и интересно. Но есть какая нибудь статья,как вызывать функцию из библиотек? Я использую код выше,который мне предоставил друг, сам бы я не написал. Минус кода,что он может вызвать функцию из библиотеки,а именно участок кода походу нет.

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

Я знаю,чтоб заблочить участок кода,нужно заменить какое-то кол-во байт на nop,но как отловить участок кода и какое кол-во байт заблокировать я не знаю.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2013, 10:33

Поиск всех команд имеюющий данний текст + создание лабела
Люди помогите осуществить пожалуста Окно программы IP адрес Кнопка...

pascal+asm, не подключается модуль asm
Не получается подключить модуль ассмблера ( находится в каталоге с .pas)). Для примера взял...

ASM atmega написать программу на ASM
Нужна помощь в написании программы с объяснениями.. Проверить свою программу Вашу работу. ...

Временно отменить добавление команд в очередь команд диалогового окна
Добрый день, уважаемые программисты! Начнём по порядку... Я пишу оконное приложение на WinApi,...


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

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

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