Akama Опубликовано 23 декабря, 2010 Поделиться Опубликовано 23 декабря, 2010 Вот это кусок кода бессмертия ГГGM:cmp dword ptr [iGM],1jne BGMcmp dword ptr [esi+00000184],1jne BGMdb 90,90,90,90,90,90jmp EGMBGM:fstp dword ptr [esi+0000018c]jmp EGMХочу сделать ещё функцию one hit kill, но вот как сделать, чтоб одно другому не мешало я незнаю...Бессмертие и OHK используют одну и ту же инструкцию.Скажите, как сделать так, чтоб одно другому не мешало? Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 23 декабря, 2010 Поделиться Опубликовано 23 декабря, 2010 найди любую другую инструкцию, которая работала бы с этой же структурой игрока/врагов/обоих и к которой происходит обращение при ударе (судя по нопам в скрипте, именно тогда и происходит), например "fstp dword ptr [esi+190]" (от балды, игры нет) и делай из нее ohkcmp dword ptr [esi+00000184],1je BGMmov [esi+18c],0BGM:fstp dword ptr [esi+190]jmp EGMP.S.jne BGMdb 90,90,90,90,90,90jmp EGMможно заменить наjne EGM Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 декабря, 2010 Поделиться Опубликовано 23 декабря, 2010 НА будущее для тех кто решит сделать подобное на С++. Текст ниже удобнее читать снизу-вверх.Передаем этот код из CE на следующий.GM:cmp dword ptr [iGM],1jne BGMcmp dword ptr [esi+00000184],1jne BGMdb 90,90,90,90,90,90jmp EGMBGM: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_InfHealthOROneHitKill2) Инициализация аргументов через функцию InitSystemCheta из SystemCheta.dll----------Для каждой игры нужно писать только Cheat.dll и базу данных читов для ланчера написанного на C#. Остальной код переписывать не надо.Преимущества этого метода в том, что:1) не используем функции поиска и проверки присутствия процесса, не используется WriteProceesMemory и ReadProcessMemmory; не возимся с функцией выделения памяти и последующим распределением в ней инструкций.2) важное преимущество этого способа в том что мы можем использовать С++ на полную мощь, а не только ассемблерными вставками в скриптах Cheat Engine. С++ с IDE VisualStudio позволяет удобнее писать код 3) C# позволит программисту удобным образом связываться с SystemChet.dll чтобы предостатвить пользователю интерфейс управления читами: их активация, деактивация, изменение названия читов с целью перевода на свой язык, установка горячих клавишь, установка читов которыми пользователь желает пользоваться и т.п. Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 23 декабря, 2010 Автор Поделиться Опубликовано 23 декабря, 2010 MasterGHмне пока ассемблера хватает... Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 декабря, 2010 Поделиться Опубликовано 23 декабря, 2010 Я это предположил с точностью до 80-99% процентов по первому посту в твоей теме. Я просто написал свои мысли для тех кому они могут пригодиться. Да и потом кто знает, может скрипты CE тебе будут скучны в будущем из-за того что ты будешь cool-программистом и тебе возможно это пригодиться. Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 25 декабря, 2010 Автор Поделиться Опубликовано 25 декабря, 2010 будут скучны в будущем из-за того что ты будешь cool-программистХорошая шутка. Спасибо, поржал )))Вот такой вот трейнер с AboutBox'ом.Ссылка на него во флудильне, где я его потестить просил... Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 26 декабря, 2010 Автор Поделиться Опубликовано 26 декабря, 2010 Щас кстати шмат кода покажу...Player:mov [pHero],esi //сохранил для последующих манипуляций...push eaxmov eax,[esi+FC] // загрузил структуру золота и очковcmp dword ptr [iGold],1jne p1add [eax+94],#10000mov [iGold],0p1:cmp dword ptr [iXP],1jne p2add [eax+8c],#1000mov [iXP],0p2:cmp dword ptr [iPP],1jne p3add [eax+2c],#10mov [iPP],0p3:cmp dword ptr [iSP],1jne BPlayeradd [eax+3c],#10mov [iSP],0BPlayer:pop eaxfld dword ptr [esi+0000018c]jmp EPlayerПришлось вот таким вот образом сделать, чтобы можно было прибавлять к значению независимо от других значений.Может проще метод есть? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 декабря, 2010 Поделиться Опубликовано 27 декабря, 2010 Снова для тех кто решит писать на C/C++mov [pHero],esi push eax mov eax,[esi+FC] // загрузил структуру золота и очков cmp dword ptr [iGold],1 jne p1 add [eax+94],#10000 mov [iGold],0p1: cmp dword ptr [iXP],1 jne p2 add [eax+8c],#1000 mov [iXP],0p2: cmp dword ptr [iPP],1 jne p3 add [eax+2c],#10 mov [iPP],0p3: cmp dword ptr [iSP],1 jne BPlayer add [eax+3c],#10 mov [iSP],0BPlayer: pop eax fld dword ptr [esi+0000018c]jmp EPlayerPlayer:Пишем шаблон для повторяющихся участков 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(); Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 27 декабря, 2010 Автор Поделиться Опубликовано 27 декабря, 2010 Блин, да я на ассемблере спрашивал как упростить, кому надо, тот на С++ сам догадается как сделать... Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 28 декабря, 2010 Поделиться Опубликовано 28 декабря, 2010 Ок. Про ассемблерный код.Упростить вроде не упростишь. Лучше вообще переписать так:Главный скрипт:registersymbol(pStruct)Player:mov [pHero],esi push eaxmov eax,[esi+FC] // загрузил структуру золота и очковmov [pStruct],eaxpop eaxfld dword ptr [esi+0000018c]jmp EPlayerВключаешь этот скрипт, а в таблице Cheat Engine пишешь: 1) указатели относительно зарегистрированной метки pStruct;2) функцию добавления и добавляемое значение;3) горячие клавиши.Можно городить эти каскады флагов как ты сделал, но они отнимают ресурсы у процессора (не нужно чтобы этот кусок кода срабатывал с частотой меньше чем 10 мс, да и "главный скрипт" должен срабатывать когда меняются указатели pHero и pStruct)cmp dword ptr [iXP],1jne p2add [eax+8c],#1000mov [iXP],0p2:cmp dword ptr [iPP],1jne p3add [eax+2c],#10mov [iPP],0p3:cmp dword ptr [iSP],1jne BPlayeradd [eax+3c],#10mov [iSP],0BPlayer:pop eax Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 28 декабря, 2010 Автор Поделиться Опубликовано 28 декабря, 2010 в общем, на сколько я понял, проще не сделать, есть вариации на эту тему, по всё к одному и тому же сводится. Спасибо за разъяснение ))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения