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

cmp строки


helldrg

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

Здравствуйте! Посмотрел я видео про реализацию фильтра "свой чужой". Чтобы его сделать необходимо различие в структурах найти. Я нашел в виде строки:

Скрытый текст

 

download?id=VqusuiMaq8LaCp56nPIgeMmmjWdp

 

Почитав форумы пришел к выводу, что можно писать так:

cmp word ptr[eax+4],'te' и cmp dword ptr[eax+4],'team'


Начало у всех одинаковое, надо делать смещение:

cmp dword ptr[eax+8],'play'


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

Скрытый текст

newmem:
  push eax
  mov eax,[ecx+10]
  cmp dword ptr[eax+8],'play'
  jne code
  mov dword ptr [ecx+00000134],(float)100
  jmp code
code:
  pop eax
  fld dword ptr [ecx+00000134]
  jmp return
INJECT:
  jmp newmem
  nop

 

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

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

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

В 06.10.2016в12:45, helldrg сказал:

И почему то после перезапуска CE нельзя включить скрипт.

Может так надо попробовать. Правда башка ещо не совсем работает, только оклемался :)  и возможно скрипт не верный.

Скрытый текст

newmem:
  push eax
  mov eax,[ecx+10] 
  mov eax,[eax+8]
  cmp eax'play'
  jne code
  mov dword ptr [ecx+00000134],(float)100
  jmp code
code:
  pop eax
  fld dword ptr [ecx+00000134]
  jmp return
INJECT:
  jmp newmem
  nop

 

 

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

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

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

48 минуты назад, keng сказал:

Намного проще и быстрее работать с идентификаторами

Keng но что бы с ними работать, нужно быть уверенным в них или в нем, а такое явление не часто встретишь. А так просто искать как в ребусе (найди 10 отличий) тоже не особо то надежно и получается не далеко уходишь от той же строки. Вот как ты написал работать с указателем - это будет куда надежнее и процентов на 80 работоспособнее, так как бывают случаи, что и указатели врага загружаются с того или иного смещения вместе с персонажем. Но если поковыряться, то можно найти. Я вот обычно ищу в структуре указателей рядом со смещением жизни и в моих случаях я частенько находил и всё работало как надо.  

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

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

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

@Dino - готовой функцией проще, само собой, но лично я не очень доверяю таким решениям. Скажем, в игру на каком-нибудь чудо-языке может быть не подгружен стандартный сишный рантайм, так что функции этой там не окажется. Руками эта функция пишется очень просто, так что лучше уж свою написать, если так хочется.

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

1 hour ago, LIRW said:

Keng но что бы с ними работать, нужно быть уверенным в них или в нем, а такое явление не часто встретишь. А так просто искать как в ребусе (найди 10 отличий) тоже не особо то надежно и получается не далеко уходишь от той же строки. Вот как ты написал работать с указателем - это будет куда надежнее и процентов на 80 работоспособнее, так как бывают случаи, что и указатели врага загружаются с того или иного смещения вместе с персонажем. Но если поковыряться, то можно найти. Я вот обычно ищу в структуре указателей рядом со смещением жизни и в моих случаях я частенько находил и всё работало как надо.  

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

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

Да оно понятно, просто очень редко встречаются игры, где какая-то логика завязана именно на строках - это действительно неслабо бьет по производительности и причин так делать всего несколько - скажем, скриптовый движок или же просто криворукость разработчиков. Следовательно, в 99% оставшихся игр используются айдишники или (реже) указатели, так что ищущий да обрящет. :D

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

4 минуты назад, keng сказал:

Да оно понятно

:offtopic:Мне больше всех не нравится движок "Unreal Engine" :lol: Его наверное много кто не одобряет из за нудности. Игру то наверное многие смотрели под названием "Painkiller"  и знают какого это :)

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

2 minutes ago, LIRW said:

:offtopic:Мне больше всех не нравится движок "Unreal Engine" :lol: Его наверное много кто не одобряет из за нудности. Игру то наверное многие смотрели под названием "Painkiller"  и знают какого это :)

Погоди, в первом Painkiller и движок был свой - Painengine. Он разве на основе UE? 0_o

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

23 минуты назад, keng сказал:

Погоди, в первом Painkiller и движок был свой - Painengine.

Я не первый имел введу, так какой то из них на UE а был ещо что подобное ему. И вот на этом движке делали игру про зомби о второй мировой. Ты вот Keng по любому в эту игру играл и наверное знаешь её название, так как на языке то крутиться, но название вспомнить не могу. Там как то название игры связано с движком.  

Вспомнил, а то есть в инете нашел название этой игры "NecroVisioN" вот этот движок не чем по сложности не уступает UE хотя может это одно и тоже, но такая же путаница. 

Извиняюсь что сообщение поправил, но я как бы старался быстрее все сделать, но Keng получился уже ответил.

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

2 minutes ago, LIRW said:

