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

Xenus 2: Белое золото. Чит на здоровье


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

Хотел бы узнать в чём у тебя возникла сложность сделать бесконечное здоровье в "Xenus 2: Белое золото"?

Не мог найти точный адрес здоровья. Если получится правильно описать всю систему жизней. Ее можно увидеть на скрине ниже:

post-5-1297350075,05_thumb.jpg

Всего в игре жизней 102. Они отображается в левом нижнем углу, цифрами. Тебя могут убить сразу, а могут медленно и мучительно. То есть, если попадут сильно я умираю сразу. Если медленно то на экран выходит сообщение что я ранен в руки. Я не могу точно стрелять. Потом ноги. Я не могу быстро бегать. Потом тело и голова. Все это закрашивается в красный цвет. Жизни в цифрах тоже уменьшаются. Но иногда и резко повышаются на немного.

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

Короче, я нуб в поисках.

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

Интересно.. судя по этой теме на ПГ (http://www.playground.ru/cheats/9704/) я тоже пытался ломать эту игру в далёком 2008 году и тоже не смог разобраться со здоровьем. Но то было в 2008 году, надо сейчас попробовать)

Вот мне интересно как я эту игру прошёл? Не помню, неужто без бессмертия? Не верю))

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

Я могу предположить с точностью до 90% как я там схема, хотя я не видел этой игры даже на скриншотах, кроме того который ты привёл.

Скорее всего, общее здоровье солдата состоит из суммы значений. Левая и правая нога и рука, тело, голова.. Также защита на голове - шлем, броня на теле. Если действительно там такая "схема здоровья", то я бы постарался отсеивать значения 4 байта с точкой когда меняется состояние от нормального к плохому и наоборот определённой части тела например туловища. Я бы взял бы побольше аптечек и попадал бы изредка под обстрел. Это самый простой вариант выйти на адреса здоровья. Они могут находится скорее всего рядом друг с другом, а могут и на каком-то расстоянии... В прошлой какой-то игре я нашёл адрес полоски здоровья и вышел по коду вверх на цикл где складывалось состояние каждой части тела и обмундирования. Так что вот так вот.

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

Я пока нашёл экранное общее здоровье, меняет только значение на экране, но фактически ничего не меняет. Здоровье ищется как float делённое на 100. т.е. 100 на экране = 0.99 - 1.00 в памяти. Части тела с наскока по аналогии найти пока не смог. Кстати, части тела там: голова, торс, левая и правая руки, левая и правая ноги. С бронежилетом не разбирался. Сильно мешает периодические зависания игры без возможности убить процесс игры в диспетчере задач - висит намертво(( каждый раз приходится ребутить комп и искать всё заново. Надоедает...

Как вариант, в игре есть lua-скрипты, можно сделать чит-коды через них, без тренера. Если разобраться в доступных командах...

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

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

У меня один раз игра подвисла, после того как я сделал иньекцию CE. Но игра была в оконном режиме и я с помощью клавиатуры убил процесс CE 6,0- всё закрылось - не пришлось перезагружаться. Возможно, это заморочки CE 6.0 и следует покапаться в её настройках. В следующий раз я сделал иньецию на дельнги снова и затем тут же выключил и больше у меня ничего не зависало.

Сигнатуру кода не привожу, т.к. некогда было её делать. Инструкция "game.dll"+F251: срабатывает, когда пользователь лезет в инвентарь и в этот момент у него становиться 9999999 песо. Но они отнимаются, когда пользователь что-то покупает.

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

newmem:
mov [eax+00000CC4],#9999999
originalcode:
mov eax,[eax+00000CC4]

exit:
jmp returnhere

"game.dll"+F251:
jmp newmem
nop
returnhere:


[DISABLE]
dealloc(newmem)
"game.dll"+F251:
mov eax,[eax+00000CC4]
//Alt: db 8B 80 C4 0C 00 00

Перейдём к читу здоровья.

В вашем Xenuse

Есть два адреса здоровья:

Один статический, а другой динамический.

Если на динамический постравить бряк, то прервёмся здесь (у вас может быть другая dll-ка)

 game.dll+79BF3 - F3 0F11 99 98100000  - movss [ecx+00001098],xmm3
game.dll+79BFB - 33 C0 - xor eax,eax
game.dll+79BFD - 8D 91 7C0C0000 - lea edx,[ecx+00000C7C]
game.dll+79C03 - 56 - push esi
game.dll+79C04 - 0FB6 F0 - movzx esi,al
game.dll+79C07 - 83 FE 05 - cmp esi,05
game.dll+79C0A - 77 11 - ja game.dll+79C1D

Здесь нужно посмотреть по ecx начало структуры.

В сканере памяти ввести поиск адресов от ecx, до где-то ecx + 0x1098+0x2000 = ecx + 0x3098;

Вам нужно закупиться всякими шприцам взломав деньги. И наблюдать например за ногами. Сложность поставьте лёгкую чтобы боты стреляли по ногам чаще.

Ну так вот поставьте поиск в MHS значения float. Всегда делайте первый отсев: уменьшилось, увеличилось, не изменилось(если уверены) и + дополнительный отсев по промежутку от 0,0 до 1,0.

Возможно, можно так найти адрес (у меня к сожалению оврал со временем и в выходные тоже не будет)

--------

Ещё один способ поставить условнй бряк в CE на (см. выше)

game.dll+79BF3 - F3 0F11 99 98100000 - movss [ecx+00001098],xmm3

Процесс игры должен остановиться.

Зделайте трейс на 5000 или более инструкций (если что-то подвиснет, то минут через 10 отвиснет, не вздумайте это делать в полноэкранном режиме)

Посмотрите вверх по коду как значение попадает в xmm3. Изучите инструкции SIMD.

1) Можете следить есть ли выше по коду этот xmm3 (я к сожалению его не увидел на три уровня вверх). Если нет заглядывайте в выше стоящие call-ы ставя условные бряки (если не знаете как делать то не делайте этого) - я это не успел сделать.

2) Я точно не помню, по моему есть инструкция которая крутит регистры XMM как барабан вверх или вниз смещая их.Значит от инструкции

game.dll+79BF3 - F3 0F11 99 98100000 - movss [ecx+00001098],xmm3

нужно искать либые инструкции которые поместили значение в xmm3. Обращайте внимание на циклы. Потому что в xmm3 - это явно результат цикла.

3) Соледующие действия тоже могут помочь.

Сделайте так чтобы game.dll (она запротокчена старфорсом) распаковалась в памяти игры (просто запустите её). Сохраните её дамп и проанализируйте IDA + hexarrays. Испольузуйте Petools

Могут быть и другие подходы, которые более быстро помогут, но у меня не было времени изучить это дело.

Пока всё.

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

А я тем временем написал lua-скрипт, отображающий цифровое значение здоровья частей тела при наведении на них (в инвентаре ноги-руки можно выделять и их здоровье отобразится снизу вместо денег) Почему в графе денег? Потому что графа здоровья выводит только целые, а в деньгах тип float отображается корректно. Если кому будет интересно, могу поделиться lua-скриптом, хотя толку от него немного... Короче говоря нашёл я зелёные (НЕ динамические) адреса частей тела, динамического дубликата не обнаружилось, менять значения бесполезно (если число заморозить, то перезайдя в инвентарь увидим, что и там число изменилось, но без заморозки тут же восстанавливаеся в первоначальное значение). В общем, теперь надо копаться в Olly и смотреть что там с этими значениями происходит. Есть в игре функция закрашивания частей тела в разные цвета при попадании. Вполне возможно, что именно она, "видя" цвет тела, восстанавливает числовое значение. А может и не она... копаю дальше.

PS у меня кстати другая dllка вместо game.dll - vital.dll, а игра пропатчена до 1.01. Сейчас попробую другой кряк.

PSS вместо завешивания денег и покупки шприцов можно банально воспользоваться консольной командой addhealth, а вражеские пули заменить на бочку с огнём. Бочка будет ранить все части тела) так проще здоровье искать..

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

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

Тут надо ставить бряк на запись и следить каким образом идёт запись восстановленного значения.

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

А я тем временем написал lua-скрипт, отображающий цифровое значение здоровья частей тела при наведении на них (в инвентаре ноги-руки можно выделять и их здоровье отобразится снизу вместо денег) Почему в графе денег? Потому что графа здоровья выводит только целые, а в деньгах тип float отображается корректно. Если кому будет интересно, могу поделиться lua-скриптом, хотя толку от него немного...

Поделись :)

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

Делюсь - аттач распаковать в папку \White Gold\UI\PC\Control\

Открываем инвентарь, наводим мышку на части тела и видим в экране суммы денег значение здоровья в том виде, в каком его можно поискать в CE (только не надо вводить всю эту кучу цифр после запятой, округляйте до 4-5 знаков хотя-бы :) ) Чтобы вновь увидеть сумму песо просто перезаходим в инвентарь.

PS теоретически должно работать на всех версиях игры, но я проверил только на 1.01

Scheme.rar

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

Спасибо. Очень было интересно посмотреть на эту схему. В ней даже есть текст кода для обработчиков игровых событий. Молодцы, разработчики, у них было меньше временных затрат с перекомпиляцией. Я там увидел по 822 строчке к примеру:


<Bitmap Name="bmpInventory_HeroHealthTorseInactive">
<Position x="730" y="66"/>
<Size x="82" y="138"/>
<Material MaterialID="_control_2">
<Position x="329" y="1690"/>
<Size x="82" y="138"/>
</Material>
</Bitmap>
<Bitmap Name="bmpInventory_HeroHealthTorseActive" Visible="false">
<Position x="730" y="66"/>
<Size x="82" y="138"/>
<Material MaterialID="_control_2">
<Position x="565" y="1690"/>
<Size x="82" y="138"/>
</Material>
</Bitmap>
<Bitmap Name="bmpInventory_HeroHealthTorseMask" Opacity="0.5">
<Position x="730" y="66"/>
<Size x="82" y="138"/>
<Material MaterialID="_control_2">
<Position x="81" y="1687"/>
<Size x="82" y="138"/>
</Material>
</Bitmap>
<Custom Name="customInventory_HeroHealthTorseBox">
<Position x="735" y="74"/>
<Size x="72" y="125"/>
<OnMouseIn>
SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseInactive@Visible",false);
SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseActive@Visible",true);
SetStaticProperty("lblInventory_HeroInventoryMoneyValue","@Text",tostring(Game.GetHeroHealth("Torse")));
</OnMouseIn>
<OnMouseOut>
SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseInactive@Visible",true);
SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseActive@Visible",false);

</OnMouseOut>
<OnDragAndDrop>
do
local ptrDragged = GetDraggedWidget();

if GetStaticProperty(ptrDragged,"@Name") == "icontblInventory_HeroInventoryTable" then
local nPID = GetDynamicProperty(ptrDragged,"PID");
local nRealIndex = IconTable.GetIconDataAsNumber(ptrDragged,GetStaticProperty(ptrDragged,"@CurIcon"));
Game.AddHeroHealth("Torse",Control.GetInventoryItemInfo(nPID,nRealIndex,"s"));
end
end
</OnDragAndDrop>
</Custom>

						<!-- Torse -->

Меня заинтересовал:


do
local ptrDragged = GetDraggedWidget();

if GetStaticProperty(ptrDragged,"@Name") == "icontblInventory_HeroInventoryTable" then
local nPID = GetDynamicProperty(ptrDragged,"PID");
local nRealIndex = IconTable.GetIconDataAsNumber(ptrDragged,GetStaticProperty(ptrDragged,"@CurIcon"));
Game.AddHeroHealth("Torse",Control.GetInventoryItemInfo(nPID,nRealIndex,"s"));
end
end
</OnDragAndDrop>
							<OnDragAndDrop>

Это код обработчика перетаскивания на виджет торса.

Функция пытается "добавить здоровья торсу" от свойства элемента который перетаскивается на "торс" :

Game.AddHeroHealth("Torse",Control.GetInventoryItemInfo(nPID,nRealIndex,"s"));

По всей "схеме" можно поколдовать ) Но лучший вариант всё же не в редактировании этого файла. Будет время я что-нибудь сделаю и отпишусь.

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

Я не понял, а что мы мучаемся? Перехватил инструкцию на запись общее здоровье (movss [ecx+00001098],xmm3), заменил её на стандартный "mov [ecx+00001098],(float)1" и вот оно, бессмертие :) части тела конечно краснеют, герой начинает прихрамывать и всё такое, но убить меня не могут вроде как.. вон пишу пост, а бандит бъёт меня прикладом - работает бессмертие. Бандит умирает, значит даже фильтр не нужен... Нет, наверное части тела тоже надо найти для порядка, но уже как бы и необязательно... ну и остается найти здоровье движка машины героя.

Части тела по аналогии не вешаются(( визуально всё зелёное, но прихрамывание никуда не делось.

Скрипт бессмертия для версии игры 1.01:


//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
//place your code here
mov [eax+00000C7C],(float)1 //Left Leg
mov [eax+00000C80],(float)1 //Right Leg
mov [eax+00000C84],(float)1 //Left Arm
mov [eax+00000C88],(float)1 //Right Arm
mov [eax+00000C8C],(float)1 //Torse
mov [eax+00000C90],(float)1 //Head
originalcode:
//movsd xmm2,[eax+00000C88]

exit:
jmp returnhere

"game.dll"+7C684:
jmp newmem
nop
nop
nop
returnhere:




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"game.dll"+7C684:
movsd xmm2,[eax+00000C88]
//Alt: db F3 0F 10 90 88 0C 00 00
[ENABLE]

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

Как оказалось истинное здоровье немного отличается от показанного в игре, но не сильно. 1.0 = 0.99 в игре, 0.0 = 0.009 в игре и т.д. Сами адреса находятся по соседству с найденным общим здоровьем, правда смещение отличается: 1098 и 0C7C

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

Там всё очень просто по поводу здоровья.

1) Нашли динамический адрес здорвья и один зелёный. Он зелёный, но всё равно будет меняться из-за пакера.

2) Поставили в CE бряк на запись и пошли под обстрел

3) Прервались на двух инструкциях (обе инструкции в одной функции)

62079BF3 - F3 0F11 99 98100000 - movss [ecx+00001098],xmm3

62079C39 - F3 0F11 A1 98100000 - movss [ecx+00001098],xmm4

ecx - объект героя.

Функция типа:

__int64 __fastcall t_player__RecalcGeneralHealth(int _ECX)
{
...
62079BF3 - F3 0F11 99 98100000 - movss [ecx+00001098],xmm3


цикл чтения 5 частей тела
(ECX+C7C+4*N) = здоровье частитела, где N от 1 до 5
(ECX+C7C+4*0) = общее здоровье

ecx+0x00000C7C = адрес суммые здоровья от частей тела

game.dll+79BFD - 8D 91 7C0C0000 - lea edx,[ecx+00000C7C] // смотрим внимательно за edx
game.dll+79C03 - 56 - push esi
game.dll+79C04 - 0FB6 F0 - movzx esi,al
game.dll+79C07 - 83 FE 05 - cmp esi,05
game.dll+79C0A - 77 11 - ja game.dll+79C1D
game.dll+79C0C - FF 24 B5 - jmp dword ptr [esi*4]

game.dll+79C0F - 48 - dec eax
game.dll+79C10 - 9C - pushfd
game.dll+79C11 - 07 - pop es
game.dll+79C12 - 62 0F - bound ecx,[edi]
game.dll+79C14 - 28 C1 - sub cl,al
game.dll+79C16 - EB 08 - jmp game.dll+79C20

game.dll+79C18 - 0F28 C2 - movaps xmm0,xmm2
game.dll+79C1B - EB 03 - jmp game.dll+79C20

game.dll+79C1D - 0F28 C3 - movaps xmm0,xmm3
game.dll+79C20 - F2 0F10 22 - movsd xmm4,[edx] <<<< а вот обращение к адресам здоровья, сделаем инъекцию сздесь!
game.dll+79C24 - 83 C0 01 - add eax,01
game.dll+79C27 - F3 0F59 E0 - mulss xmm4,xmm0
game.dll+79C2B - F3 0F58 A1 98100000 - addss xmm4,[ecx+00001098]
game.dll+79C33 - 83 C2 04 - add edx,04
game.dll+79C36 - 83 F8 06 - cmp eax,06
game.dll+79C39 - F3 0F11 A1 98100000 - movss [ecx+00001098],xmm4
game.dll+79C41 - 7C C1 - jnge game.dll+79C04

...
62079C39 - F3 0F11 A1 98100000 - movss [ecx+00001098],xmm4
}

