Justman Опубликовано 20 апреля, 2015 Поделиться Опубликовано 20 апреля, 2015 ДВС!Стал интересен процесс реверс инжиниринга. После просмотров мануалов на ютубе от GameHackLab и Keng'а, появились начальные знания в этой области, за что им большая благодарность! При анализе игры CS 1.6 возникла такая проблема:Не получается найти реальный адрес здоровья игрока (ХП). При поиске по значению, выдается 8 адресов и дальнейшим отсеиванием это число не изменяется. Есть 1 статический адрес, который отвечает за вывод значения ХП на экран. Остальные 7 адресов, никаким образом не влияют на истинное значение ХП. При их заморозке в Cheat Engine (CE), значения продолжают уменьшаться. Если взять любой из этих 7 адресов и поставить breakpoint на запись, то выходит инструкция такого вида :mov edx, [eax + 10]В стуктуре eax по смещению 10 записано значение ХП на данный момент.Подскажите, как найти настоящее значение? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 20 апреля, 2015 Поделиться Опубликовано 20 апреля, 2015 Привет! Если мне не изменяет память, то во всех играх на движке Half-Life реальное значение здоровья - это экранное * 8. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 21 апреля, 2015 Поделиться Опубликовано 21 апреля, 2015 Здаров!Может надо искать тип поиска float...как в Condition Zero. Ссылка на комментарий Поделиться на другие сайты Поделиться
Justman Опубликовано 21 апреля, 2015 Автор Поделиться Опубликовано 21 апреля, 2015 Настоящий адрес нашелся через функцию нанесения урона. Причем порадовало, что он статический. Значения в нем хранятся в виде Float. Следующая трудность возникла с реализацией бессмертия - данные о здоровье игрока и противника лежат в одной структуре. Как в этом случае отфильтровать по принципу "свой-чужой"? Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 21 апреля, 2015 Поделиться Опубликовано 21 апреля, 2015 Понятно! Значит по одной инструкции работают адрес(а) твои и ботов тоже...Знаю 3 варианта как отфильтровать...1: Найти многоуровневый указатель.2: Анализ данных/структур.3: Использовать регистры со смещениями. Ссылка на комментарий Поделиться на другие сайты Поделиться
Justman Опубликовано 21 апреля, 2015 Автор Поделиться Опубликовано 21 апреля, 2015 (изменено) Т.е. написать как фильтр, скрипт вроде этого:alloc(newmem,2048)label(returnhere)label(originalcode)label(exit)newmem:cmp [eax+10],#100jne exitoriginalcode:fld dword ptr [eax+10]jmp returnhereexit:fld dword ptr [eax+10]mov [eax+10],(Float)100jmp returnhere"css.dll"+977C9:jmp newmemnopreturnhere:[DISABLE]"css.dll"+977C9:fld dword ptr [eax+10]dealloc(newmem)Спасибо за подсказку. Буду работать в этом направлении. Изменено 21 апреля, 2015 пользователем Justman Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 21 апреля, 2015 Поделиться Опубликовано 21 апреля, 2015 Ну что-то в этом роде! Главное что бы работало всегда и везде.Если что, скрипт можно всегда отфиксить...В общем удачного взлома!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 апреля, 2015 Поделиться Опубликовано 21 апреля, 2015 Попробую подсказать - в современных версиях CS (Source и GO) есть разделение игроков на команды. Думаю, что такое же есть и в 1.6. Обычно это целое число, 0, 1 или 2. 0 в данном случае - "наблюдатель" (spectator), который бесплотным духом ездит по карте и просто смотрит, как другие играют. Соответственно, 1 и 2 - T и CT. Ссылка на комментарий Поделиться на другие сайты Поделиться
Justman Опубликовано 22 апреля, 2015 Автор Поделиться Опубликовано 22 апреля, 2015 Все структуры игроков изучил по несколько раз, идентификатор команды так и не нашел. Ни 0 - SP, 1 -TR, 2 - CT. Ни 1 - SP, 2 -TR, 3 - CT. Ничего похожего нет даже. Места, где совпадают по команде значения, меняются при перезапуске Пришлось зацепиться за идентификатор определения бота от игрока. В результате infinite_hp независимо от команды. Также на основе этого реализовал one_hit_kill. Дальнейшее направление связанно со структурой оружия. Реализовано infinite_ammo, no_recoil, rapid_fire. Ковыряю дальше Подскажите, как найти функцию отвечающую за кучность стрельбы? Хотя бы пример как она может выглядеть в листинге дизассемлера. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 апреля, 2015 Поделиться Опубликовано 22 апреля, 2015 Чаще всего это некий таймер и пара инструкций - CMP для сравнения, не равна ли текущая кучность максимальной и за ней CALL для вызова функции, которая эту самую кучность реализует. Реализуется практически так же, как и no recoil. Ссылка на комментарий Поделиться на другие сайты Поделиться
Justman Опубликовано 24 апреля, 2015 Автор Поделиться Опубликовано 24 апреля, 2015 Привет всем! Пытаюсь найти функцию, отвечающую за точность стрельбы. Перепробывал нопить call'ы, изменять значения заносимые в регистры, менять условные переходы на безусловные, менять условия перехода...В итоге сработало только затереть инструкцию или изменить вид перехода jg zbotcz.weapon_usp+602. При этом возникла проблема - появилась точность + как бонус бесконечные патроны, но...пропал дамаг.При переходе по адресу zbotcz.weapon_usp+602, расположена инструкцияПодскажите, в чем может быть причина?NullAlex: большой код принято убирать под спойлер.mov eax,[esi+000000CC]test eax,eaxmov [esi+000000FC],ecxjg zbotcz.weapon_usp+602 mov eax,[esi+000000B4]test eax,eaxje zbotcz.weapon_usp+5DAmov edx,[esi]mov ecx,esicall dword ptr [edx+0000014C]call zbotcz.func_rain+50fadd qword ptr [zbotcz.worldspawn+E768]fstp dword ptr [esi+000000B8]mov ecx,[zbotcz.`string'+16EA8]test ecx,ecxje zbotcz.weapon_usp+7FBmov edx,[esi+000000A4]mov eax,[ecx]push 00push edxpush 02call dword ptr [eax+24]pop edipop esipop ebppop ebxadd esp,24ret 000Ccall zbotcz.func_rain+50fadd dword ptr [esp+3C]mov ebx,[esi+000000CC]mov ecx,esidec ebxmov [esi+000000CC],ebx // Бряк на запись сработал здесьfld dword ptr [zbotcz.worldspawn+E750] // 0000000000ret Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 апреля, 2015 Поделиться Опубликовано 24 апреля, 2015 (изменено) Подскажите, в чем может быть причина?Во-первых не понятно - на что ты ставил бряк (на дамаг?) // Бряк на запись сработал здесь.PS: И ещё jg - это оригинальный прыжок или уже изменённый тобой? Во-вторых предположу, что раз ты игрался с переходом jg zbotcz.weapon_usp+602., то видимо игра не получает значение дамага и тебе его нужно занести в адрес, наверное нужно сделать так, перед прыжком jg zbotcz.weapon_usp+602 записать в адрес [zbotcz.worldspawn+E750], какое-нибудь значение, типа: mov dword ptr [zbotcz.worldspawn+E750],(float)1000 а после пусть инструкцияfld dword ptr [zbotcz.worldspawn+E750] // (float)1000ret выталкивает это значение в стек.Попробуй, может получиться. Изменено 24 апреля, 2015 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Justman Опубликовано 24 апреля, 2015 Автор Поделиться Опубликовано 24 апреля, 2015 Код оригинальный. Бряк ставил на количество патронов в обойме. Через него вышел на структуру оружия. Там и нашел функции подсчета патронов, скорострельность, отдачу. Нашел даже функцию стрельбы отсечками. А на функции точности стрельбы застрял. Сделал как сказал Garik66, не помогло. Крашится. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 24 апреля, 2015 Поделиться Опубликовано 24 апреля, 2015 Тогда вот это: В итоге сработало только затереть инструкцию или изменить вид перехода jg zbotcz.weapon_usp+602.нужно поподробней изложить. Какую инструкцию nopиш? И на какой переход меняешь? Ссылка на комментарий Поделиться на другие сайты Поделиться
Justman Опубликовано 26 апреля, 2015 Автор Поделиться Опубликовано 26 апреля, 2015 Вроде всё ясно написано. Перепробывал нопить call'ы, изменять значения заносимые в регистры, менять условные переходы на безусловные, менять условия перехода...В итоге сработало только затереть инструкцию или изменить вид перехода jg zbotcz.weapon_usp+602. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения