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

Не понимаю принцип работы ассемблерной команды "cmp" в скрипте


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

Всем привет. Недавно мне понадобился скрипт как замена указателя, который бы самостоятельно находил нужную структуру (с координатами) и выводил все адреса оттуда. Делаю его под проектный майнкрафт (но это не сильно важно), при скане инструкций нашел всего 1 статичную, и работает она более чем с 6к адресами (теперь понятно почему), видимо главная инструкция физики, поэтому нужно сделать хороший фильтр. 

Перейдем сразу к делу, своял скрипт: 

Спойлер

[ENABLE]

aobscan(INJECT,01 59 48 3B 01 C5 FB 11 04 19) // should be unique
alloc(newmem,$1000,INJECT)
label(code)
label(return)
label(Value)
registersymbol(Value)
label(Value1)
registersymbol(Value1)
label(Value2)
registersymbol(Value2)
label(Value3)
registersymbol(Value3)
label(Value4)
registersymbol(Value4)
label(Value5)
registersymbol(Value5)



newmem:
cmp dword ptr [rcx+8],F806436A // (hex) фильтр на порядковый номер ячейки памяти структуры (может измениться при обновлении игры или редко после краша)
cmp dword ptr [rcx+40],5 // фильтр на конец структуры
jne code
add rcx,10 // смещение от начала структуры до 1 координат
mov qword [Value],rcx // запись в метку double значения
add rcx,8 // до 2 координат
mov qword [Value1],rcx // запись в метку
add rcx,8 // до 3 координат
mov qword [Value2],rcx // запись в метку
add rcx,8 // до 4 координат
mov qword [Value3],rcx // запись в метку
add rcx,8 // до 5 координат
mov qword [Value4],rcx // запись в метку
add rcx,8 // до 6 координат
mov qword [Value5],rcx // запись в метку
sub rcx,38 // приводим rcx в изначальное положение чтобы ничего не сломалось



code:
  vmovsd [rcx+rbx],xmm0
  jmp return



Value:
  dq 0 0 0 0
Value1:
  dq 0 0 0 0
Value2:
  dq 0 0 0 0
Value3:
  dq 0 0 0 0
Value4:
  dq 0 0 0 0
Value5:
  dq 0 0 0 0

INJECT+05:
  jmp newmem
return:
registersymbol(INJECT)

[DISABLE]

INJECT+05:
  db C5 FB 11 04 19

unregistersymbol(Value)
unregistersymbol(Value1)
unregistersymbol(Value2)
unregistersymbol(Value3)
unregistersymbol(Value4)
unregistersymbol(Value5)
unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 19995A7A268

19995A7A245: 48 83 C4 10                    - add rsp,10
19995A7A249: 41 0F B7 5D 01                 - movzx ebx,word ptr [r13+01]
19995A7A24E: 48 8B 4D D0                    - mov rcx,[rbp-30]
19995A7A252: C1 E3 02                       - shl ebx,02
19995A7A255: 8B 54 D9 28                    - mov edx,[rcx+rbx*8+28]
19995A7A259: 48 8B 5C D9 20                 - mov rbx,[rcx+rbx*8+20]
19995A7A25E: C1 EA 15                       - shr edx,15
19995A7A261: 83 E2 01                       - and edx,01
19995A7A264: 59                             - pop rcx
19995A7A265: 48 3B 01                       - cmp rax,[rcx]
// ---------- INJECTING HERE ----------
19995A7A268: C5 FB 11 04 19                 - vmovsd [rcx+rbx],xmm0
// ---------- DONE INJECTING  ----------
19995A7A26D: 85 D2                          - test edx,edx
19995A7A26F: 0F 84 06 00 00 00              - je 19995A7A27B
19995A7A275: F0 83 44 24 C0 00              - lock add dword ptr [rsp-40],00
19995A7A27B: 41 0F B6 5D 03                 - movzx ebx,byte ptr [r13+03]
19995A7A280: 49 83 C5 03                    - add r13,03
19995A7A284: 49 BA 20 24 0A 74 00 00 00 00  - mov r10,jvm.dll+D72420
19995A7A28E: 41 FF 24 DA                    - jmp qword ptr [r10+rbx*8]
19995A7A292: 66 0F 1F 44 00 00              - nop word ptr [rax+rax+00]
19995A7A298: 00 00                          - add [rax],al
19995A7A29A: 00 00                          - add [rax],al
}

 

 

Структура, к  которой надо приаттачиться выглядит следующим образом:

  unknown.png?width=400&height=152

 

 

Добавил в таблицу, включил и увидел бред: 

unknown.png?width=400&height=77

 

Начал разбираться что не так, подрубил трассировку на начало кода в newmem и вижу следующее:

 unknown.png?width=400&height=286unknown.png?width=400&height=286 

 

В итоге скрипт всеми силами не хочет замечать нужную структуру, аттачится вообще не туда куда нужно (все 20 раз которые я пробовал), сравнивает данные и делает прыжок на родной код. Если объясните что тут вообще происходит и поможете, буду очень признателен)

P.S. Тему мог запостить в неправильный раздел, если это так, то прошу уточнить.

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

Возможно моя грубейшая в том, что я использовал add вместо mov, поэтому исправил следующим образом:

Спойлер


newmem:
cmp dword ptr [rcx+8],F806436A // фильтр на порядковый номер ячейки памяти структуры (может измениться при обновлении или редко после краша игры)
cmp dword ptr [rcx+40],5 // фильтр на конец структуры
jne code
mov rcx,[rcx+10] // смещение от начала структуры до 1 координат
mov qword [Value],rcx // запись в метку double значения
mov rcx,[rcx+8] // до 2 координат
mov qword [Value1],rcx // запись в метку
mov rcx,[rcx+8] // до 3 координат
mov qword [Value2],rcx // запись в метку
mov rcx,[rcx+8] // до 4 координат
mov qword [Value3],rcx // запись в метку
mov rcx,[rcx+8] // до 5 координат
mov qword [Value4],rcx // запись в метку
mov rcx,[rcx+8] // до 6 координат
mov qword [Value5],rcx // запись в метку
mov rcx,[rcx-38] // приводим rcx в изначальное положение чтобы ничего не сломалось

 

Но в результате получаю вылет спустя 5 секунд после активации скрипта.

 

Я пошел дальше, и решил пересобрать скрипт по топику отсюда (спасибо imaginary)

Получилось вот так:

Спойлер

[ENABLE]


aobscan(INJECT,05 00 00 00 00 00 00 00 6A 43 06 F8 00 00 00 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX 05) // should be unique
alloc(adresspl,100)
label(value)
label(value1)
label(value2)
label(value3)
label(value4)
label(value5)
registersymbol(adresspl)
registersymbol(value)
registersymbol(value1)
registersymbol(value2)
registersymbol(value3)
registersymbol(value4)
registersymbol(value5)

adresspl:
mov eax,INJECT
mov eax,[eax+10]
mov dword [value],eax
mov eax,[eax+8]
mov dword [value1],eax
mov eax,[eax+8]
mov dword [value2],eax
mov eax,[eax+8]
mov dword [value3],eax
mov eax,[eax+8]
mov qword [value4],eax
mov eax,[eax+8]
mov dword [value5],eax
ret

value:
dq 0 0 0
value1:
dq 0 0 0
value2:
dq 0 0 0
value3:
dq 0 0 0
value4:
dq 0 0 0
value5:
dq 0 0 0

createthread(adresspl)
[DISABLE]
dealloc(adresspl)
unregistersymbol(adresspl)
unregistersymbol(value)
unregistersymbol(valuel)
unregistersymbol(value2)
unregistersymbol(value3)
unregistersymbol(value4)
unregistersymbol(value5)

 

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

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

  • Xipho закрыл тема
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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