Сейчас на форуме: (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Помогите определить структуру |
Посл.ответ | Сообщение |
|
Создано: 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++ Если нужно больше информации, напишите - приложу. ![]() |
|
Создано: 19 февраля 2014 21:57 · Личное сообщение · #2 |
|
Создано: 20 февраля 2014 12:44 · Личное сообщение · #3 |
|
Создано: 20 февраля 2014 13:43 · Личное сообщение · #4 |
|
Создано: 20 февраля 2014 14:01 · Личное сообщение · #5 вы точно пишете на си? даже я незающий делфи и первый раз увидевший этот код понял что ищется в диапазоне CLBase, CLBase_End сначала строка, потом патерн, и если находится то возращается указатель про тонкости подсчета указателя, если бы мне надо, я бы уточнил в гугле но вы можете ждать, и возможно вам кто то переведет на си ![]() |
|
Создано: 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, да, верно. Всё время забываю об этом паскальном ":="... ![]() |
|
Создано: 20 февраля 2014 15:01 · Поправил: BoRoV · Личное сообщение · #7 |
![]() |
eXeL@B —› Вопросы новичков —› Помогите определить структуру |