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

Как Найти Адрес С Нужмым Значением


Grom-Skynet

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

Как найти адрес с нужным значением.

Поиск адреса который используется исполняющим кодом игры...

Введение.

Для примера будет использована игра Сталкер Чистое небо.. Принцип работы с игрой будет такой же как и в предыдущих статьях ... когда взламывали игру Metro 2033... но сложнее...

Начнем.

Как присоединить игру к отладчику уже все знают... искать будем опять текстовую метку тока на этот раз она выглядит вот так... air_control_param и стандартное значении = 0.1 ( Это управление героем ( игрокам ) в полете ).. как и где его взяли ... из конфигов игры... файл actors

Вот он весь..


[mp_skins_path]
skin_path = actors\stalker_mp\

[mp_actor]:common_ph_friction_params_on_npc_death
GroupControlSection = spawn_group
$spawn = "mp_actor"
$ed_icon = ed\ed_actor
$player = on
$prefetch = 16
cform = skeleton
class = O_ACTOR
money = 200;
rank = 3;
jump_speed = 6
crouch_coef = 0.4 ; 0.2
climb_coef = 0.7
air_control_param = 0.1
max_item_mass = 20.0;40.0
run_coef = 3.5
sprint_koef = 1.5;1.7 ; было 2.0
run_back_coef = 1.7
walk_back_coef = 0.7
walk_strafe_coef = 1.0
run_strafe_coef = 0.7
visual = actors\stalker_hero\stalker_hero_1.ogf
destroyed_vis_name = dynamics\Dead_Body\skelet_crash
walk_accel = 16 ;40 ;17 ;54 ;40
texture_prefetch = actors\stalker_mp\mp_team_green_1, actors\stalker_mp\mp_team_green_2, actors\stalker_mp\mp_team_green_3, actors\stalker_mp\mp_team_green_4, actors\stalker_mp\mp_team_blue_1, actors\stalker_mp\mp_team_blue_2, actors\stalker_mp\mp_team_blue_3, actors\stalker_mp\mp_team_blue_4, actors\stalker_mp\mp_team_green_addon_fr, actors\stalker_mp\mp_team_green_addon_uk, actors\stalker_mp\mp_team_blue_addon_de, actors\stalker_mp\mp_team_blue_addon_us, actors\stalker_mp\mp_team_green_armor_military, actors\stalker_mp\mp_team_green_armor_sci, actors\stalker_mp\mp_team_green_armor_exo, actors\stalker_mp\mp_team_blue_armor_military, actors\stalker_mp\mp_team_blue_armor_sci, actors\stalker_mp\mp_team_blue_armor_exo

;радиус в котром над предметами выводятся их названия
pickup_info_radius = 5 ;3
feel_grenade = 30.0 ; это нужно удалить
feel_grenade_radius = 30.0 ;расстояние (в метрах) на котором актер чувствует гранату (любую)
feel_grenade_time = 0.5 ;время гранаты (сек) после которого актер чувствует гранату

Invincibility_Shield_3rd = anomaly2\burer_shield_01
Invincibility_Shield_1st = anomaly2\burer_shield_01
HeadShotParticle = hit_fx\hit_flesh_headshot
;HeadShotParticle = hit_fx\hit_dust_00

;радиус в котром над предметами выводятся их названия
pickup_info_radius = 5 ;3

ef_creature_type = 17 ; option for evaluation functions

; attach params
attachable_items = mp_device_torch,attachable_item,hand_radio

ph_box0_center = 0.0, 0.9, 0.0
ph_box0_size = 0.35, 0.9, 0.35
ph_box1_center = 0.0, 0.6, 0.0
ph_box1_size = 0.40, 0.6, 0.40
ph_box2_center = 0.0, 0.3, 0.0
ph_box2_size = 0.40, 0.3, 0.40
restrictor_radius = 0.9;delete
stalker_restrictor_radius = 0.9
medium_monster_restrictor_radius = 0.7
ph_crash_speed_min = 16
ph_crash_speed_max = 20
ph_mass = 80
;----------------
feel_grenade = 10.0 ;расстояние (в метрах) на котором актер чувствует гранату (любую)
player_hud_section = actor_hud

;---------------------------------------------------------------------
ph_skeleton_airr_lin_factor = 0.5 ;550.0 (изменно из-за того, что убрано домножение коэффициент 0.002 из кода)
ph_skeleton_airr_ang_factor = 0.0 ;0.0 (изменно из-за того, что убрано домножение на коэффициент 0.3 из кода (0.0*0.3=0.0))
ph_skeleton_hinger_factor1 = 1.0 ;1.0 (изменно из-за того, что убрано домножение на коэффициент 5.0 из кода)
ph_skeleton_ddelay = 15.0 ;Время изменения значения трения в суставе с момента создания шелла, сек

ph_skel_fatal_impulse_factor = 8.0
ph_after_death_velocity_factor= 0.75
ph_skel_shot_up_factor = 0.25
;---------------------------------------------------------------------

weapon_bone0 = bip01_r_finger1
weapon_bone1 = bip01_l_finger1
weapon_bone2 = bip01_r_finger11

damage = mp_actor_damage
hit_sounds = actor_hit_snds
hit_probability_novice = 1.00
hit_probability_stalker = 1.00
hit_probability_veteran = 1.00
hit_probability_master = 1.00
;---------------------------------------------------------------------
;actor condition

immunities_sect = mp_actor_immunities
condition_sect = mp_actor_condition

heavy_breath_snd = actor\breath_1 ;звук тяжелого дыхания при усталости
heavy_blood_snd = heart\8
heavy_danger_snd = affects\heartbeat
medkit = 0.3 ;временно! вместо аптечки
medkit_wound = 0.2 ;сколько процентов кровотечения оставливает аптечка
antirad = 0.3 ;временно! вместо антирада
material = creatures\human
camera_height_factor = 0.85

;дисперсия стрельбы с учетом ходьбы и бега
disp_base = 0.65;0.8 ;угол (в градусах) разлета пуль, когда актер стоит на месте
disp_aim = 0.01;0.04
disp_vel_factor = 2.0;2.5 ;на сколько увеличится дисперсия при скрости в 10 м/с (не обязательно при беге)
disp_accel_factor = 2.5;3.0; 2.0 ;еще на сколько увеличится, если актер бежит (+ скорость)
disp_crouch_factor = -0.35;-0.5;-0.2 ;уменьшение если актер сидит
disp_crouch_no_acc_factor = -0.75;-1.0;-0.4 ;уменьшение если актер сидит + no acceleration
disp_jump_factor = 30.0;7.0; 2.0

missile_throw_offset = 0.3, 0.5, 0.5

body_remove_time = 5000 ;время уничтожения трупа (с учетом TimeFactor)
sleep_time_factor = 400 ;во сколько раз время идет быстрее, когда актер спит

;---STEP MANAGER------------------------------------------------------
LegsCount = 2
step_params = stalker_step_manager
foot_bones = stalker_foot_bones

; visibility parameters
DynamicObjectsCount = 32
min_view_distance = 0.8 ; коэффициент, который множится на eye_range, в зависимости от угла
max_view_distance = 1.0 ; коэффициент, который множится на eye_range, в зависимости от угла
visibility_threshold = 100.0 ; значение, при достижении суммой которого объект считается видимым
always_visible_distance = 0.3
time_quant = 0.005
decrease_value = 0.1 ; значение, на которое уменьшается вес, если объект попал в фрустум, но отсёкся по каким-то причинам
velocity_factor = 0.5
luminocity_factor = 0.5;0 ; фактор освещения (только для Актёра)
transparency_threshold = 0.4 ; 0.25

;species of monster
species = human

;autopickup
AutoPickUp_AABB = 0.2, 0.1, 0.2; AABB бокс автоподбора предметов
AutoPickUp_AABB_offs = 0.0, 0.1, 0.0; смещение бокса автоподбора предметов относительно позиции игрока

;spawn effect
;spawn_effect = anomaly2\electra2_blast

[mp_actor_damage]
;bone_name = <hit_scale>,<fwd_damage_anim_index>,<wound_scale>,<bonepassbullet>
;<hit_scale> - коэфф. изменения хита (уменьшения здоровья)
;<wound_scale> - коэфф. изменения величины открытой раны
;<bone_pass_bullet> - 0 - после попадания пули в эту кость, эта пуля больше не наносит актеру повреждений
; 1 - пуля наносит актеру повреждения как обычно
;-1 - нет анимаций, четный номер - спереди, нечетный номер - сзади, УКАЗЫВАЕТСЯ ТОЛЬКО ПЕРЕДНИЙ!!! ЗАДНИЙ НА АВТОМАТЕ
default = 1.0, -1, 0.1
bip01_pelvis = 0.25, 10, 0.8 ;от ядра до пояса
bip01_spine = 0.3, 10, 0.8 ;в основном без шейпа
bip01_spine1 = 0.4, 10, 0.8 ;торс до шеи
bip01_spine2 = 0.4, 10, 0.8
bip01_neck = 1.25, 0, 0.1 ;в основном без шейпа
bip01_head = 2, 0, 0.1 ;очень большой шейп
eye_left = 3, 0, 0.1 ;глаза
eye_right = 3, 0, 0.1 ;глаза
jaw_1 = 1.25, 0, 0.1 ;рот от шеи до носа

bip01_l_clavicle = 0.4, 10, 0.8 ;плечо + bip01_spine1
bip01_l_upperarm = 0.3, 4, 0.6, 1 ;0.2
bip01_l_forearm = 0.3, 4, 0.5, 1 ;
bip01_l_hand = 0.2, 4, 0.2, 1 ;было 0.15
bip01_l_finger0 = 0.2, 4, 0.2, 1
bip01_l_finger1 = 0.2, 4, 0.2, 1
bip01_l_finger2 = 0.2, 4, 0.2, 1


bip01_r_clavicle = 0.4, 10, 0.8 ;плечо + bip01_spine1
bip01_r_upperarm = 0.3, 2, 0.6, 1
bip01_r_forearm = 0.3, 2, 0.5, 1
bip01_r_hand = 0.2, 2, 0.2, 1
bip01_r_finger0 = 0.2, 2, 0.2, 1
bip01_r_finger1 = 0.2, 2, 0.2, 1
bip01_r_finger2 = 0.2, 2, 0.2, 1

bip01_l_thigh = 0.3, 8, 0.5 ;бедро
bip01_l_calf = 0.25, 8, 0.4 ;голень
bip01_l_foot = 0.15, 8, 0.3 ;пятка,1
bip01_l_toe0 = 0.15, 8, 0.2 ;пальцы,1
bip01_r_thigh = 0.3, 6, 0.5 ;бедро
bip01_r_calf = 0.25, 6, 0.4 ;голень
bip01_r_foot = 0.15, 6, 0.3 ;пятка,1
bip01_r_toe0 = 0.15, 6, 0.2 ;пальцы,1


[mp_actor_immunities]
burn_immunity = 1.0 ;коэффициенты иммунитета
strike_immunity = 1.0
shock_immunity = 1.0
wound_immunity = 1.0
radiation_immunity = 1.0
telepatic_immunity = 1.0
chemical_burn_immunity = 1.0
explosion_immunity = 1.0
fire_wound_immunity = 1.0

[mp_actor_condition]:actor_condition
satiety_v = 0.0 ;скорость уменьшения сытости со временем
radiation_v = 0.005 ;скорость уменьшения радиации
satiety_power_v = 0.00055 ;увеличение силы при уменьшении сытости
satiety_health_v = 0.0005 ;увеличение здоровья при уменьшении сытости
satiety_critical = 0.0 ;критическое значения сытости (в процентах от 0..1) когда здоровье начианает уменьшаться
radiation_health_v = 0.02 ;уменьшение здоровья при воздействии радиации
morale_v = 0.001 ;скорость восстановления морали
health_hit_part = 1.0 ;процент хита, уходящий на отнимание здоровья
power_hit_part = 0.1;0.01 ;процент хита, уходящий на отнимание силы
psy_health_v = 0.1 ;скорость восстановления psy-здоровья
alcohol_v = -0.03
max_walk_weight = 50

;открытые раны
bleeding_v = 0.05 ;потеря крови при номинальной ране в секунду
wound_incarnation_v = 0.25 ;крутизна кривой заживления (какой процент раны заживет в игровую секунду)
min_wound_size = 0.03 ;минимальный размер раны, после которого она считается зажившей

sleep_health = 1.0 ;1.5 ;коэффициенты скоростей изменения параметров во время сна
sleep_power = 1.0 ;1.5
sleep_satiety = 1.0 ;0.8
sleep_radiation = 1.0 ;1.1
sleep_psy_health = 1.0

;;;;;;;;
;actor_condition only

jump_power = 0.1 ; 0.1 ;0.005 ;умешьшение силы с прыжком без учета веса ноши
jump_weight_power = 0.0 ;0.045 ;умешьшение силы с прыжком с учетом веса ноши, для максимального допустимого веса
overweight_jump_k = 0 ;10 ;коэффициент влияние перегрузки прыжок с весом (умножается на jump_weight_power)

stand_power = -0.2;
walk_power = -0.1; ;умешьшение силы за секнду во время ходьбы без учета веса ноши
walk_weight_power = 0.00 ;умешьшение силы за секнду во время ходьбы с учетом веса ноши, для максимального допустимого веса
overweight_walk_k = 0 ; ;коэффициент влияние перегрузки ноши (умножается на walk_weight_power)
accel_k = -0.0 ; ;коэффициент на бег (умножается walk_power, walk_weight_power)
sprint_k =-1.5; ;коэффициент на "sprint" бег (умножается walk_power, walk_weight_power)


; хромота
limping_health_begin = 0.1;0.2 ;порог здоровья меньше которого актер начинает хромать
limping_health_end = 0.11;0.21 ;порог здоровья больше которого актер перестает хромать
limping_power_begin = 0.1 ;порог силы меньше которого актер начинает хромать
limping_power_end = 0.2 ;порог силы больше которого актер перестает хромать
use_limping_state = on

cant_walk_power_begin = 0.00 ;порог силы меньше которого актер не может двигаться
cant_walk_power_end = 0.10 ;порог силы больше которого актер сможет двигаться

cant_sprint_power_begin = 0.20 ;порог силы меньше которого актер не может бежать в спринте
cant_sprint_power_end = 0.30 ;порог силы больше которого актер сможет бежать в спринте

;--------------------------------------------------------------------------------------------------------------------
;-- АНИМАЦИИ ДЛЯ СМЕРТИ
;--------------------------------------------------------------------------------------------------------------------
;cлучайные
;random_death_animations = ragdoll_burst_front_0,ragdoll_burst_front_1,ragdoll_burst_back_0,ragdoll_burst_left_0,ragdoll_burst_right_0 ;norm_2_reg_doll_0,norm_2_reg_doll_1,norm_2_reg_doll_2,norm_2_reg_doll_3,norm_2_reg_doll_4,norm_2_reg_doll_5

;по типам от 0 до 7
;порядок по направлениям - front/back/left/right
; В голову, когда персонаж бежит на нас.
kill_enertion = ragdoll_inertion_front_0/ragdoll_inertion_front_3/ragdoll_inertion_front_2/ragdoll_inertion_front_1

; Смерть от автоматной очереди
;kill_burst = ragdoll_burst_front_0,ragdoll_burst_front_1/ragdoll_burst_back_0/ragdoll_burst_left_0/ragdoll_burst_right_0

