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

Как сравнить RDX с 8 байтовым числом 0x1455d741f ?


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

Всем привет!

 

Самый идиотский вопрос от меня и да, я на него не знаю ответ
 
Если я в CE пишу
 

cmp rdx, 1455d741f

 
То на деле получаю обрезанное число
 

03C70018 - 48 81 FA 1F745D45     - cmp rdx,455D741F

Т.е. улетела единица не понятно куда и сравнивается совсем другое число.

 

 

Помогите нубу, если не в лом. От этого зависит обход защиты игры ACU.

 

----------

Если писать

cmp    rdx, QWORD 1455d741f

То CE не понимает чего я хочу и выдает ошибку

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

Спасибо.

 

Я короче написал программулину, а там вот так

	int count = 1000;	string nameA = "1000";	void OnGUI()	{		if(GUILayout.Button(nameA))		{			count++;			nameA = count.ToString();			ulong a = 0x1455d741f;			if(a == 0x2455d741f)			{				print("CatchCatch");			}		}	}
 

037EAFE8 - 48 B8 1F745D4501000000 - mov rax,00000001455D741F037EAFF2 - 48 B9 1F745D4502000000 - mov rcx,00000002455D741F037EAFFC - 48 3B C1              - cmp rax,rcx037EAFFF - 75 1A                 - jne 037EB01B037EB001 - B9 50274E05           - mov ecx,054E2750 : [00408A28]037EB006 - 48 83 EC 20           - sub rsp,20037EB00A - 49 BB 3FB07E0300000000 - mov r11,00000000037EB03F : [B94FBCE8]037EB014 - 41 FF D3              - call r11d037EB017 - 48 83 C4 20           - add rsp,20037EB01B - 48 8B 75 F8           - mov rsi,[rbp-08]037EB01F - C9                    - leave 037EB020 - C3                    - ret 
Т.е. в регистр можно записать большое число и потом сравнивать.

 

Мне нужен самый короткий вариант. Попробую все варианты.

Может так:

push rcxmov rcx,ACU.exeadd rcx,55d741fcmp rdx,rcxpop rcx
 

Слишком емко, но вариант рабочий.

 

 

Попробуй так

cmp rdx,ACU.exe+55D741F
Впринципи так не должен ругаться СЕ
 

Не ругается, но та же фигня. Режет...

 

 

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

 

[ENABLE]alloc(checkCRC, 2048)label(checkCRCCode)registersymbol(checkCRCCode)label(x1)label(x2)label(x3)label(x4)label(x5)label(x6)label(x7)label(x8)label(x9)label(x10)label(x11)label(x12)label(x13)label(x14)label(x15)label(x16)label(x17)label(x18)label(x19)label(x20)label(x21)label(x22)label(x23)label(x24)checkCRC:db 32 02 F9 E9 9C 06 00 00db 32 02 F6 C3 9Bdb 32 02 F5 A8 3Fdb 8B 53 28 03 43 38checkCRCCode://cmp	rdx, QWORD PTR 1455d741fcmp rdx,ACU.exe+55D741Fcmp rdx, 1455d741fje x1cmp rdx,1455d7420je x2cmp rdx,1455d7421je x3cmp rdx,1455d7422je x4cmp rdx,1455d7423je x5cmp rdx,1455d7424je x6cmp rdx,1455d7425je x7cmp rdx,1455d7426je x8cmp rdx,1455d658fje x9cmp rdx,1455d6590je x10cmp rdx,1455d6591je x11cmp rdx,1455d6592je x12cmp rdx,1455d6593je x13cmp rdx,140007f48je x14cmp rdx,140007f49je x15cmp rdx,140007f4aje x16cmp rdx,140007f4bje x17cmp rdx,140007f4cje x18cmp rdx,140fab5beje x19cmp rdx,140fab5bfje x20cmp rdx,140fab5c0je x21cmp rdx,140fab5c1je x22cmp rdx,140fab5c2je x23cmp rdx,140fab5c3je x24retx1:xor al,[checkCRC+0]retx2:xor al,[checkCRC+1]retx3:xor al,[checkCRC+2]retx4:xor al,[checkCRC+3]retx5:xor al,[checkCRC+4]retx6:xor al,[checkCRC+5]retx7:xor al,[checkCRC+6]retx8:xor al,[checkCRC+7]retx9:xor al,[checkCRC+8]retx10:xor al,[checkCRC+9]retx11:xor al,[checkCRC+10]retx12:xor al,[checkCRC+11]retx13:xor al,[checkCRC+12]retx14:xor al,[checkCRC+13]retx15:xor al,[checkCRC+14]retx16:xor al,[checkCRC+15]retx17:xor al,[checkCRC+16]retx18:xor al,[checkCRC+17]retx19:xor al,[checkCRC+18]retx20:xor al,[checkCRC+19]retx21:xor al,[checkCRC+20]retx22:xor al,[checkCRC+21]retx23:xor al,[checkCRC+22]retx24:xor al,[checkCRC+23]ret[DISABLE]dealloc(checkCRC)
Ссылка на комментарий
Поделиться на другие сайты

Есть такое предложение, а что если выделить участок памяти и уже туда принудительно перенаправлять инъекцию скрипта.

Тоесть копируем код и заставляем его работать на выделенном участке памяти.

Такой вариант может сработать без вылетов...

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

Есть такое предложение

Dison, ты как будто велосипед изобрёл - мы в каждом скрипте, который пишем, именно это и делаем. 

 

Решение в обходе защиты: либо 1-ый вариант - увести от проверки, т.е. найти все прыжки на проверки и изменить прыг, чтобы не попадать на проверку; либо 2-ой вариант - подсовывать проверяющим инструкциям всегда байты оригинальных инструкций.

 

Вот MasterGH и пытается решить эти варианты.

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

Есть такое предложение, а что если выделить участок памяти и уже туда принудительно перенаправлять инъекцию скрипта.

Тоесть копируем код и заставляем его работать на выделенном участке памяти.

Такой вариант может сработать без вылетов...

Тут тема плагина, а не ACU. Пишите в тему ACU

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

MasterGHXipho прав - нули работают:

mov RDX,000000014771634A

Для "mov RDX, адрес" нули дописывать не обязательно, а с "CMP RDX, адрес" хоть обнулись - не прокатит. Да и MOV меня здесь не интересовал, а только CMP.

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

а с "CMP RDX, адрес" хоть обнулись - не прокатит

Понято, тогда остаётся наверное только та длинная запись с push/pop из 2-го поста.

Вот кое-что нашёл по 64-битным числам, может это подойдёт:

[spoiler=Взято отсюда: http://www.cyberforum.ru/post5356780.html]Команда CMPXCHG8B

(Сравнение и обмен 8 байтов = ”COMPARE and EXCHANGE 8 Bytes”)

Синтаксис команды: CMPXCHG8B m8byte

Семантика команды: выполнение в одной операции сравнения и обмен 8-байтовых операндов. Команда требует один операнд m8byte и неявным образом использует еще два операнда – пары регистров EDX:EAX и ECX:EBX. В качестве явного операнда команды m8byte может выступать только 64-битная (8-байтовая) ячейка памяти. Команда выполняет сравнение операнда m8byte в памяти с содержимым EDX:EAX. Если сравниваемые значения совпадают, то операнд DEST в памяти замещается 64-битным значением ECX:EBX. Если сравниваемые значения не совпадают, содержимое памяти поступает в пару регистров EDX:EAX, замещая сравниваемый операнд DEST.

 

Пример 1

Код ASM

1 mem dq 1122334455667788h

2 mov ECX, 9

3 mov EBX, 5

4 mov EDX, 11223344h

5 mov EAX, 55667788h

6 cmpxchg8b mem ;[mem]=EDX:EAX ECX:EBX->[mem]

7 ;mem=0000000900000005h

 

Пример 2

Код ASM

1 mem dq 1122334455667788h

2 mov EAX, 9

3 mov EDX, 5

4 cmpxchg8b mem ;[mem]<>EDX:EAX [mem]->EDX:EAX

5 ;mem=1122334455667788h

6 ;EDX=11223344h EAX=55667788h

 

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

 

Пример 3

Код ASM

1 mem1 db ‘12345678’;строка операнд

2 mem2 db ‘12345678’;сравниваемая строка

3 mov ECX, 68676665h ;’efgh’

4 mov EBX, 64636261h ;’abcd’

5 mov EDX,dword ptr mem2+4;забираем старшую часть строки

6 mov EAX,dword ptr mem2;забираем младшую часть строки

7 cmpxchg8b qword ptr mem1;операнды совпадают

8 ;mem1=’abcdefgh’ ZF=1 ECX:EBX и EDX:EAX без изменений

 

Пример 4

Код ASM

1 mem1 db ‘12345678’;строка операнд

2 mem2 db ‘abcdefgh’;сравниваемая строка

3 mov ecx, 68676665h ;’efgh’

4 mov ebx, 64636261h ;’abcd’

5 mov edx,dword ptr mem2+4;забираем старшую часть строки

6 mov eax, dword ptr mem2;забираем младшую часть строки

7 cmpxchg8b qword ptr mem1 ;операнды не совпадают

8 ;ZF=0 edx=38373635=’5678’eax=34333231=’1234’

9 ;mem1 без изменений, при неравенстве

10 ; ecx:ebx не принимают участие в операции

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

Для "mov RDX, адрес" нули дописывать не обязательно, а с "CMP RDX, адрес" хоть обнулись - не прокатит. Да и MOV меня здесь не интересовал, а только CMP.

Стоп, а если cmp qword ptr?

А еще вот тут - я нашел интересную инструкцию cmpeq

Тут описание, например.

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

Ни одна инструкция не компилируется

 

cmp rdx, qword ptr 1455d741fcmp rdx, qword 1455d741fcmp rdx, qword ptr [1455d741f]cmp rdx, [1455d741f]
Зато компилируется 4-х байтовое число

cmp rdx,[455D741F]cmp rdx, qword ptr [455d741f]; будет например 01150026 - 48 3B 14 25 1F745D45  - cmp rdx,[455D741F]
Можно например через стек

 

push 4 байтаpush 4 байта; или push qword[метка]; или mov rax, большое число и push raxcmp rdx, [esp]sub rsp,8 ; правим указатель на стек
А "cmpeq" это не инструкция, а обозначение группы инструкций сравнения со схожем корнем "cmpeq" из набора SIMD.

 

Из документа 64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf, который можно найти официальном сайте Интел

PCMPEQB/PCMPEQW/PCMPEQD— Compare Packed Data for Equal PCMPEQQ — Compare Packed Qword Data for EqualPCMPESTRI — Packed Compare Explicit Length Strings, Return IndexPCMPESTRM — Packed Compare Explicit Length Strings, Return MaskPCMPGTB/PCMPGTW/PCMPGTD—Compare Packed Signed Integers for Greater ThanPCMPGTQ — Compare Packed Data for Greater ThanPCMPISTRI — Packed Compare Implicit Length Strings, Return IndexPCMPISTRM — Packed Compare Implicit Length Strings, Return Mask
 

Я не нашел ни одного способа сравнить большой число с "cmpeq". Да и работает уже со 128 разрядными и меньше регистрами и на мой взгляд только усложняет.

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

Так, погодите-ка. В х64 блокноте затестил вот такой скрипт:

{ Game   : notepad.exe  Version:   Date   : 2015-05-04  Author : Xipho  This script does blah blah blah}[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(INJECT,notepad.exe,48 83 EC 28 E8 F7 FD FF FF) // should be uniquealloc(newmem,$1000,"notepad.exe"+2BF0)label(code)label(return)label(val)newmem:code:  cmp qword ptr [val],rdx  sub rsp,28  call notepad.exe+29F0  jmp returnval:dq 455d741fINJECT:  jmp code  nop  nop  nop  nopreturn:registersymbol(INJECT)[DISABLE]//code from here till the end of the code will be used to disable the cheatINJECT:  db 48 83 EC 28 E8 F7 FD FF FFunregistersymbol(INJECT)dealloc(newmem)

Но поскольку в памяти число лежит задом наперед, проверить, точно ли там 8-байтное число не представляется возможным. Проверяйте.


Добавлено:

Кстати, еще один момент вспомнил - если не получается сравнить с 8-байтами, то вполне возможно взять младшую часть rdx, в которой будет четырехбайтное число 455d741f. То есть, попросту сравнивать

cmp edx,455d741f

Попробуйте и этот момент, у кого время есть.

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

Понятно, короче можно юзать по шаблону

//...cmp qword ptr [label1],rdxje x1cmp qword ptr [label2],rdxje x2cmp qword ptr [labelN],rdxje xN//...x1://...x2//...xN://...//...label1:dq 1455d741flabel2:dq 00000000labelN:dq 00000000//...
Ссылка на комментарий
Поделиться на другие сайты

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

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

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