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

Grand Theft Auto IV - Episodes From Liberty City

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

Я написал ДаркБайту предложение добавления LUA-скриптов в таблицу CE (также как и автоассемблерных скрипты)... также чтобы можно было вешать горячие клавиши на скрипт LUA. Так что ждём реакции автора CE.

Поделиться сообщением


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

Может сделает кто тренер для русской 1С версии?

Вот кому интересно можете опробовать мои наработки для 1С-версии 1.1.0.1 с отключенным LIVE. Тестировалось на TLAD, на TBOGT не проверял.

Здоровье, деньги, звёзды розыска вроде нашёл. Адреса патронов сбиваются после смены оружия, правильной цепочки указателей до них не нашёл. Полноценных скриптов тоже сделать не смог, т.к. все игровые значения обрабатываются одной функцией LiveGetDWORD или LiveSetDWORD, фильтр пока не получилось написать. В качестве бонуса скрипт заморозки скоростей по осям XYZ (морозятся ГГ, все пешеходы и некоторые (не знаю почему не все) машины) и возможность летать.

EFLC.rar

Поделиться сообщением


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

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

Только сейчас увидел версии игр разные...

Поделиться сообщением


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

aliast для какой версии CE данная таблица?

Поделиться сообщением


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

aliast для какой версии CE данная таблица?

6.1

Поделиться сообщением


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

Проблему с олей решил, скрипты хексоровского тренера добыл. Вообще всё должно быть несложно, но пока туплю... Итак, функция _XLivePBufferGetDWORD@12 как её окрестил олли работает с неким буфером. В начале этого буфера всегда стоит magic dword DEADDEAD. Далее к этому адресу добавляется смещение 10 и получается исходный адрес патронов, здоровья и всего остального (под каждый параметр отводится свой отдельный буфер). Смещение помоему всегда 10, хотя есть доп. регистр, всегда равный нулю. т.е. получается нужно копать в сторону нахождения инструкции, работающей не с найденным адресом, а с найденным адресом - 10h. Ищем патроны отнимаем 10h от найденного адреса и.. нет, бряк ставить бесполезно, окажемся во всё той же злосчастной _XLivePBufferGetDWORD@12. Бряк нужно ставить на все вызовы этой функции и искать участок кода, в котором через стек передавался бы наш адрес. Причём должен найтись такой код, который передавал бы ТОЛЬКО указатель на адрес буфера с патронами (pBugger+10h = [адрес_патронов]) как то так. Но пока никак... есть у меня эта инструкция для англ. версии игры, но как её найти, если бы её не было ума не приложу))

Поделиться сообщением


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

Кое-что становится ясно. Функции _XLivePBufferGetDWORD@12 через стек передаётся 3 параметра: указатель на буфер с данными, смещение до нужного значения в буфере, которое нужно прочесть (оно всегда равно нулю и ложится в стек командой push 00, а 10h добавляется дальше в теле функции), и переменная, в которую запишется результат выполнения функции. Другими словами нужно поставить условный бряк в олли с условием bp _XLivePBufferGetDWORD@12, [ESP+04]==00B8CE90 где 00B8CE90 - наш буфер ([патроны]-10h), а [ESP+04] - первый аргумент функции в стеке, т.е. указатель. Прерываемся, идём вверх по коду и видим, что в ESP+04 ложится push ecx содержимое регистра ecx. Ещё выше видим что именно представляет собой ecx. А представлять он может либо MOV ECX,DWORD PTR DS:[ECX] (на первом улосвном бряке), либо MOV ECX,DWORD PTR DS:[ECX+60] (на одном из последующих условных бряков). Первая инструкция обрабатывает кучу адресов, зато вторая обрабатывает ТОЛЬКО указатель на буфер с патронами! Вот в неё то и делается инъекция на чит "бесконечные патроны". Точнее не в неё, а в следующую инструкцию, чтобы ecx принял нужное значение указателя на буфер. mov [ecx+10],#999 и готово - _XLivePBufferGetDWORD@12 останется только проглотить уже изменённые данные :) В исследованном мной тренере дополнительно проводятся проверки cmp ebx,0 и cmp edi,ffffffff неизвестно с какой целью, и без них всё работает.

Подозреваю, что все прочие читы делаются схожими методами.

Поделиться сообщением


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

xlive patcher v1.2. Сразу сюда, быстро, надёжно, не удалят :lol:

xlive_patcher_v1.2.tar

Поделиться сообщением


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

Для GTA он кажется не подходит, хоть и пишет что нашёл live, но патроны не ищутся. При использовании Xliveless всё ищется.

Поделиться сообщением


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

Залей пожалуйста сюда Xliveless

Поделиться сообщением


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

Xliveless прикрепил

Вот скрипт для бессмертия, отключения розыска, 1000000 денег (броню пока не делал, да и не нужна она с бессмертием) для версии EFLC от 1С:


//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(GM1)
label(GM2)
label(nocops)
label(returnhere)
label(originalcode)
//label(pBuffer)
label(money)
label(god)
label(armor)
label(cops)
//registersymbol(pBuffer)
registersymbol(money)
registersymbol(god)
registersymbol(armor)
registersymbol(cops)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
cmp ebx,0 //первый фильтр на буфер с розыском
jne originalcode
cmp edx,2000 //второй фильтр на буфер с розыском
jne originalcode
//mov [pBuffer],ecx
cmp esi,3 //третий фильтр на буфер с розыском
jne originalcode
cmp [money],01 //+1000000$?
jne GM1
mov [ecx+90],#100000

GM1:
cmp [god],01 //беск. здоровье вкл.?
jne GM2
//mov [ecx+22D0],(float)10000 //столько здоровья хватит, чтобы не взрываться в машинах
mov [ecx+510],(float)10000
GM2:
cmp [armor],01 //беск. броня вкл.?
jne nocops
//mov [ecx+2290],(float)1000

nocops:
cmp [cops],01 //убрать звезды розыска вкл.?
jne originalcode
mov [ecx+10],00 //нет звёзд

originalcode:
lea eax,[esp]
push eax
push 00

exit:
jmp returnhere

//pBuffer:
//dd 0
money:
dd 0
god:
dd 0
armor:
dd 0
cops:
dd 0

"EFLC.exe"+8F1E3:
jmp newmem
nop
returnhere:




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
//unregistersymbol(pBuffer)
unregistersymbol(money)
unregistersymbol(god)
unregistersymbol(armor)
unregistersymbol(cops)

"EFLC.exe"+8F1E3:
lea eax,[esp]
push eax
push 00
//Alt: db 8D 04 24 50 6A 00
[ENABLE]

Upd: скрипт обновлен, теперь работает. Правда сравнение cmp edx,2000 (и другие) требует доп. проверки.

xliveless-0.999a71.rar

Изменено пользователем aliast

Поделиться сообщением


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

Спасибо, можешь помочь мне тут:

http://forum.gamehacklab.ru/topic/579-фильтры/page__st__20 и http://forum.gamehacklab.ru/topic/596-unreal-tournament/

P.s по твоему вопросу. Может попробовать разделить это всё и сделать как отдельные ф-ции

Поделиться сообщением


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

aliast, замени там где надо db на dd или поставь тип данных байта в сравнении. По умолчанию в 32-разрядных приложениях сравниваются значения типа dword-а. Поэтому такой эффект.

Поделиться сообщением


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

а ведь можно было использовать стандартные процедуры которые от скриптов :closeyes:

если интересно могу подсказать

Сорцы трейнера от 1с версии кажется 1031 не важно всё равно надо многое переписывать

http://www.datafilehost.com/download-adf0f799.html

И да он не может выполнять некоторые скриптовые функции

ещё информации http://gtamodding.ru/w/index.php?title=Scripting.pas

и ещё


push offset loc_C04290
push 62E319C6h // имя процедуры (в ранних версиях текстовое имя процедуры) ((
call sub_4CDF70
[00C05563]

идём туда и находим процедуру получения ID игрока


mov eax, dword_F1B4A4
cmp eax, 0FFFFFFFFh
jnz short loc_C02BA4
xor eax, eax
movsx eax, byte ptr [eax+4DAh]
retn
[00C02B90]  void GetPlayerId()

ну и так дальше

да в качестве бонуса )


00C01650 - mov eax, [esp+arg_0]
00C01654 - push esi
00C01655 - push eax
00C01656 - call sub_870960
00C0165B - mov esi, eax
00C0165D - mov eax, [esi+58Ch]
00C01663 - mov eax, [eax+228h]
00C01669 - add esp, 4
00C0166C - test eax, eax
00C0166E - jz short loc_C01675
00C01670 - lea ecx, [eax+60h]
00C01673 - jmp short loc_C01677
00C01675 - xor ecx, ecx
00C01677 - call sub_992BB0
00C0167C - mov ecx, [esp+4+arg_4]
00C01680 - cmp ecx, eax
00C01682 - jge short loc_C016AE
00C01684 - push 0
00C01686 - push ecx
00C01687 - mov ecx, [esi+58Ch]
00C0168D - call sub_A158B0
00C01692 - mov ecx, offset unk_15E3260
00C01697 - call sub_A6F500
00C0169C - cmp byte_182199E, 0
00C016A3 - jz short loc_C016BF
00C016A5 - mov byte_182199E, 0
00C016AC - pop esi
00C016AD - retn
00C016AE - push 2710h
00C016B3 - push ecx
00C016B4 - mov ecx, [esi+58Ch]
00C016BA - call sub_A158B0
00C016BF - pop esi
00C016C0 - retn
[00C01650] void AlterWantedLevel(Player, unsigned int)

После AlterWantedLevel не всегда изменяется уровень разыскиваемости сразу для того что бы применить незамедлительно необходимо так же выполнить [00C01700] ApplyWantedLevelChangeNow(Player)EXE взят с http://www.nodvd.net/850-gta-episodes-from-liberty-city-v11-ru-nodvd.html

  • Плюс 1

Поделиться сообщением


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

aliast, замени там где надо db на dd или поставь тип данных байта в сравнении. По умолчанию в 32-разрядных приложениях сравниваются значения типа dword-а. Поэтому такой эффект.

Да-да, ошибка была именно в этом) сейчас обновлю скрипт сверху на рабочий.

VoLT, спасибо, сейчас гляну. Может чего и пойму)

Поделиться сообщением


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

aliast собственно разобрал довольно быстро сравнивая в IDA похожие участки кода используя базу от listener'a и свежий дамп с exe эпизодов ... без него и неё ничего бы не вышло :closeyes:

PS И да Шефы плохо отозвались об этом методе :closeyes:

Поделиться сообщением


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

Лучше меня и Xipho Шефами не величать, а использовать никнеймы. Мы будем рады если называть нас по никнеймам :)

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

Поделиться сообщением


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

Вот что получилось: +10 тренер для EFLC 1.1.0.1 (1C-версия)

http://www.megaupload.com/?d=P2LGA747

Исходники прилагаются. Размер архива 9 МБ, сюда не прикрепился, поэтому на файлообменнике...

Опции:

NUMPAD1: Бессмертие

NUMPAD2:Получить броню

NUMPAD3: Стрельба без перезарядки

NUMPAD4: Отключить полицию

NUMPAD5: Получить 999999$

NUMPAD6: Неубиваемая тачка

NUMPAD7: Телепорт к точке на карте

NUMPAD8: Телепорт к цели миссии (работает не всегда)

NUMPAD9: Заморозка машин + езда сквозь машины на дороге

NUMPAD0: Режим полёта. Кнопки управления полётом: I, K, J, L, Y, H

Поделиться сообщением


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

У кого-нибудь есть инфа по указателям с офсетами до всяких там здоровья, брони, координат и проч для гта4? У меня такое ощущение что в ГТА5 движок особо не меняли и офссеты могли приблизительно остаться теми же +- парочка байт. Хочу проверить, но не знаю где офсеты надыбать.

Поделиться сообщением


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

У кого-нибудь есть инфа по указателям с офсетами до всяких там здоровья, брони, координат и проч для гта4? У меня такое ощущение что в ГТА5 движок особо не меняли и офсеты могли приблизительно остаться теми же +- парочка байт. Хочу проверить, но не знаю где офсеты надыбать.

Даже если и так, то на чем вы собрались проверить, РС версия еще не вышла. Если на PS3, то не прокатит, там совершенно другое распределение памяти.

И вычитая офсеты из адреса здоровья вы придете в лучшем случае (если эти офсеты совпадают) к началу блока виртуальной DMA памяти, адрес которого будет меняться после каждого перезапуска игры. И вам надо будет найти инструкцию, которая этот адрес рассчитывает. Если вы и найдете инструкцию, то адрес в который игра запишет начало блока - это стек - регион памяти используемый консолью для просчета, который в GTA5 точно динамический (был бы статика, не пришлось мне искать в структуре игрока и врагов различия для создания фильтра в трейнере). Поэтому тяжело будет снять этот начальный адрес.

Поделиться сообщением


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

Немного не понял. т.е. цепочки вида [[pLayer+0x14]+0x30] где pPlayer некий статический адрес для PS3 неприменимы? Ну этого не может быть. Я же нашёл цепочки указателей:

PlayerHealth = [[0x01BBC58C]+0xC0]

PlayerXCoord = [[[0x01BBC58C]+0x1C]+0x40] (+0x44 = Y; +0x48 = Z)

Car Engine Health = [[0x01ECCB38]+0x44C]

Вроде цепочки рабочие, ни разу не слетали. И ведь есть же читы для девайса usercheat в формате


3 pointer_adr offset
2 00000000 offset
...прочие оффсеты...
2 00000000 value

А так да, врядли оффсеты совпадают. Жаль :(

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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