Я не первый имел введу, так какой то из них на UE а был ещо что подобное ему. И вот на этом движке делали игру про зомби о второй мировой. Ты вот Keng по любому в эту игру играл и наверное знаешь её название, так как на языке то крутиться, но название вспомнить не могу. Там как то название игры связано с движком. 

Не, у меня компьютера сейчас нет, чтобы играть. Последнее, что проходил - DooM.

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

LIRW

Я попробовал как Вы написали, все равно крашит
 

Скрытый текст

push eax
  mov eax,[ecx+10]
  mov eax,[eax+8]
  cmp eax,'play'
  jne code
  //mov dword ptr [ecx+00000134],(float)100
  jmp code
code:
  pop eax

 

Даже в этом куске крашит, тут же ничего не изменятся для того что бы крашило

И почему бывает невозможно скрипт активировать, нажимаешь на него, а крестик не ставится

Сейчас готовой функцией попробую сравнить

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

В 06.10.2016в20:16, keng сказал:

@Dino - готовой функцией проще, само собой, но лично я не очень доверяю таким решениям. Скажем, в игру на каком-нибудь чудо-языке может быть не подгружен стандартный сишный рантайм, так что функции этой там не окажется. Руками эта функция пишется очень просто, так что лучше уж свою написать, если так хочется.

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

 

helldrg Фул код в студию. Дело либо в хуке , либо пытаешься прочитать не валидный адрес

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

Вот код:

Скрытый текст

{ Game   : generals.exe
  Version: 
  Date   : 2016-10-06
  Author : User

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscanmodule(INJECT2,generals.exe,D9 81 34 01 00 00 D9) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  push eax
  mov eax,[ecx+10]
  mov eax,[eax+8]
  //cmp [eax],'play'
  //jne code
  //mov dword ptr [ecx+00000134],(float)100
  jmp code
code:
  pop eax
  fld dword ptr [ecx+00000134]
  jmp return

INJECT2:
  jmp newmem
  nop
return:
registersymbol(INJECT2)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
INJECT2:
  db D9 81 34 01 00 00

unregistersymbol(INJECT2)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "generals.exe"+34232D

"generals.exe"+34230D: D9 44 24 18           -  fld dword ptr [esp+18]
"generals.exe"+342311: D8 47 2C              -  fadd dword ptr [edi+2C]
"generals.exe"+342314: D9 5F 2C              -  fstp dword ptr [edi+2C]
"generals.exe"+342317: 8B 55 14              -  mov edx,[ebp+14]
"generals.exe"+34231A: F6 42 78 08           -  test byte ptr [edx+78],08
"generals.exe"+34231E: 74 5C                 -  je generals.exe+34237C
"generals.exe"+342320: 8B 45 0C              -  mov eax,[ebp+0C]
"generals.exe"+342323: 8B 88 88 00 00 00     -  mov ecx,[eax+00000088]
"generals.exe"+342329: 85 C9                 -  test ecx,ecx
"generals.exe"+34232B: 74 4F                 -  je generals.exe+34237C
// ---------- INJECTING HERE ----------
"generals.exe"+34232D: D9 81 34 01 00 00     -  fld dword ptr [ecx+00000134]
// ---------- DONE INJECTING  ----------
"generals.exe"+342333: D9 54 24 50           -  fst dword ptr [esp+50]
"generals.exe"+342337: D8 1D 9C 6D 89 00     -  fcomp dword ptr [generals.exe+496D9C]
"generals.exe"+34233D: DF E0                 -  fnstsw ax
"generals.exe"+34233F: F6 C4 01              -  test ah,01
"generals.exe"+342342: 75 38                 -  jne generals.exe+34237C
"generals.exe"+342344: 81 C1 84 00 00 00     -  add ecx,00000084
"generals.exe"+34234A: E8 61 04 E6 FF        -  call generals.exe+1A27B0
"generals.exe"+34234F: D9 C0                 -  fld st(0)
"generals.exe"+342351: D8 4C 24 50           -  fmul dword ptr [esp+50]
"generals.exe"+342355: D8 0D BC 6D 89 00     -  fmul dword ptr [generals.exe+496DBC]
}

 

 

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

@helldrg бабахни отладчик на инструкцию и сделай действия из скрипта руками, глядя в memory dump. Берешь значение ECX, прибавляешь смещение, переходишь по получившемуся в memory dump. Смотришь, что там. Если то, что ожидалось, тогда еще проблема может быть в доступе (?) или все-таки там несколько типов структур. Или смещение динамическое, но это уже изврат. Можешь дать полное зазвание игры? У меня руки зачесались, хочу тоже потыкать.

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

Dino

А как проверить правильный или не правильный возвращает? Метку INJECT2 в правильном месте ставит скрипт, наверное значит находит. Точно через ecx!!!

keng

 игра называется command&conquer:generals v1.8 её можно только в антологиях найти, просто 1.4 скачать разница там в основном что процессы по разному называются, в v1.4 game.dat

Сейчас в ручную попробую все действия произвести

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

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

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

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