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

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

Вот это кусок кода бессмертия ГГ


GM:
cmp dword ptr [iGM],1
jne BGM
cmp dword ptr [esi+00000184],1
jne BGM
db 90,90,90,90,90,90
jmp EGM
BGM:
fstp dword ptr [esi+0000018c]
jmp EGM

Хочу сделать ещё функцию one hit kill, но вот как сделать, чтоб одно другому не мешало я незнаю...

Бессмертие и OHK используют одну и ту же инструкцию.

Скажите, как сделать так, чтоб одно другому не мешало?

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

найди любую другую инструкцию, которая работала бы с этой же структурой игрока/врагов/обоих и к которой происходит обращение при ударе (судя по нопам в скрипте, именно тогда и происходит), например "fstp dword ptr [esi+190]" (от балды, игры нет) и делай из нее ohk

cmp dword ptr [esi+00000184],1
je BGM
mov [esi+18c],0
BGM:
fstp dword ptr [esi+190]
jmp EGM

P.S.

jne BGM
db 90,90,90,90,90,90
jmp EGM

можно заменить на

jne EGM

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

НА будущее для тех кто решит сделать подобное на С++. Текст ниже удобнее читать снизу-вверх.

Передаем этот код из CE на следующий.



GM:
cmp dword ptr [iGM],1
jne BGM
cmp dword ptr [esi+00000184],1
jne BGM
db 90,90,90,90,90,90
jmp EGM
BGM:
fstp dword ptr [esi+0000018c]
jmp EGM

Для Cheat.dll (C++)

----------

inline void InfHealth()

{

const float value = 1000.0;

__asm

{

mov dword [esi+0000018c],value

}

}

inline void OneHitKill()

{

const float value = 0;

__asm

{

mov dword [esi+0000018c],value

}

}

inline bool GetFilter()

{

__asm

{

//....

}

}

void Cheat_InfHealthOROneHitKill()

{

bool filter = GetFilter();

if (filter)

InfHealth();

else

OneHitKill();

}

void Init_InfHealthOROneHitKill()

{

DWORD* OffsetInMemory = xxxx;

BYTE LengthNops = xx;

xxx OldProtect;

CreateInjection(OffsetInMemory, &Cheat_InfHealthOROneHitKill, LengthNops);

}

------------

Для SystemChet.dll (C++)

-----------

void Unprotect(DWORD OffsetInMemory, &OldProtect);

{

///....

}

void CreateInjection(DWORD* FromOffset, DWORD* ToOffset, BYTE nopscount)

{

Unprotect(OffsetInMemory, &OldProtect); // снятие защиты с памяти, если треубуется

OffsetInMemory = &Cheat_InfHealthOROneHitKill;

OffsetInMemory+= 4;

for (int i =0, i<LengthNops, i++)

(*BYTE)(OffsetInMemory+i) = 0x90;

RestoreUnprotect(OffsetInMemory, &OldProtect);// восстановление защиты памяти

}

// Инициализация

void InitSystemCheta(string args[])

{

1) Поиск Init_InfHealthOROneHitKill() в Cheat.dll и связать эту функцию по горячей клавише

2) Проверка на повтороное нажатие горяей клавиши

}

void CmpareKyes()

{

//...

}

-----------

Для Lancher.exe (C#)

----------

1) Загрузка обеих библиотек SystemCheta.dll и Cheat_InfHealthOROneHitKill

2) Инициализация аргументов через функцию InitSystemCheta из SystemCheta.dll

----------

Для каждой игры нужно писать только Cheat.dll и базу данных читов для ланчера написанного на C#. Остальной код переписывать не надо.

Преимущества этого метода в том, что:

1) не используем функции поиска и проверки присутствия процесса, не используется WriteProceesMemory и ReadProcessMemmory; не возимся с функцией выделения памяти и последующим распределением в ней инструкций.

2) важное преимущество этого способа в том что мы можем использовать С++ на полную мощь, а не только ассемблерными вставками в скриптах Cheat Engine. С++ с IDE VisualStudio позволяет удобнее писать код :)

3) C# позволит программисту удобным образом связываться с SystemChet.dll чтобы предостатвить пользователю интерфейс управления читами: их активация, деактивация, изменение названия читов с целью перевода на свой язык, установка горячих клавишь, установка читов которыми пользователь желает пользоваться и т.п.

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

Я это предположил с точностью до 80-99% процентов по первому посту в твоей теме. Я просто написал свои мысли для тех кому они могут пригодиться. Да и потом кто знает, может скрипты CE тебе будут скучны в будущем из-за того что ты будешь cool-программистом и тебе возможно это пригодиться.

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

будут скучны в будущем из-за того что ты будешь cool-программист

Хорошая шутка. Спасибо, поржал )))

Вот такой вот трейнер с AboutBox'ом.

1ff4468b7fbe4a8cb42385d2ddfaf005.png

Ссылка на него во флудильне, где я его потестить просил...

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

Щас кстати шмат кода покажу...


Player:
mov [pHero],esi //сохранил для последующих манипуляций...

push eax
mov eax,[esi+FC] // загрузил структуру золота и очков
cmp dword ptr [iGold],1
jne p1
add [eax+94],#10000
mov [iGold],0
p1:
cmp dword ptr [iXP],1
jne p2
add [eax+8c],#1000
mov [iXP],0
p2:
cmp dword ptr [iPP],1
jne p3
add [eax+2c],#10
mov [iPP],0
p3:
cmp dword ptr [iSP],1
jne BPlayer
add [eax+3c],#10
mov [iSP],0
BPlayer:
pop eax
fld dword ptr [esi+0000018c]
jmp EPlayer

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

Может проще метод есть?

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

Снова для тех кто решит писать на C/C++


mov [pHero],esi

push eax
mov eax,[esi+FC] // загрузил структуру золота и очков
cmp dword ptr [iGold],1
jne p1
add [eax+94],#10000
mov [iGold],0
p1:
cmp dword ptr [iXP],1
jne p2
add [eax+8c],#1000
mov [iXP],0
p2:
cmp dword ptr [iPP],1
jne p3
add [eax+2c],#10
mov [iPP],0
p3:
cmp dword ptr [iSP],1
jne BPlayer
add [eax+3c],#10
mov [iSP],0
BPlayer:
pop eax
fld dword ptr [esi+0000018c]
jmp EPlayer
Player:

Пишем шаблон для повторяющихся участков


cmp dword ptr [x1],1
jne _next
add [x2],x3
mov [x1],0
_next:
//переменные dword: x1, x2, x3, _next

Представим это дело функцией:


{
if (x1==0)
{
x2+=x3;
x1=1;
}
}
inline void AddSource(DWORD x1, x2, x3)

Представим это дело как если бы писали dll-ку:



void InitCheatData()
{
// написать инициализцаию для структуры cheatData;
// написать прыг на Injection1() в место внедрения
// написать баты нопов
}

void Injection1()
{
__asm
{
pushad
pushfd
}

CheatAddValueHero();

/* Посмотри сколько читов я могу сделать на С/С++ дальше
а ты будешь их долго писать на ассемблере
Cheat1();
Cheat2();
Cheat3();
Cheat4();
Cheat5();
Cheat6();
Cheat7();
Cheat8();
Cheat9();
Cheat10();
Cheat11();

Если выбирать между удобством С/С++ и эффективностью ассемблера, то лучше выбрать первое если сложные: читы, механизмы активации и деактивации, если читов довольно много и т.п.
*/
__asm
{
popfd
popad
}

}

inline void CheatAddValueHero()
{
for(int i=0; i<3; i++)
{
if (cheatData[i].x1==0)
{
cheatData[i].x2+=cheatData[i].x3;
cheatData[i].x1=1;
}
}
}
struct CheatData {DWORD x1, x2, x3}[] cheatData;

При загруке dll-ки вызывать функцию удалённым потоком InitCheatData();

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

Ок. Про ассемблерный код.

Упростить вроде не упростишь. Лучше вообще переписать так:

Главный скрипт:


registersymbol(pStruct)

Player:
mov [pHero],esi
push eax
mov eax,[esi+FC] // загрузил структуру золота и очков
mov [pStruct],eax
pop eax
fld dword ptr [esi+0000018c]
jmp EPlayer

Включаешь этот скрипт, а в таблице Cheat Engine пишешь:

1) указатели относительно зарегистрированной метки pStruct;

2) функцию добавления и добавляемое значение;

3) горячие клавиши.

Можно городить эти каскады флагов как ты сделал, но они отнимают ресурсы у процессора (не нужно чтобы этот кусок кода срабатывал с частотой меньше чем 10 мс, да и "главный скрипт" должен срабатывать когда меняются указатели pHero и pStruct)


cmp dword ptr [iXP],1
jne p2
add [eax+8c],#1000
mov [iXP],0
p2:
cmp dword ptr [iPP],1
jne p3
add [eax+2c],#10
mov [iPP],0
p3:
cmp dword ptr [iSP],1
jne BPlayer
add [eax+3c],#10
mov [iSP],0
BPlayer:
pop eax

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

в общем, на сколько я понял, проще не сделать, есть вариации на эту тему, по всё к одному и тому же сводится.

Спасибо за разъяснение )))

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

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

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

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