; Смерть от выстрела из дробовика
kill_shortgun = ragdoll_shortgun_front_0,ragdoll_shortgun_front_1,ragdoll_shortgun_front_2,ragdoll_shortgun_front_3,ragdoll_shortgun_front_4,ragdoll_shortgun_front_5,ragdoll_shortgun_front_6,ragdoll_shortgun_front_7,ragdoll_shortgun_front_8/ragdoll_shortgun_back_0,ragdoll_shortgun_back_1,ragdoll_shortgun_back_2,ragdoll_shortgun_back_3,ragdoll_shortgun_back_4,ragdoll_shortgun_back_5/ragdoll_shortgun_left_0,ragdoll_shortgun_left_1,ragdoll_shortgun_left_2/ragdoll_shortgun_right_0

; Смерть хедшотом
kill_headshot = ragdoll_headshot_front_0,ragdoll_headshot_front_1,ragdoll_headshot_front_2,ragdoll_headshot_front_3,ragdoll_headshot_front_4,ragdoll_headshot_front_5,ragdoll_headshot_front_6,ragdoll_headshot_front_7,ragdoll_headshot_front_8,ragdoll_headshot_front_9,ragdoll_headshot_front_10/ragdoll_headshot_back_0,ragdoll_headshot_back_1,ragdoll_headshot_back_2,ragdoll_headshot_back_3,ragdoll_headshot_back_4,ragdoll_headshot_back_5/ragdoll_headshot_left_0,ragdoll_headshot_left_1,ragdoll_headshot_left_2,ragdoll_headshot_left_3,ragdoll_headshot_left_4,ragdoll_headshot_left_5,ragdoll_headshot_left_6,ragdoll_headshot_left_7/ragdoll_headshot_right_0,ragdoll_headshot_right_1,ragdoll_headshot_right_2,ragdoll_headshot_right_3

; Смерть хедшотом из снайперки
kill_sniper_headshot = ragdoll_sniper_headshot_front_0,ragdoll_sniper_headshot_front_1,ragdoll_sniper_headshot_front_2/ragdoll_sniper_headshot_back_0/ragdoll_sniper_headshot_left_0/ragdoll_sniper_headshot_right_0

; Смерть от снайперки в тело
kill_sniper_body = ragdoll_sniper_body_front_0,ragdoll_sniper_body_front_1,ragdoll_sniper_body_front_2/ragdoll_sniper_body_back_0,ragdoll_sniper_body_back_1,ragdoll_sniper_body_back_2,ragdoll_sniper_body_back_3/ragdoll_sniper_body_left_0/ragdoll_sniper_body_right_0

; Смерть от взрывной волны гранаты
kill_grenade = ragdoll_grenade_front_0/ragdoll_grenade_back_0/ragdoll_grenade_left_0/ragdoll_grenade_right_0

;front-norm_2_rag_doll_front_0,norm_2_rag_doll_front_1,norm_2_rag_doll_front_2/back-norm_2_rag_doll_back_0,norm_2_rag_doll_back_1,norm_2_rag_doll_back_2/right-norm_2_rag_doll_right_0/left-norm_2_rag_doll_left_0

;--------------------------------------------------------------------------------------------------------------------


Начнем взлом.

Находим нужную текстовую метку и ставим бряк.. клавиша F2.. да и еще в предыдущих статьях модуль у нас был сам экзешник игры... а в этот раз будет Dll файл .. под названием.. xrGame.dll

post-117-1329838445,02_thumb.jpg

Поставили бряк и начнем загружать игру....

Сработал бряк.. отлично .. пройдемся малость по коду вниз с помощью клавиши F8.. и тут у нас загрузка нашего,параметра контроля в воздухе... в дамп.. но она еще не выполнена так как инструкция не выполнена ..

post-117-1329838805,19_thumb.jpg

Посмотрим в дамп по нашему адресу.. там пока что нет нашего значения .. так как нужно выполнить инструкцию...

post-117-1329839039,72_thumb.jpg post-117-1329839173,16_thumb.jpg

Но перед тем как выполнить инструкцию.. или начать выполнение кода нужно поставить на наш адрес ПРОЦЕССОРНУЮ ТОЧКУ ОСТАНОВА и снять бряк с инструкции с нашей текстовой меткой... F2

post-117-1329839675,67_thumb.jpg

Как сделали это нажимаем F9 сработала точка остановки ( процессорная )..выполнение кода остановилось на инструкции mov ecx,dword ptr [eax+A8] и по нашему адресу загрузилось наше значение..

post-117-1329839968,02_thumb.jpg

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

У нас есть адрес со значением float=0.1 и код остановился на mov ecx,dword ptr [eax+A8] спустимся вниз на пару инструкция... до инструкции которая работает с дробными числами... Что мы там видим ... наше значение float=0.1 опять копируется в дамп..

post-117-1329840619,55_thumb.jpg

И это копирование будет проходить раза 3-4 есть и больше... порядок действий такой 1-смотрим дамп нового адреса. 2-ставим на него процессорную точку остановки до того как загрузилось наше значение в него. 3-снимаем бряк со старого адреса.... и нажимаем F9..

post-117-1329841285,13_thumb.jpg post-117-1329841293,53_thumb.jpg post-117-1329841303,22_thumb.jpg post-117-1329843865,63_thumb.jpg post-117-1329843866,42_thumb.jpg

Как все это сделали нажимаем F9 пошло выполнение кода и сразу сработал бряк..

Выполнение остановилось на инструкции mov edx,dword ptr [eax+13C] и в наш новый адрес загрузилось наше значение..

post-117-1329843866,9_thumb.jpg

Дальше опять проходим вниз до первой инструкции работающей с дробными числами... и смотрим средний сектор программы там подсказка с новым адресом...))))

post-117-1329843867,44_thumb.jpg

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

post-117-1329843867,99_thumb.jpg post-117-1329843868,49_thumb.jpg post-117-1329846237,16_thumb.jpg

Как это сделали нажимаем F9 пошло выполнение кода и опять сразу бряк...)))

на этот раз остановились на movss dword ptr [ecx+2EC],xmm0... скажу сразу это последнее копирование ...

post-117-0-86230400-1334237589_thumb.jpg

Конечный результат хранится в [ecx+2EC].. можно высчитать адрес с помощью калькулятора.. или сделать так ....

post-117-1329843870,28_thumb.jpg

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

post-117-1329844838,9_thumb.jpg

Ну и жмем F9.. загрузили игру и точка остановки не сработала...Посмотрим дамп нашего адреса.. все отлично .. там наше значение... =0.1 float...

post-117-1329844312,17_thumb.jpg

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

post-117-1329844970,71_thumb.jpg

Получили нужную инструкцию.... можно написать скрипт....

Пишем скрипт.

Очень много перепробовал вариантов скриптов ... вылет и все... но нашелся один рабочий....))


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

newmem:
pushad
mov [esi],(float)30
movss xmm0,[esi]
popad
jmp returnhere

xrGame.dll+3B7F4D:
jmp newmem
nop
nop
nop
returnhere:

[DISABLE]
xrGame.dll+3B7F4D:
movss xmm0,[edi+000002EC]
dealloc(newmem)

Управление героем в полете ... стандарт 0.1 патч 30

Можно было и в другое место встроить наш патч .. но он бы работал тока после смерти игрока... а так работает в любое время... да и еще вот скрипт на высокий прыжок к сталкеру... он тоже работает ... в любой момент... то есть не нужно умирать....


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

newmem:
mov [esi+00000314],(float)35
jmp returnhere

xrGame.dll+3AB090:
jmp newmem
nop
nop
nop
returnhere:

[DISABLE]
xrGame.dll+3AB090:
movss [esi+00000314],xmm2
dealloc(newmem)

Спс..

Изменено пользователем Grom-Skynet
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
×
×
  • Создать...

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

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