Сама инъекция:

[ENABLE]
aobscan(_faddress,f2xxxxxx83xxxxf3xxxxxxf3xxxxxxxxxxxxxx83xxxx83xxxxf3)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)

_newmem:
mov [edx],(float)1
_originalcode:
movsd xmm4,[edx]
add eax,01
jmp _returnhere

_faddress: // 62079C20 = game.dll+79C20
jmp _newmem
nop
nop
_returnhere:

[DISABLE]
aobscan(_faddress,9090f3xxxxxxf3xxxxxxxxxxxxxx83xxxx83xxxxf3)

_faddress-5:
movsd xmm4,[edx]
add eax,01

dealloc(_newmem)
//Alt: db F2 0F 10 22 83 C0 01

По эскпериментам __int64 __fastcall t_player__RecalcGeneralHealth(int _ECX) передаётся только главный герой. Но если ещё кто-то будет бессметрным, то напишите или сами сделайте фильтр.

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

  • 2 недели спустя...

Уважаемые господа,не подскажите куда совать эту инъекцию,так-как в програмировании я ничего не понимаю,да и учитсья уже поздновато.

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

Скрипт добавить в окно автоассемблера вызвав его из главного окна Cheat Engine нажатием "ctrl+alt+a". Затем в окне автоассемблера вызывать меню "добавление скрипта" в главное окно Cheat Engine. В последнем в области таблицы появится надпись с галочкой... Запустить процесс игры. В Cheat Engine подключиться к этому процессу. А теперь нажать на галочку. Подождать какое-то время пока будет инъекция. Ну и все.

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

С жизнями разобрались.

  • Я только что узнал, что красная полоска слева от "сидячего человечка" это стамина. То есть, сколько времени ты можешь бегать.
    post-5-1297350075,05_thumb.jpg
  • Еще надо сделать "бесконечное место в рюкзаке".
    post-5-1299154484,64_thumb.jpg

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

Машина
Игрок
Управление игроком
Управление машиной
-------
Обработчик нажатий клавиш()
{
...
Если игрок не находится ни в каком транспорте,
то управлять игроком
Если игрок находится в транспорте, то управлять
транспортом
...
}

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

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

  • 5 месяцев спустя...

Люди, здрасьте, ваш скрипт на бессметрие очень хорошо работает, а как бы сделать патроны беск. и бег?

А, и еще, как сделать бессмертие в первой части игры патч 2.2

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

Люди, здрасьте, ваш скрипт на бессметрие очень хорошо работает, а как бы сделать патроны беск. и бег?

А, и еще, как сделать бессмертие в первой части игры патч 2.2

Самый простой способ.

Найти адреса значений здоровья, патронов, усталость используя сканер памяти (CheatEngine, Atmoney ...)

Поставить своё значение по адресу и заморозить.

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

  • 11 месяцев спустя...

Я пока нашёл экранное общее здоровье, меняет только значение на экране, но фактически ничего не меняет. Здоровье ищется как float делённое на 100. т.е. 100 на экране = 0.99 - 1.00 в памяти. Части тела с наскока по аналогии найти пока не смог. Кстати, части тела там: голова, торс, левая и правая руки, левая и правая ноги. С бронежилетом не разбирался. Сильно мешает периодические зависания игры без возможности убить процесс игры в диспетчере задач - висит намертво(( каждый раз приходится ребутить комп и искать всё заново. Надоедает...

Как вариант, в игре есть lua-скрипты, можно сделать чит-коды через них, без тренера. Если разобраться в доступных командах...

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

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

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

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

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

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