Перейти к содержанию

Memory Hacking Software (MHS)


Рекомендуемые сообщения

1. Мощный поиск адресов в памяти

Привет. В этой теме я опишу как настроить и как пользоваться мощным поиском MHS - Expression Search.

Поиск Expression Search является поиском в котором можно задавать множество различных правил сканирования и отсеивания адресов с применим логических, математических операторов. Также операторов обращения к адресу и операторов типа данных. Поиск очень мощный =)

Выражаю благодарности: L. Spiro, WhiteHat, CoMPMStR и в частности Recifense за то ,что они как и всем в частности и мне помогли приобрести необходимые навыки.

А теперь поехали...

Настройка

Если у вас процессор с более чем одним ядром и в поиске вы используете скобки [], то чтобы поиск работал без вылетов в синий экран снимите опции отключающие функции ядра ОС в настройках программы.

Операторы

  • [*:2btzni4v]Math
    - (minus) 34 - 3
    + (plus) 60 + 4
    * (multiplication) 32 * 23
    / (division) 1024 / 32
    % (modulus) 512 % 8
    [*:2btzni4v]Unary Prefixes
    - (unary negation) -120
    + (unary positive) +56
    ! (unary NOT) !90
    ~ (unary one’s compliment) ~32
    [*:2btzni4v]Bitwise Operators
    & (bitwise AND) 67 & 15
    | (bitwise OR) 1024 | 1
    ^ (bitwise XOR) 37 ^ 1
    << (bitwise shift left) 1 << 3
    >> (bitwise shift right) 16 >> 4
    [*:2btzni4v]Equality Operators
    < (less than) 1 < 0
    > (greater than) 1 > 0
    <= (less than or equal) 67 <= 90
    >= (greater than or equal) 89 >= 50
    == (equals) 45 == 32
    != (not equal to) 45 != 32
    [*:2btzni4v]Logical Operators
    && (AND) 45 && 32
    || (OR) 0 || 23

Типы

b[ ] gets a byte value.

w[ ] gets a word value.

[ ] (no prefix) gets a dword value.

q[ ] gets qword value.

f[ ] gets a float value.

d[ ] gets a double value.

Основные приёмы.

?? > 0 && ?? <= 100

(?? >= 'a' && ?? <= 'z') || (?? >= 'A' && ?? <= 'Z')

Два знака вопроса означает поиск адресов значение которых соответствует заданной форме поиска.

[??] == 100

[[[[??]]+7Ch]+190h] == 1.0f

f[[[[??]]+7Ch]+190h] >= 0.01f && f[[[[??]]+7Ch]+190h] <= 1.0f

Два знака вопроса находящихся в скобках означает поиск указателя.

Практических приемов поиска я к сожалению пока не поднакопил, могу дать только теорию.

Допустим мы с вами знаем цепочку указателей

[[[RE5DX9.exe+0xE76E1C]+0x24]+0x1364] =[08524686]= 1000,0 здоровья

Зададим условия поиска:

Expression : [??+0x24]+0x1364==08524686

Treat ?? (Current Value) As : Pointer

Alignment : 4

Отсеянные зеленные адреса будут представлять бОльшую заинтересованность и проверив один из них мы получим [[static Address]+0x24]+0x1364.

На этом пока всё...

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

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Пример использования MHS скрипта при заморозке

intromhsscripts.gif

Объявляем пару переменных через extern. Может можно и без extern я ещё не проверял. Далее по смещению от адреса (на котором делаем скрипт) берём другой адрес. Затем значении другого адреса пишем в первоначальные. Всё просто. Не забываем включить галочку.

ЕСЛИ объявляем адреса переменные через extern, то они будут работать с адресам в процессе.

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Тема. Мощные MHS С-скрипты.

Цель этого туториала, показать как работать со скриптами в MHS, которые активируются по горячим клавишам. Ну а также привлечь внимание читателя к этим скриптам.

В С- скрипте мы можем привести некоторый адрес игры к заданной структуре и работать с ней уже на C-коде. Очень жаль что нельзя создавать классы и приводить игровые объекты к этим классам (была бы очень мощная штука - поверьте мне).

Мы познакомимся с функций PrintF(), которая будет выводить в консоль некоторые данные. Кто не знает язык С, тем учить!   :)

Подопытный кролик будет XP-шный сапёр (для него уже было решение на Дельфи). Мы сделаем одно задание - вывод на консоль информации о расположении мин. Решение этого задания находится в справке, но тем не менее решение я напишу на русском языке. По сравнению с решением на Дельфи, этот скрипт избавит вас от поиска процесса сапёра.

Итак

1) Запускаем сапёра. 

2) Находим адреса кол-ва мин по высоте и по ширине. 

3) Находим массив в котором располагаются мины.

4) Tools->Script Editor.

Создаём новый скрипт (сохраняя его в какой-нибудь файл и компилируем по F5)

VOID ShowMineSweeperBoard() {
    extern struct BOARDSIZE {
        INT iWidth;
        INT iHeight;
    }               g_bwSize            = { "winmine.exe", 0x5334 };  
    extern BYTE     g_pbBoard[32*32]    = { "winmine.exe", 0x5361 };  

    CHAR * pcRow = Malloc( g_bwSize.iWidth + 1 );                

    PrintF( "%d?%d", g_bwSize.iWidth, g_bwSize.iHeight );    
    for ( INT J = 0; J < g_bwSize.iHeight; J++ ) {
        for ( INT I = 0; I < g_bwSize.iWidth; I++ ) {
            pcRow[I] = (g_pbBoard[(32*J)+I] & 0x80) ? '1' : '0';  
        }
        pcRow[g_bwSize.iWidth] = '\0';            
        PrintF( pcRow );
    }
    Free( pcRow );
}

VOID On_HK_23( DWORD dw1, DWORD dw2 ) {
    Clear();
    ShowMineSweeperBoard();
}

5) Tools->Hotkeys и вводим там параметры

post-3-1280128262,74_thumb.png

6) Нажимаем F2 и видим в консоли ответ: там где находятся единицы там мины.

post-3-1280128443,62_thumb.png

Справочная информация:

У каждой ячейки есть свой номер, по которому происходит отображение: пустых клеток, мин, количество мин и т.п. 

post-3-1280128719,64_thumb.png

Если вы желаете, то можете открыть все мины поменяв пустые клетки на флажки. А затем вам стоит только кликнуть на рожицу и вы выиграете. Конечно, для этого нужно писать свой алгоритм. Есть и вариант сделать выигрышь просто кликнув на рожицу не зависимо от того открыли ли вы все мины...

Итак что же даёт скрипт MHS.

Если вы посмотрите справку, то там вы увидите что есть разное применении С-скрипта. Правила поиска, правила заморозки, множество поддерживаемых функций с памятью, процессами, регистарми, работы с отладчиком и дизассемблером. Область примирения очень обширная. Чтобы сузить эту область применения, наверно, стоит размышлять о том как можно с помощью C-скрипта реализовать тот или иной чит-код. Прежде всего С-кодом можно работать со структурами и ссылками на эти или другие структуры. Поиск в этих структурах данных и составление логических действий. Во всяком случае я полагаю, что область эта ещё не очень изучена нами. Обычно, нам хватает ассемблерного отладочного кода как инъекции....   

Ссылка на комментарий
Поделиться на другие сайты

Тема. Поворот камеры в игровом мире (на английском, автор L. Spiro).

#1: Creating the full view matrix.


CVector3 vTarget = vEnemyPos - vYourPos;

// Get the up and right vectors.  Get the right vector by using the world-axis up vector.
CVector3 vUp( 0.0f, 1.0f, 0.0f );
CVector3 vRight = vTarget.Cross( vUp );

// The up vector is the cross of the right and forward.
vUp = vRight.Cross( vTarget );


// Normalize all of the vectors.
vTarget.Normalize();
vUp.Normalize();
vRight.Normalize();


// Create the view matrix.
mMatrix._11 = vRight.x;
mMatrix._12 = vRight.y;
mMatrix._13 = vRight.z;
mMatrix._14 = 0.0f;

mMatrix._21 = vUp.x;
mMatrix._22 = vUp.y;
mMatrix._23 = vUp.z;
mMatrix._24 = 0.0f;

mMatrix._31 = vTarget.x;
mMatrix._32 = vTarget.y;
mMatrix._33 = vTarget.z;
mMatrix._34 = 0.0f;

mMatrix._41 = vYourPos.x;
mMatrix._42 = vYourPos.y;
mMatrix._43 = vYourPos.z;
mMatrix._44 = 1.0f;
// Create a forward vector.  Looking at the enemy.

If the perspective matrix causes the view to look down -Z instead of Z, you will have to invert the target vector using the following as the first line instead:

CVector3 vTarget = vYourPos - vEnemyPos;

The matrix is in DirectX format (row-major). Transpose for OpenGL. Y is assumed to be up.

#2: Just modifying your player’s facing direction.

