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

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Весь контент MasterGH

  1. Если нужны мои комментарии, то первый твой пример в новинку может быть полезным для многих, а второй можно воспринять как закрепление материала по "активирующим" скриптам Немного поправлю: newmem: cmp byte ptr [_Exp],1 jne short originalcode // корткий прыжок не пишет лишних нопов в теле чит-кода add [ecx+60],3E8 mov [_Exp],0 originalcode: mov eax,[ecx+60] ret // эта инструкция "конечная станция" поэтому... int 3// ...можно было не писать jmp returnhere // ...можно было не писать
  2. Ближе к концу на максимальной сложности ... там где зеленые "шары" вылазят из нор. У меня было около 5 патронов дробовика и с сотню от винтовки похожей на СВД с лазерным прицелом и играл без читов по часа два в день начиная где-то с даты создания этой темы.... Короче получалось либо я далеко убегал от напарника бегая от шаров и напарник умирал от них... либо мой герой умирал потому, что я всё защищал напарника. Так что раз 15 - и я забил на игру Сегодня нашёл адрес напарника и заморозил его .... и далее ещё около трёх уровней пройти и я лицезрел список авторов игры оповещающих о её конце (не ожидал что она такая короткая). А дальше какая-то непонятная пауза - хоть игру отрубай.
  3. Хм... интересное дело с ножами. Можно представить массив указателей объектов которые могут быть на карте. У этих объектов должны быть три координаты и идентификатор типа объекта: это данные должны быть у всех подобных объектов. Например: Нож:ID1 Стрелы:ID2 Массив: ID1,ID1,ID2,ID1,ID2,ID1... Есть несколько вариантов как сделать респавн: 1. Вариант: На создание и добавление в этот массив объектов не влияет наш игрок, а влияет только сценарий начала уровня. Т.е. только сценарий создаёт и кладёт в этот массив объекты, а те кто их юзает могут только юзать и максимум выкинуть из массива (уничтожить, но не создать). Вопрос здесь стоит только в том, чтобы выйти на место кода игры где происходит создание объекта... а дальше уже будет видно. 2. Вариант. Данный массив используется иначе. Каждый объект игрока создаёт локальные копии объектов, которые он берёт из массива. При этом объекты в этом массиве разрушаются. В этом случае можно зациклить сбор нажей с одного "поднимаемого" объекта ножа из массива. Т.е. когда игрок берёт один нож, то мы зацикливаем например на 200 копий, после чего один объект разрушиться из массива, копию которого мы делали. Такой вариант был СТАЛКЕРЕ с патронами. Оба варианта сводятся к тому чтобы выйти на массив объектов и понять какой из двух вариантов следует. Мне почему-то кажется, что есть ещё один вариант. 3. Вариант. Он похож на второй. Берём объект из массива "мира" создаём его копию, которую помещаем в создаваемый объект управления ножом. Таким образом Указатель на управление ножом кладём в объект героя... Вот такие мысли...
  4. Интересная информация )) По поводу бессмертных дружественных NPS у меня есть одна идея. Зацепка от которой можно оттолкнуться, просто мелочь... Всем кто играл известно что в дружественных NPS нельзя стрелять - наводишь прицел на "друга" пытаешься выстрелить и не получается. А это значит, что перед выстрелом происходит сравнение свой/чужой. Осталось только найти данные которые задействованы в сравнении, а дальше в инструкцию работающую со здоровьем игроков внедрить условие, которое дружественным NPS пишет постоянное здоровье.. Пока такие мысли..
  5. Кто-нибудь знает хакнули фильтры от противогаза или нет и что там с гранатами(динамитом)... они как оформлены как объекты? И по какому принципу супер прыжок работает... aliast, ты на плейграунде писал, что не смог сделать дружественных игроков бессметрными, а можно узнать узнать поконкретней в чём проблема была? На плейграунде нужно подождать с чуть меньше недели, чтобы твой трейнер добавили ))) Те кто добавляют материал "там еле чешутся" ---- Короче, я так понял там гранаты, фильтры и метальные патроны нужно спавнить(создавать) через конструктор. Я месяца два назад научился спавнить патроны в СТАЛКЕРЕ, но всё руки "не доходят" написать как это сделал. В Метро можно попробовать найти адрес счётчика метальных патронов и найти инструкции работающие с ним при перезарядке. При перезарядке должно происходить создание объектов в стволе оружия. Самый простой вариант сделать так, чтобы при перезарядке создавались в стволе не существующие патроны, но в этом случае пользователю постоянно придётся перезаряжаться. А нужно сделать так, что при выстреле инициализировалась перезарядка с отсутсвием или с очень быстрой анимацией перезарядки, тогда будет сделан так называемый чит-спавн патронов. Почти аналогично касается предметов которые игрок подбирает с трупов, в этот момент нужно узнать прерывающиеся инструкции, затем узнать в какую функцию они входят и какие параметры этой функции должны быть. Затем задать эти параметры с вызовом функции (либо внутренним потоком игры из некоторого места либо созданным потоком CE через скрпты) и будет спавн динамита или некоторого предмета Но это в теории... Я сейчас читаю посты темы... Ты писал Данные (если я не ошибаюсь) должны быть выровнены от начала блока памяти кратно 16 байт, ещё говорят выровнены по 16-му параграфу. Назначь метку _dead, от метки _newmem на расстоянии кратном 16-ти байтам.
  6. Бывают ещё сообщения: Если в образовательных целях, то сообщение с первоапрельской шуткой вылазит здесь.. [cod]procedure TMainForm.FormShow(Sender: TObject); resourcestring strhappybirthday='Let''s sing Happy Birthday for Dark Byte today!'; strXMess='Merry christmas and happy new year'; strNewyear='And what are your good intentions for this year? ;-)'; strfuture='Wow,I never imagined people would use Cheat Engine up to today'; var reg: tregistry; modifier: dword; key: dword; hotkey: string; year,month,day: word; temp:string; i: integer; outputfile: textfile; go:boolean; loadt: boolean; firsttime: boolean; x: array of integer; begin Set8087CW($133f); loadt:=false; edit2.Text:=format('%.1f',[1.0]); reg:=Tregistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if not Reg.OpenKey('SoftwareCheat Engine',false) then begin if Reg.OpenKey('SoftwareCheat Engine',true) then begin //write some default data into the register reg.WriteBool('Undo',true); reg.writeBool('Advanced',true); reg.writeBool('SeperateThread',true); reg.writebool('Use Hyperscan if posible',false); reg.WriteInteger('ScanThreadpriority',formsettings.combothreadpriority.itemindex); end; end; except end; if reg.ValueExists('First Time User') then firsttime:=reg.ReadBool('First Time User') else firsttime:=true; if firsttime then begin reg.WriteBool('First Time User',false); if messagedlg('Do you want to try out the tutorial?',mtconfirmation,[mbyes,mbno],0)=mryes then shellexecute(0,'open','Tutorial.exe','','',sw_show); end; // animatewindow(mainform.Handle,10000,AW_CENTER); //mainform.repaint; fronttext:='brings Cheat engine to front'; if dontrunshow then exit; dontrunshow:=true; decodedate(now,year,month,day); if (month=7) and (day=1) then showmessage(strhappybirthday); if (month=12) and ((day=25) or (day=26)) then Showmessage(strXmess); if (month=1) and (day=1) then showmessage(strnewyear ); if (month=1) and (day=1) and (year>=2010) then showmessage(strFuture); if (month=4) and (day=1) then aprilfools:=true; if aprilfools=true then Messagedlg('Your license to use Cheat Engine has expired. You can buy a license to use cheat engine for 1 month for $200, 6 months for only $1000 and for 1 year for only $1800.'+' If you don''t renew your license Cheat Engine will be severely limited in it''s abilities. (e.g: Next scan has been disabled)',mtwarning,[mbok],0); LoadSettingsFromRegistry; //Load the table if one was suplied overridedebug:=false; if paramcount>=1 then begin loadt:=true; if uppercase(paramstr(1))='-O' then begin OverrideDebug:=true; loadt:=false; end; if paramcount>1 then begin //extra param temp:=paramstr(2); if length(temp)>4 then if temp[1]+temp[2]+temp[3]='/o=' then begin //output to: temp:=copy(temp,4,length(temp)-3); assignfile(outputfile, temp); rewrite(outputfile); for i:=0 to numberofrecords-1 do writeln(outputfile,memrec.description+' '+IntToHex(memrec.Address,8)); closefile(outputfile); showmessage(temp+' has been created'); end; end; end else begin end; if loadt then begin LoadTable(paramstr(1),false); updatescreen; updatelist; end; if GetSystemType<3 then //not a supported os for hardware breakpoints with formsettings do begin rdWriteExceptions.Checked:=true; rbDebugRegisters.Enabled:=false; label6.Enabled:=false; label7.Enabled:=false; rbDebugAsBreakpoint.Enabled:=false; rbInt3AsBreakpoint.Checked:=true; end; if (GetSystemType<4) {or (is64bitos)} then //not nt or later begin with formsettings do begin cbKernelQueryMemoryRegion.enabled:=false; cbKernelReadWriteProcessMemory.enabled:=false; cbKernelOpenProcess.enabled:=false; cbProcessWatcher.Enabled:=false; cbKDebug.enabled:=false; cbGlobalDebug.enabled:=false; TauntOldOsUser.Visible:=true; label25.Enabled:=false; end; end; vartypechange(vartype); adjustbringtofronttext; if aprilfools then caption:=cenorm+' EXPIRED!'; if autoattachtimer.enabled then autoattachcheck; //SMenu:=GetSystemMenu(handle,false); //don't put this in oncreate, just don't if memscan=nil then memscan:=tmemscan.create(progressbar1); memscan.setScanDoneCallback(mainform.handle,wm_scandone); FileAccessTest; end;[/cod] Оно мне уже надоело своим появление и я его кильну на... так же как и предложение потренироваться при первом запуске (при сбросе настроек в реестре)
  7. Статья GTA Vice City - это статья с которой я нулевыми знаниям начал путь в advanced gamehacking. А затем F.E.A.R. - тоже произвела впечатление. Три года прошло и если сравнить знания мои до того как я прочёл эти статьи с теми, что сейчас, то можно посмеяться ))) Тогда я смотрел на ассемблерные инструкции типа этого и понятия не имел как с этим работать.... жесть ))) Теперь настало время и я прокомментирую моменты, которые были мне непонятными или которые нужно дополнить. Надеюсь Xipho будет интересно. Комментарии мои могут быть сложным новичкам, но что тут поделаешь, написал как написал... Для удобства я все картинки вытащил из под спойлеров, а комментарии я буду писать красным. Поехали...
  8. От лица Администрации поздравляю всех с первым выходом сайта. Позже кто-нибудь из администрации уточнит для желающих-реализёров, что будем публиковать на сайте и как это будет происходить.
  9. Интересное "открытие". Всё больше и больше становится понятно как разработчики пишут игры.
  10. Привет, это вновь MasterGH с занудной, но полезной статьёй ) Рассмотрим работу с некоторыми FPU инструкциями компилятора Borland C++ Подопытная программка, которую я написал выглядит так: рис.1 (весит 12 кб в сжатом состоянии.. хе-хе, буду знать) Как видите, она умеет уменьшать, увеличивать и уменьшать с условием значение здоровья типа float. Основной код, который я добавил в приложение. float fhealth = 100.0; //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { fhealth-=20.0; updateValue(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { fhealth+=20.0; updateValue(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if (fhealth>10) {fhealth-=5;}; updateValue(); } void TForm1::updateValue() { Edit1->Text=fhealth; } //--------------------------------------------------------------------------- Остальной код писать не буду, т.к. он генерируется автоматически. Ах да updateValue() нужно добавить в приватную область класса формы и больше я никакого кода не писал. А теперь взглянем на ассемблерные инструкции этих действий. Буду приводить кусок исходника и описание. //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { fhealth-=20.0; updateValue(); } Это тоже самое что: рис.2 Так как всё тут просто комментировать не буду. Идём к следующей инструкции. //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { fhealth+=20.0; updateValue(); } Почти аналогично, только с инструкцией добавления: рис.3 Ну, а теперь самое интересное: //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if (fhealth>10) {fhealth-=5;}; updateValue(); } А теперь разберём инструкции подробнее: Unit1.cpp.32: if (fhealth>10) {fhealth-=5;}; 00401CF8 D90598414000 fld dword ptr [$00404198] //грузим в стек FPU 100.0 00401CFE D9052C1D4000 fld dword ptr [$00401d2c] // грузим в стек FPU 5.0 //Сейчас ST(0)=10, а ST(1)=100 00401D04 D9C9 fxch st(1) // меняет местами содержимое регистров //Сейчас ST(0)=100, а ST(1)=10 00401D06 DAE9 fucompp // сравнивание с двойным выталкиванием из стека //Сейчас ST(0)=Empty, а ST(1)= Empty (что означает пустые) Флаги FPU поменялись Было/стало рис.4 00401D08 DFE0 fstsw ax Лезу в справку: fstsw и fnstsw сохраняют текущее значение слова статуса FPU в указанном месте. Операндом-адресатом может быть либо 16 бит в памяти, либо регистр AX. fstsw перед сохранением слова проверяет на подвешенные немаскируемые прерывания, fnstsw этого не делает Короче какие-то флаги FPU загнали в AX рис.5 00401D0A 9E sahf // загружаем ah в младший байт регистра eflags рис.6 00401D0B 7612 jbe $00401d1f // jbe не работает когда 10<100 при флагах CPU: CF=1 и ZF=1 // а теперь вы полнение записи здоровья 00401D0D D905301D4000 fld dword ptr [$00401d30] // грузим 5 в ST(0) 00401D13 D82D98414000 fsubr dword ptr [$00404198] // от здоровья отнимаем ST(0) и сохраняем здоровье в ST(0) 00401D19 D91D98414000 fstp dword ptr [$00404198] // выталкиваем и записываем вновь здоровье Unit1.cpp.33: updateValue(); 00401D1F FF75FC push dword ptr [ebp-$04] 00401D22 E80D000000 call TForm1::updateValue() // ну, а это уже пошла моя функция обновления… 00401D27 59 pop ecx Заключение. Короче говоря, берём на зуб: Unit1.cpp.32: if (fhealth>10) {fhealth-=5;}; 00401CF8 D90598414000 fld dword ptr [$00404198]// fhealth 00401CFE D9052C1D4000 fld dword ptr [$00401d2c]// 10.0 00401D04 D9C9 fxch st(1) 00401D06 DAE9 fucompp 00401D08 DFE0 fstsw ax 00401D0A 9E sahf 00401D0B 7612 jbe $00401d1f // if (fhealth>10) {fhealth-=5;}; 00401D0D D905301D4000 fld dword ptr [$00401d30] 00401D13 D82D98414000 fsubr dword ptr [$00404198] 00401D19 D91D98414000 fstp dword ptr [$00404198] Unit1.cpp.33: updateValue(); 00401D1F FF75FC push dword ptr [ebp-$04] Этот шаблон вы можете применить в своих скриптах, когда некоторый параметр не должен быть меньше другого некоторого параметра. Не знаю как вы, я подумал сложные скрипты лучше писать на С++ реализованные в dll, которые можно подгрузить скриптами CE, но об этом позже...
  11. Трейнер получился красивым. Я давным давно склоняюсь к тому чтобы к трейнерам с автоассемблером был некоторый модуль, тогда сами трейнеры могли бы быть малых размеров и они бы работали при условии, что есть этот модуль. А его можно собрать из исходников CheatEngine. ps Я сделал мини-тутор по работе с FPU числами компилятора Borland C++. Заливаю... Надо ещё понять в какой раздел тему создать с этим тутором.
  12. Да, не очень сложен этот FPU. Вообще хорошо бы каждому разобраться с подобными инструкциями окончательно, чтобы как я делать меньше ошибок. Да и мне бы тоже не помешало,поэтому может быть тутор сегодня сделаю, но никому не обещаю.
  13. Попробуй исправить на fld [_m] fsubp ST,ST(2) fld [_m] faddp ST,ST(2) Где метка _m содержит: _m: dd float(20) В OllyDbg не будут компилироваться float(20) - это естественно.
  14. Я написал по памяти, но могу ошибаться. Обычно, ошибки в логике написания инструкций FPU я сразу вижу и испрвляю при пошаговой отладке со справочником перед глазами, что и советую. [sp=Код][ENABLE] aobscan(_faddress,f3xxxxxxxx0fxxxxxxxxxxxxxxxx8bxx76xx33xx38xxxxxxxxxx74xxxxxxxxxx) alloc(_newmem,2048) label(_returnhere) label(_originalcode) label(_newmem2) label(_flag) registersymbol(_flag) _newmem: pushf push ecx mov ecx,[_flag] cmp al,1 cmp byte ptr [_flag],1 jne _newmem2 cmp dword ptr [eax+30],0 jbe _originalcode fld [eax+30] // отнимаем 20 fld float(20) fsubp ST,ST2 fstp [eax+30] mov byte ptr [_flag],0 jmp _originalcode _newmem2: cmp al,2 jne _originalcode cmp dword ptr [eax+30],42C80000 //100.0 jae _originalcode fld [ecx+30] fld float(20) faddp ST,ST2 fstp [ecx+30] mov byte ptr [_flag],0 _originalcode: pop ecx popf movss xmm0,[eax+30] jmp _returnhere _flag: dd 0 _faddress: // 006B2965 = JustCause2.exe+2B2965 jmp _newmem _returnhere: [DISABLE] aobscan(_faddress,0fxxxxxxxxxxxxxxxx8bxx76xx33xx38xxxxxxxxxx74xxxxxxxxxx) _faddress-5: movss xmm0,[eax+30] dealloc(_newmem) //Alt: db F3 0F 10 40 30[/sp]
  15. А я знаю почему так Для этих целей надо пользоваться инструкциями сопроцессора FPU... Так что надо скрипт немного подправить. Если не получится, то я помогу попозже.
  16. Windows API (application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows и Windows NT корпорации «Майкрософт». Является самым прямым способом взаимодействия приложений с Windows. Для создания программ, использующих Windows API, «Майкрософт» выпускает SDK, который называется Platform SDK и содержит документацию, набор библиотек, утилит и других инструментальных средств. Английская WinApi32: скачать Русская справка: Краткий вариант: перейти Полный вариант: перейти Ещё справочник перейти Предназначение функций сразу видно из названия, вам нужно запомнить только для чего какая функция нужна, а далее лазить только по справочникам для уточнения. Список функций, которые часто используются при создании трейнера: GetAsyncKeyState TranslateMessage DispatchMessage FindWindow IsWindow GetWindowThreadProcessId OpenProcess ReadProcessMemory WriteProcessMemory CloseHandle Менее используемые GetHandleInformation Эта функция позволит понять иерархию созданных процессов в том случае если у игры есть запускающий процесс, а надо патчить память дочернего. GetLastError Возвратит ошибку той или иной операции CreateRemoteThread Когда требуется создать поток в чужом процессе выполнив некоторый код. Например, загрузки dll и выполнения её функций внутри чужого процесса. Или выполнение какой-то функции игры по заданным параметрам и т.д. LoadLibrary Загрузка исполняемого модуля в адресное пространство игры. Хотел также написать функции которые хорошо бы знать “ВООБЩЕ”, а в итоге понял, что надо посоветовать вам читать полный справочник по WinAPI32. Ссылки можете найти в самом верху. А теперь более подробнее с примерами на языке Дельфи. Принцип работы одинаков на других языках программирования для платформы Windows32/64 Приминение функций: FindWindow IsWindow GetWindowThreadProcessId OpenProcess ReadProcessMemory CloseHandle
  17. Я поправил исходники. До этого не хватало описания структуры "TPole" и общего описания модуля, теперь оно полное.
  18. Ну, я так понял что проблема уже решена.
  19. Игру я вроде запускал через D3DWindower-English.exe Я плохо понял термин "завесить"
  20. Ссылка (нажать на синюю стрелку для закачки)
  21. Как у тебя так получилось, может ты не так создал проект?! Может ты по какому-то примеру делал, можешь указать? Поищи в интернете простой пример создания приложения на Дельфи. Я думаю тогда вопросы будут решены...
  22. Самого главного ты не написал... ecx чем является? Это я потому спрашиваю, что на этой инструкции проскакивают множество адресов. Отсюда не понятно, чему должен быть равен ecx
  23. В общем я так и не понял как тут координаты работают. Одну координату я так и не нашёл. Вот прототип скриптов, может кто захочет доработать. А я пока это дело оставляю. Флоат режим работает только в двух плоскостях - вертикальной и какой-то боковой. [ENABLE] alloc(_newmem,2048) label(_coord) registersymbol(_coord) label(_fx) label(_fy) label(_fz) registersymbol(_fx) registersymbol(_fy) registersymbol(_fz) label(_procMov) registersymbol(_procMov) label(_loop1) label(_next) label(_nextflag) _newmem: _procMov: // передвижение pushf push eax push ebx push ecx lea eax,[_fx] lea ebx,[_coord] xor ecx,ecx _loop1: cmp byte [eax+ecx],00 // проверяем флаги разрешения je short _next lea ebx,[ebx+ecx*4] cmp byte [eax*ecx],01 // проверяем флаги разрешения jne short _nextflag fld1 fld [ebx] faddp ST(2),ST // прибавляем 1 к координатам fstp [ebx] _nextflag: cmp byte [eax*ecx],02 // проверяем флаги разрешения jne short _next fld [ebx] fld1 fsubp ST(2),ST // отнимаем 1 от координат fstp [ebx] _next: inc ecx // ув. и проверяем счётчик cmp ecx,3 jne _loop1 mov byte [_fx],0 mov byte [_fy],0 mov byte [_fz],0 pop ecx pop ebx pop eax popf ret _newmem+70: // из-за выравнивания по 16 байтам инструкций SSE _coord: // структура координат dd (float)0 dd (float)0 dd (float)0 dd (float)1 // флаги разрешения премещения _fx: db 0 _fy: db 0 _fz: db 0 [DISABLE] dealloc(_newmem) unregistersymbol(coord) unregistersymbol(_procMov) unregistersymbol(_fx) unregistersymbol(_fy) unregistersymbol(_fz) //Alt: db 0F 28 44 24 10 [ENABLE] aobscan(_faddress,66xxxxxxxx8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx) alloc(_newmem,2048) label(_returnhere) label(_originalcode) label(Init) label(_Init) _newmem: pushf push ecx mov ecx,[metro2033.exe+62A7C0] lea ecx,[ecx+70] cmp ecx,esi jne short _originalcode // др. персонажи? cmp byte [Init],1 // инициализация была? jne short _Init call _procMov movaps xmm0,[_coord] _originalcode: pop ecx popf db 66 0F D6 46 30 //movq [esi+30],xmm0 jmp _returnhere _Init: push eax mov eax,[esi+30] // пришлось писать так, т.к. не компилируется movaps [_coord],xmm0, mov [_coord],eax mov eax,[esi+34] mov [_coord+4],eax mov eax,[esi+38] mov [_coord+8],eax mov eax,[esi+3C] mov [_coord+0C],eax pop eax mov byte [Init],1 jmp short _originalcode Init: db 0 _faddress: // 00753ECF = metro2033.exe+353ECF jmp _newmem _returnhere: [DISABLE] aobscan(_faddress,8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx) _faddress-5: db 66 0F D6 46 30 //movq [esi+30],xmm0 dealloc(_newmem) //Alt: db 66 0F D6 46 30 В CE я ввёл три адреса _coord, _coord+4, _coord+8. Ставил на них заморозку с увелечением/уменьшением на 0,1. В итоге двигался в двух плоскостях и мог проходить сквозь стены. В идеале надо управлять этими флагами _fx: db 0 _fy: db 0 _fz: db 0 Но я что-то намудрил в цикле _loop1: cmp byte [eax+ecx],00 // проверяем флаги разрешения je short _next lea ebx,[ebx+ecx*4] cmp byte [eax*ecx],01 // проверяем флаги разрешения jne short _nextflag fld1 fld [ebx] faddp ST(2),ST // прибавляем 1 к координатам fstp [ebx] _nextflag: cmp byte [eax*ecx],02 // проверяем флаги разрешения jne short _next fld [ebx] fld1 fsubp ST(2),ST // отнимаем 1 от координат fstp [ebx] _next: inc ecx // ув. и проверяем счётчик cmp ecx,3 jne _loop1 До супер прыжка пока не дошёл.
  24. А для чего её смотреть? А то я её найду, а дальше какая цель? Есть некоторый смысл, когда играешь в других играх даже с бессмертием - проваливаешься в "яму" и начинай карту заного. Но самое важное, так называемое перемещение по карте чек-поинтов или каких либо ресурсов для выполнения миссии: в ассасине это флажки, в Сталкере - интересные места зон. В GTA 4 (и др. версиях) может быстро пригодиться быть у дома или на некоторых островах телепортируясь по координатам из базы данных координат... Но в общем иногда телепорт может быть полезным. Я тоже вручную делал какую-то цепочку на здоровье и обнаружил много "обратных" указателей из структур в структуре героя. Т.е. в структуре1 героя есть структура2, в которой есть указатель на структуру1 героя. На структуру2 есть статический указатель. CE скорее всего не учитывает структуры, которые циклически друг на друга указывают. Если ты хочешь посмотреть сколько взаимных указателей в струтуре героя, то в CE 5.5 RUS кликни на "P", найди окно поиска взаимных указателей и введи структуру игрока и смещение его здоровья. Так я нашёл около 10-20 (точно не помню) взаимно ссылающихся структур. Данная "ссылочность друг на друга" очень распространена в объектно-ориентированном программировании.Короче я остановился на указателях [[metro2033.exe+62A7C0]+1E4] = здоровье. [metro2033.exe+62A7C0]= структура героя. А с патронами я ещё не возился. Сейчас буду возиться с float-режимом по горячим клавишам, суперждампом и внедрением dll - чтобы можно было игрока двигать из внешнего окна, которое создаёт dll (возможно мне это пригодится потом + опыт во внедрении будет, может быть статью потом накатаю с исходниками и комментариями)
  25. У меня получилось установка по координатам Новый бесценный опыт - я направил себя в одно место и некоторых людей случайно По какому-то критерию не все направились в одно место. Получается что я могу переставлять не только себя но и других игроков. Но скрипты пока не доработаны. Создаю структуру координат [ENABLE] alloc(_newmem,2048) label(_coord) registersymbol(_coord) _newmem: _coord: dd (float)48.45 dd (float)2.96 dd (float)-3.54 dd (float)1 // чё это за данные я без понятия [DISABLE] dealloc(_newmem) unregistersymbol(coord) //Alt: db 0F 28 44 24 10 Скрипт без фильтра, который переставляет всех (или почти всех) в указанные координаты. Скоро я его изменю. [ENABLE] aobscan(_faddress,66xxxxxxxx8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx) alloc(_newmem,2048) label(_returnhere) label(_originalcode) _newmem: movaps xmm0,[_coord] _originalcode: db 66 0F D6 46 30 //"movq [esi+30],xmm0" - не компилировалось, поэтому пришлось писать байтами jmp _returnhere _faddress: // 00753ECF = metro2033.exe+353ECF jmp _newmem _returnhere: [DISABLE] aobscan(_faddress,8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx) _faddress-5: db 66 0F D6 46 30 //movq [esi+30],xmm0 dealloc(_newmem) //Alt: db 66 0F D6 46 30
×
×
  • Создать...

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

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