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

Как использовать в фильтре (ассемблер СЕ) текстовую строку.


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

Очень часто при поиске фильтра в структуре, можно было бы использовать текст (как ID), но не знаю точно как это использовать в скрипте:

Допустим:

cmp [eax+08],'itemplace'j.....................

но компилятор СЕ на такую строчку ругается и не кушает.

Понимаю что перед [eax+08] нужно поставить "???? ptr", но что поставить вместо ???? не знаю.

Нагуглить не сумел.

 

Подскажите..... Плиз....

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

Привет!

 

Текстовые строки напрямую не сравниваются, тут используется адресация, т.е. нужен указатель на строку. Как вариант решения "в лоб" - найди кусочек памяти и в скрипте через оператор DB впиши туда строчку, а в CMP после этого подставляй адрес памяти, где строка лежит. Я так понимаю, она должна быть 0-terminated, т.е. оканчиваться нулем, но могу тут ошибаться. Второй вариант - если в игре такая строка используется, то можно воспользоваться поиском в памяти игры с указанием типа "String", и использовать этот адрес.

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

Не понял - почему нельзя.

Вот допустим пример:

Весь скрипт здесь.

keng, всё работает, вот сейчас написал скрипт:

Но если текст не больше 4 байт.

А если больше допустим 10 байт - Понимаю что перед [eax+34] нужно будет поставить "???? ptr", но что поставить вместо ???? не знаю.

Если 8 байт наверное будет так cmp qword ptr [eax+34],'sKilsKil'

cmp [rcx+d4],'MONE'je franklincmp [rcx+134],'MONE'je michaelcmp [rcx+94],'MONE'je trevorjmp originalcodemichael:cmp [rcx+144],'LOTH'je gojmp originalcodefranklin:cmp [rcx+e4],'LOTH'je gojmp originalcodetrevor:cmp [rcx+a4],'LOTH'je gojmp originalcode 
[ENABLE]alloc(newMem, 2048)label(returnHere)newMem:cmp [eax+34],'sKil'jne @fmov [eax+08],00000000mov [eax+0C],40240000@@:mov ecx,[eax+08]mov [edx+08],ecxjmp returnHereGame.exe+113B69:jmp newMemnopreturnHere:[DISABLE]Game.exe+113B69:mov ecx,[eax+08]mov [edx+08],ecxdealloc(newMem) 
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

 

Я думаю, что сравнение строк ни чем не отличается от сравнения двух последовательностей байтов по двум адресам. О том как сравнивать строки и байты по двум адресам в Гугле много информации.

stringtocompare:  db 'a string'  ...  ...  check:  //store the registers that get changed  pushfd  push esi  push edi  push ecx  mov esi,stringtocompare  mov edi,[eax+20c] //edi get the pointer to the string you wish to check (use lea if the address itself)  mov ecx,8 //number of characters in the string  check_loop:  mov al,[esi]  cmp [edi],al  jne incorrect  inc edi  inc esi  loop check_loop //as long as ecx>0 jump to check_loop (loop decreases ecx for you)  //if it reaches here, the string is a match  //do stuff  jmp exit  incorrect:  //do incorrect handling  exit:  //restore the changed registers  pop ecx  pop edi  pop esi  popfd  ...your exit handling...
Ссылка на комментарий
Поделиться на другие сайты

MasterGH и Xipho, спасибо.

В скрипте решил не париться, а проверять первые четыре байта текста в Hex и фильтр сработал как надо.

Но Ваша информация тоже пригодиться. 

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

Не понял - почему нельзя.

Вот допустим пример:

Весь скрипт здесь.

keng, всё работает, вот сейчас написал скрипт:

Но если текст не больше 4 байт.

А если больше допустим 10 байт - Понимаю что перед [eax+34] нужно будет поставить "???? ptr", но что поставить вместо ???? не знаю.

Если 8 байт наверное будет так cmp qword ptr [eax+34],'sKilsKil'

Уооооу, это из гэтэа фиве? А что это за функция такая?

cmp [rcx+d4],'MONE'je franklincmp [rcx+134],'MONE'je michaelcmp [rcx+94],'MONE'je trevorjmp originalcodemichael:cmp [rcx+144],'LOTH'je gojmp originalcodefranklin:cmp [rcx+e4],'LOTH'je gojmp originalcodetrevor:cmp [rcx+a4],'LOTH'je gojmp originalcode 
[ENABLE]alloc(newMem, 2048)label(returnHere)newMem:cmp [eax+34],'sKil'jne @fmov [eax+08],00000000mov [eax+0C],40240000@@:mov ecx,[eax+08]mov [edx+08],ecxjmp returnHereGame.exe+113B69:jmp newMemnopreturnHere:[DISABLE]Game.exe+113B69:mov ecx,[eax+08]mov [edx+08],ecxdealloc(newMem) 
Ссылка на комментарий
Поделиться на другие сайты

cmps для больших строк:

mov ecx,5 ;sizemov edx,ecxmov esi,string1mov edi,string2shr ecx,2and edx,3rep cmpsdmov ecx,edxrep cmpsbjnz @f...@@:

cmps для небольших строк:

mov ecx,5 ;sizemov esi,string1mov edi,string2rep cmpsbjnz @f...@@:

хмм strcmp из msvcrt.dll быстрее cmps в ~2 раза

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

Уооооу, это из гэтэа фиве? А что это за функция такая?

нет это из другой игры, а ссылку на код Vlad2 дал для примера.

 

cmps для больших строк:

cmps для небольших строк:

Спасибо.

Только теперь придётся читать про новые для меня опкоды: shr, and, rep.

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

Спасибо. Только теперь придётся читать про новые для меня опкоды: shr, and, rep.

кст если размер "строки" известен, можно без shr/and

например размер инфы 9:

mov ecx,8 ;sizemov esi,string1mov edi,string2rep cmpsdmov ecx,1rep cmpsbjnz @f...@@:
Ссылка на комментарий
Поделиться на другие сайты

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

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

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