Сейчас на форуме: (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Помогите определить структуру
Посл.ответ Сообщение

Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 февраля 2014 19:08 · Поправил: mVk
· Личное сообщение · #1

procedure FindPlayerInfo;
begin
PPointer(Cardinal(@PushAddrPattern) + 1)^ := Mem_FindPattern(CLBase, CLBase_End, @PlayerInfoString, StrLen(PlayerInfoString), 0);
PlayerInfo := Mem_FindPattern(CLBase, CLBase_End, @PushAddrPattern, 5, 6);
if FarProc(PlayerInfo, CLBase, CLBase_End) then
MsgAPI.Error('Couldn''t find ^cs_player_info_t pointer.');
PlayerInfo := Pointer(PCardinal(PlayerInfo)^ + 8 + Cardinal(Protocol = 47) * SizeOf(Cardinal));
if FarProc(PlayerInfo, CLBase, CLBase_End) then
MsgAPI.Error('Couldn''t find ^cs_player_info_t pointer.');
end;
MsgAPI.Error(inttohex(DWORD(PlayerInfo),8));
end.

PushAddrPattern: array[0..4] of Byte = ($68, $00, $00, $00, $00);

PlayerInfoString: array[0..20] of Char = 'cl_career_difficulty';

Объясните пожалуйста как работает эта структура? И как ее собсно реализовать на C++
Если нужно больше информации, напишите - приложу.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 19 февраля 2014 21:57
· Личное сообщение · #2

Во-первых, где здесь структура? Я вижу 2 отдельно описанных массива.
Во-вторых, при чём тут этот форум? Полагаю, что надо идти читать основы по плюсам, как объявлять массивы.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 20 февраля 2014 12:44
· Личное сообщение · #3

Можно тупо:
1. Скомпилировать
2. Открыть в IDA
3. HexRays'ом перевести в C

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2014 13:43
· Личное сообщение · #4

Да нет, немного не так. Я пишу на си, мне нужно объяснение как этот кусок кода работает, потом что бы написать что-то вроде аналога.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 февраля 2014 14:01
· Личное сообщение · #5

вы точно пишете на си? даже я незающий делфи и первый раз увидевший этот код понял что ищется в диапазоне CLBase, CLBase_End
сначала строка, потом патерн, и если находится то возращается указатель
про тонкости подсчета указателя, если бы мне надо, я бы уточнил в гугле

но вы можете ждать, и возможно вам кто то переведет на си



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 20 февраля 2014 14:56 · Поправил: dosprog
· Личное сообщение · #6

PPointer(Cardinal(@PushAddrPattern) + 1)^ := Mem_FindPattern(CLBase, CLBase_End, @PlayerInfoString, StrLen(PlayerInfoString), 0);

(* Заполнить фрагмент-шаблон кода "push" так, чтобы стало "push offset player_info_string_in_code" *)

PlayerInfo := Mem_FindPattern(CLBase, CLBase_End, @PushAddrPattern, 5, 6);

(* Искать в коде программы такой фрагмент [заполненный ранее фрагмент кода "push..."] - это PlayerInfo_push *)

PlayerInfo := Pointer(PCardinal(PlayerInfo)^ + 8 + Cardinal(Protocol = 47) * SizeOf(Cardinal));

(* PlayerInfo должно находиться в найденном коде следом за PlayerInfo_push "push..." на расстоянии (8 + 47*4) байтов *)
(* Причём в этом ((8 + 47*4)) уверенности нет,это будет число. Тут поможет HexRays, как написал Coderess *)
(* А можно посмотреть в реальном коде искомого фрагмента, на сколько от этой "push" отстоят интересующие данные *)

Как-то так...


--ADD--
BoRoV,
да, верно. Всё время забываю об этом паскальном ":="...






Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 20 февраля 2014 15:01 · Поправил: BoRoV
· Личное сообщение · #7

dosprog пишет:
Причём в этом ((8 + 47*4)) уверенности нет,это будет число.


Code:
  1. Protocol = 47

это логическая операция, если протокол равняется 47, то прибавляем еще размер Cardinal. Довольно таки изящно.

-----
Лучше быть одиноким, но свободным © $me



 eXeL@B —› Вопросы новичков —› Помогите определить структуру
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати