Garik66 Опубликовано 18 апреля, 2015 Поделиться Опубликовано 18 апреля, 2015 Очень часто при поиске фильтра в структуре, можно было бы использовать текст (как ID), но не знаю точно как это использовать в скрипте:Допустим:cmp [eax+08],'itemplace'j.....................но компилятор СЕ на такую строчку ругается и не кушает.Понимаю что перед [eax+08] нужно поставить "???? ptr", но что поставить вместо ???? не знаю.Нагуглить не сумел. Подскажите..... Плиз.... Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 18 апреля, 2015 Поделиться Опубликовано 18 апреля, 2015 Привет! Текстовые строки напрямую не сравниваются, тут используется адресация, т.е. нужен указатель на строку. Как вариант решения "в лоб" - найди кусочек памяти и в скрипте через оператор DB впиши туда строчку, а в CMP после этого подставляй адрес памяти, где строка лежит. Я так понимаю, она должна быть 0-terminated, т.е. оканчиваться нулем, но могу тут ошибаться. Второй вариант - если в игре такая строка используется, то можно воспользоваться поиском в памяти игры с указанием типа "String", и использовать этот адрес. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 18 апреля, 2015 Автор Поделиться Опубликовано 18 апреля, 2015 (изменено) Не понял - почему нельзя.Вот допустим пример: Показать контент Весь скрипт здесь.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) Изменено 18 апреля, 2015 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 18 апреля, 2015 Поделиться Опубликовано 18 апреля, 2015 Показать контент Я думаю, что сравнение строк ни чем не отличается от сравнения двух последовательностей байтов по двум адресам. О том как сравнивать строки и байты по двум адресам в Гугле много информации.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... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 19 апреля, 2015 Поделиться Опубликовано 19 апреля, 2015 http://www.kolasc.net.ru/cdo/programmes/assembler/cmps.html Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 19 апреля, 2015 Автор Поделиться Опубликовано 19 апреля, 2015 MasterGH и Xipho, спасибо.В скрипте решил не париться, а проверять первые четыре байта текста в Hex и фильтр сработал как надо.Но Ваша информация тоже пригодиться. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 апреля, 2015 Автор Поделиться Опубликовано 21 апреля, 2015 Всё доделал - всё отфильтровал . Скрипт - > здесь. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 22 апреля, 2015 Поделиться Опубликовано 22 апреля, 2015 В 18.04.2015 в 17:00, Garik66 сказал: Не понял - почему нельзя.Вот допустим пример: Показать контент Весь скрипт здесь.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) Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 22 апреля, 2015 Поделиться Опубликовано 22 апреля, 2015 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 апреля, 2015 Автор Поделиться Опубликовано 22 апреля, 2015 В 22.04.2015 в 14:31, RockHammer сказал: Уооооу, это из гэтэа фиве? А что это за функция такая?нет это из другой игры, а ссылку на код Vlad2 дал для примера. В 22.04.2015 в 14:36, gmz сказал: cmps для больших строк:cmps для небольших строк:Спасибо.Только теперь придётся читать про новые для меня опкоды: shr, and, rep. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 23 апреля, 2015 Поделиться Опубликовано 23 апреля, 2015 В 22.04.2015 в 14:47, Garik66 сказал: Спасибо. Только теперь придётся читать про новые для меня опкоды: shr, and, rep.кст если размер "строки" известен, можно без shr/andнапример размер инфы 9:mov ecx,8 ;sizemov esi,string1mov edi,string2rep cmpsdmov ecx,1rep cmpsbjnz @f...@@: Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения