Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых) |
eXeL@B —› Программирование —› Как получить аргумент из функции в памяти |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 17 ноября 2014 04:29 · Личное сообщение · #1 Есть хук который цепляется к опр адресу в ехешнике, цепляется он к одному из методов класса, вот он Code:
И вот вопрос, собственно нужно получить аргумент, и собственно указатель на oCNpc, как это сделать? P.s. Знания относительно реверса, крайне скудны, так что прошу ногами не пинать сразу, занимаюсь модингом одной игры. |
|
Создано: 17 ноября 2014 07:46 · Поправил: VodoleY · Личное сообщение · #2 Saturas 1. зависит от самого класса. статический или динамический. 2. сильно зависит от языка программирования, в каждом свои ньюансы. Если ВООБЩЕМ. то ваш класс, это указатель на область памяти, в которой список указателей, структур , переменных . Чтоб узнать какой указатель на что указывает (в классе) надо рыть в проге описание класса oCItem и сопостовлять указатели со структурой класса ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 17 ноября 2014 10:40 · Личное сообщение · #3 |
|
Создано: 17 ноября 2014 11:11 · Личное сообщение · #4 |
|
Создано: 17 ноября 2014 11:38 · Поправил: Vamit · Личное сообщение · #5 |
|
Создано: 17 ноября 2014 11:44 · Личное сообщение · #6 |
|
Создано: 17 ноября 2014 12:03 · Личное сообщение · #7 |
|
Создано: 17 ноября 2014 12:05 · Личное сообщение · #8 |
|
Создано: 17 ноября 2014 12:13 · Личное сообщение · #9 |
|
Создано: 17 ноября 2014 12:17 · Личное сообщение · #10 |
|
Создано: 17 ноября 2014 12:29 · Личное сообщение · #11 |
|
Создано: 17 ноября 2014 13:48 · Личное сообщение · #12 Code:
Сделал таким образом, 0x08 - адресс указателя this, 0x0C - аргумент |
|
Создано: 17 ноября 2014 13:52 · Личное сообщение · #13 |
|
Создано: 17 ноября 2014 14:11 · Личное сообщение · #14 Весь ваш код легко заменяется на Си++ и все ассемблерные ставки идут лесом. Стандартные соглашения о связях гласят, что в начале процедуры будет такой код: Code:
После чего можно брать значения: ebp[0] = ebp_old ebp[4] = return_address ebp[8] = Arg1 ebp[0xC] = Arg2 Ваш код работает в случае, если this лежит в первом аргументе, но стек это медленная штука и обычно используют регистр ecx. Если ваш код правильный и this действительно в стеке: Code:
Если же, все-таки ecx Code:
Второй случай это грустная история, ибо требует полное восстановление структуры данных в своем коде структуры/класса oCNpc (с учетом всех наследований и типов). Хотя, скорее всего, раз вы его у себя объявили, значит он где-то есть в исходных кодах. |
|
Создано: 17 ноября 2014 17:47 · Личное сообщение · #15 |
|
Создано: 17 ноября 2014 17:49 · Личное сообщение · #16 |
|
Создано: 17 ноября 2014 17:52 · Личное сообщение · #17 Code:
Вот листинг из ИДЫ |
|
Создано: 17 ноября 2014 17:57 · Поправил: reversecode · Личное сообщение · #18 |
|
Создано: 17 ноября 2014 18:17 · Личное сообщение · #19 Saturas пишет: Чет не совсем понимаю, что есть ebp_old, и если вы пишите что вставки идут лесом, тогда как быть с этим кодом, или я что то не так понял? ebp_old это значение регистра EBP до выполения команды mov ebp, esp, его запихивает в стек первая команда - push ebp. Си достаточно низкоуровневый язык, чтобы не использовать __asm вообще. Максимум - оптимизация (кодирование с использованием FPU, SIMD) и ядро ОС/драйвера (низкоуровневые архитектурно специфические команды ассемблера). Поскольку this лежит в ecx (о чем сразу было понятно). Вам нужно понять все поля структуры/класса oCNpc. Код будет выглядить как-то так Code:
И никакого ассемблера! P.S. Когда я занимался GameCheating'ом мне приходилось восстанавливать целые классы до состояния, когда они компилировались в исходный код с точностью до каждого байта. Было весело, но работу так и не закончил Это был 64битный ассемблер и HexRays 64 тогда еще не было. Добавлено: Берете заголовочный отсюда: https://code.google.com/p/g2ext/source/browse/trunk/api/g2/ocnpc.h?r=21 И реализовываете методы класса заглушки, которые ничего не делают. Тот метод который перехватываете реализовываете (его может и не быть в силу того, что игра ушла вперед относительно исходных кодов). В таком случае перехватываемый метод получит аргументы правильно и правильно сможет обращаться к членам класса. |
|
Создано: 17 ноября 2014 20:32 · Личное сообщение · #20 |
|
Создано: 17 ноября 2014 20:49 · Личное сообщение · #21 |
|
Создано: 17 ноября 2014 21:00 · Личное сообщение · #22 |
|
Создано: 17 ноября 2014 21:30 · Личное сообщение · #23 |
|
Создано: 17 ноября 2014 21:43 · Личное сообщение · #24 |
|
Создано: 17 ноября 2014 22:06 · Личное сообщение · #25 Хуки сейчас нагло украдены у каких то поляков в виде dllки, и сейчас юзаю ее. d240_17.11.2014_EXELAB.rU.tgz - InjectMage.dll |
|
Создано: 17 ноября 2014 22:10 · Личное сообщение · #26 |
|
Создано: 17 ноября 2014 22:19 · Личное сообщение · #27 |
|
Создано: 17 ноября 2014 22:20 · Личное сообщение · #28 |
|
Создано: 17 ноября 2014 22:29 · Личное сообщение · #29 Дак, оно и так уже все решено за исключением мелочей, хоть и не без Вашей помощи. А по сути, это реинкарнация того пакета G2Ext, ибо то как работал тот пакет - лучше не знать, креши на каждом шагу были, вот и пришлось отказаться от него, и сделать по своему, и что характерно по своему таки вышло лучше. На последок, хотелось спросить где/что почитать по реверсу в целом? |
|
Создано: 17 ноября 2014 23:01 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Как получить аргумент из функции в памяти |