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

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

Вобщем хочу понять как делать фильтры. Игра NFSC

Вот скрипт делающий прозрачной мою машину и остальные :angry:


[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
add [ecx+40],#1
originalcode:
//mov eax,[ecx+40]
ret
int 3
exit:
jmp returnhere

00709A70:
jmp newmem
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
00709A70:
mov eax,[ecx+40]
ret
int 3
//Alt: db 8B 41 40 C3 CC

У меня получилось сделать строчкой add [ecx+40],#1 не мигающую, но прозрачную машину

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
mov [ecx+40],#1
originalcode:
mov eax,[ecx+40]
ret
int 3
exit:
jmp returnhere

00709A70:
jmp newmem
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
00709A70:
mov eax,[ecx+40]
ret
int 3
//Alt: db 8B 41 40 C3 CC

Оригинал скрипта, так как он должен был быть написан.

Подскажите как отфильтровать оригинальный скрипт и сделать прозрачным только меня и если можно дать инфу, где написано про фильтры

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

Попробуй искать цепочку указателей свою и 2-х чужих машин, и затем сравнивать структуры указателей в Cheat Engine "dessect data" из меню дизассемблера. Как это делается есть в статье про Медал Тотал Вар на нашем сайте. Ещё поищи англоязычные статьи Geri по Cheat Engine. Вот одна. У него даже должно быть видео, вроде, по сравнениям структур.

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

Сложно сказать в этом духе или в другом... Смотря как разработчики код игры написали. То что на видео, это сравнение данных структур. Можно не стесняться и брать мног структур. Своего героя, пару ботов из твоей команды и по паре ботов из двух других команд... Определяешь группы и ищешь чем они отличаются. Если найдёшь отличие, то сможешь сделать "фильтр" для совершения какого-то действия...

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

push ebx //регистр нам будет нужен, поэтому запихнём его в стек и потом вернём обратно - ebx почему?

mov ebx,[core.dll+00155744] //строим многоуровневый указатель

mov ebx,[ebx+350] - [ebx+350] Что это? Быть может [ebx+250]?

add ebx,43C //ebx=[[core.dll+00155744h]+350h]+43Ch – многоуровневый указатель, - Почему 43C?

cmp eax,ebx //если игрок наш, то прописать 250 очков здоровья

pop ebx //восстановили ebx

jne short originalcode

mov byte ptr [eax],#250 //пишем здоровье нашему гироку

originalcode: //метка оригинального кода

mov ecx,[eax] //дописываем затёртые инструкции для восстановления логики кода

mov edx,[esp+04]

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

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

2. [ebx+350] Что это? Быть может [ebx+250]? - Нет, именно так, как указано, ибо, как видно из найденной цепочки уровней указателей, второй уровень являет собой [[core.dll+00155744h]+350h]+43Ch.

3. Почему 43C? - Потому, что по этому смещению нашелся необходимый адрес от указателя верхнего уровня.

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

Как написал Xipho по этому скрипту нет ответа почему именно такие смещения прибавляются к регистрам. Эти смещения я когда-то давно искал в отладчике реверсингом совместно со сканером памяти.

Суть в том что по выражению [[core.dll+00155744h]+350h]+43Ch находится указатель на адрес здоровья героя. И если этот адрес совпадает с eax на участке кода куда была сделана инъекция, то записать в этот адрес 250 очков здоровь. Если этого не сделать, то все игроки будут бессмертными.

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

Именно эту запись нужно делать циклически

[[[core.dll+0x00155744]+0x350]+0x43C] = 250 

Вот так...


push ebx
mov ebx,[core.dll+00155744]
mov ebx,[ebx+350]
mov byte ptr [ebx+43C],#250
pop ebx
originalcode:
mov ecx,[eax]
mov edx,[esp+04]
....

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

А вот возможно ли найдя инстр. патрон, залезть в структуру оружия и найти там значения отвечающие за скорость выстрелов, отдача, дёрганье прицела и так далее? :rolleyes:

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

Вас понял. Вот как я понимаю про поиск Multilevel pointers:

1 Имея адрес моей жизни и врага я нажимаю на адресе своих жизней Pointer scan for this adress

2 Когда найдёт все указатели я нажимаю на адресе жизней врага Remove pointers no pointing for this adress

3 Должен остаться оди указатель и я его добавлю в CE

4 Когда я поменяю значение в нём,то и у меня и у врага должно записаться 100 допустим

Правильно???

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

Очевидно, что у другой игры может быть другой случай :) Чтобы найти решение нужно кропотливо сидеть и "ковыряться" в коде и данных игрового процесса.

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

Помогите отфильтровать

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem:
mov [ecx+000000a4],#1065353216
originalcode:
fld dword ptr [ecx+000000a4]//Указатель
exit:
jmp returnhere

006F1030:
jmp newmem
nop
returnhere:

[DISABLE]
dealloc(newmem)
006F1030:
fld dword ptr [ecx+000000a4]
//Alt: db D9 81 A4 00 00 00

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

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

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

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