You have 2 values representing the direction your player is facing. These are Cartesian coordinates. The values you have are useless. The only thing we need to know is that the player has Cartesian values to describe the direction it is facing.

Again you need to create a vector to look at the target. But instead of converting it to a matrix we convert it to Cartesian coordinates. As you remember from 3rd grade elementary school, you can convert a directional vector to Cartesian coordinates via the following (assuming Y is up).


   _fHor = ::fatan2( _vVector.z, _vVector.x );
   float fLen = _vVector.Len();
   if ( fLen == 0.0f ) {
      _fVert = 1.5707963267948966192313216916398f; // Half PI.
   }
   else {
      _fVert = ::acosf( _vVector.y / fLen );
   }
}
void VectorToCartesian( const CVector3 &_vVector, float &_fHor, float &_fVert ) {

With that elementary utility function it is pre-school to perform this task.


CVector3 vTarget = vEnemyPos - vYourPos;

// Convert to Cartesian to overwrite the RAM in the player block.
float fH, fV;
VectorToCartesian( vTarget, fH, fV );
// Create a forward vector.  Looking at the enemy.

fH and fV will be the values to overwrite in your player block.

Again it may cause you to look away from the target, in which case you reverse the first line of code (again).

Again Y = up.

Ссылка на комментарий
Поделиться на другие сайты

Выликий Code Filter

Фантазии Эль Спиро можно позавидовать в создании такой функции как Code Filter. Её можно найти по пути: Tools->Code Filter  из главного окна или через окно дизассемблера (путь надеюсь сами найдёте).

Принцип следующий (см. на скрин)

post-3-1280662497,95_thumb.png

Мы перехватываем функции, которые работают в какое-то время. На рисунке я сделал три папки выполнения кода в во времени:

1) Работа окна - при этом я нажимал на клетки мин мышкой, но отпускал за пределами окна игры, таким образом не влиял на количество мин.

2) Уменьшение мин - когда ставим флажок

3) Увеличение мин - когда снимаем флажок

Каждая последующая папка(т.е. фильтр) в группе исключает фильтры предыдущие. Можно ставить/снимать галочку на/с пункт/а контекстного меню "Exclude Results" для установления фильтров. Там же View Results покажет результат того или иного фильтра. Ну короче там всё просто.

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

post-3-1280662497,68_thumb.png

В общем я описал как это дело работает. Кому нужно за подробностями, то они находятся в справке MHS.

Что даёт функция  Code Filter

С помощью неё можно установить причинно следственные связи между работой функций и какими-то входными/возвращаемыми данными :)

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Тема. Управление игровыми персонажами скриптами MHS.

Заставим Марио бежать и попрыгать при этом.

post-3-1286358562,15_thumb.png

Для этого нужно воспользоваться следующим скриптом.


void send_key_loop (char * pChar, int loop, int wait1, int wait2){
   int counter;
   short letterke ;
   int iLength = StrLen( pChar );
  
   for ( counter = 0; counter < loop ; counter++ )
      {
       letterke = VkKeyScan( pChar[0] );
       KeyboardEvent(letterke,0 );
       Sleep(wait1);
       KeyboardEvent(letterke,KEYEVENTF_KEYUP);
       Sleep(wait2);
      }
}

VOID On_HK_23( DWORD dw1, DWORD dw2 ) {
    //Clear();
    CHAR * pCharJamp = Malloc(12);  
    pCharJamp = "c\0";
  
    // Удерживаем вправо 1 секунду - разгоняемся
    KeyboardEvent(VK_RIGHT,0);
    Sleep(1000); // разгончик!
    // Подпрыгиваем три раза!
    send_key_loop(pCharJamp,3,1000,1000);
    // Останавливаеся
    KeyboardEvent(VK_RIGHT,KEYEVENTF_KEYUP);  
      
    PrintF("Попрыгали");
    Free(pCharJamp);
}

Этот скрипт можно связать с горячей клавишей, например, с "J" как это было показано выше в постах. Теперь если нажать на J, то Марио выполнит разбег и три прыжка. Этот пример показывает что MHS может посылать нажатия клавиш DirectX-приложениям в том числе. 

К этому добавлю, что можно написать скрипт чтения нажатий клавишь с сохранением в память или файл. Затем эти нажатия можно эмулировать с различными поправками. С игрой Марио, например, можно записывать каждое прохождение и если Марио погибает, то предыдущее прохождение можно повторить автоматически :) Ну а самое интересное это сделать так чтобы Марио сам проходил игру.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.