Grom-Skynet

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

4 сообщения в этой теме

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

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

Введение.

Для примера будет использована игра Сталкер Чистое небо.. Принцип работы с игрой будет такой же как и в предыдущих статьях ... когда взламывали игру 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

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


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

у меня что то сполер не открывает

0

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


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

Все работает

0

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


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

включи в браузере javascript

0

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас