Просмотр полной версии : Помогите разобрать struct ItemInfo
ItemInfo используется в Api клиента L2 например в функции
UNetworkHandler::RequestDestroyItem(struct ItemInfo)
При изучении выяснилось что struct ItemInfo имеет как минимум следующие поля:
INT32 - указатель хз на что в области памяти клиента L2, если оставить 0 то клиент крашится
INT32 - ItemObjectId
INT32 - 0
INT32 - 0
INT64 - itemCount
Куда интересно может ссылатся первый указатель? Может быть на экземпляр объекта Item в памяти, если так то как его найти?
Сдампи память. Скорее всего указатель на очередной промежуточный обьект\структуру описывающую итем из бд клиента. Возможно содержащий текстуру.
в любом случае нужен дамп памяти оттуда.
Это конечно не то что ты просил,но... Если хочешь удалить чтото,то используй эту функцию UNetworkHandler::SendDestroyItem(int, __int64)
Наврятли он пытаетса удалить итем записав 0 вместо адреса :)
Это конечно не то что ты просил,но... Если хочешь удалить чтото,то используй эту функцию UNetworkHandler::SendDestroyItem(int, __int64)
Да клиент эту функцию не использует при удалении, но она работает.
Добавлено через 2 минуты
Нагуглил исходники какого то бота L2Tower там так описывается эта структура
struct ItemInfo
{
void *vftable;
int itemId;
int itemType;
int type;
int quantity;
}; // struct ItemInfo
Только непонятно при чем тут указатель на vftable
Только непонятно при чем тут указатель на vftableпредположительно при том что на самом деле это не структура а класс и соответственно это ссылка на его таблицу методов)
Да клиент эту функцию не использует при удалении, но она работает.
Добавлено через 2 минуты
Нагуглил исходники какого то бота L2Tower там так описывается эта структура
struct ItemInfo
{
void *vftable;
int itemId;
int itemType;
int type;
int quantity;
}; // struct ItemInfo
Только непонятно при чем тут указатель на vftable
Я не могу сказать так это или нет, но вот то что там может быть таблица виртуальных методов, это вполне вероятно.
mira правильно сказал, что надо сдампить память и глянуть что лежит по этому адресу. Если это vftable, то ее, я думаю, ты сразу отличишь)
ЗЫ что-то давно я не отписывался на этом форуме)) пора возвращаться)
Добавлено через 9 минут
предположительно при том что на самом деле это не структура а класс и соответственно это ссылка на его таблицу методов)
не факт, кстати))
Если брать тот же cpp, то там разница структуры и класса только в доступе "по умолчанию" и мб еще каких-то мелочах. Но между тем структура так же может иметь методы, в т.ч. и виртуальные
Да клиент эту функцию не использует при удалении, но она работает.
Добавлено через 2 минуты
Нагуглил исходники какого то бота L2Tower там так описывается эта структура
struct ItemInfo
{
void *vftable;
int itemId;
int itemType;
int type;
int quantity;
}; // struct ItemInfo
Только непонятно при чем тут указатель на vftable
действительно, это же не структура а класс.
в экземпляре класса первый DWORD это указатель на VMT :(
В таком случае почему тогда объявлено как struct ItemInfo и поля которыя я привел в 1 посте все находятся прямо в стеке при вызове функции UNetworkHandler::RequestDestroyItem. Если это был бы класс то через стек передавался только указатель на него.
Добавлено через 2 минуты
Кстати функция UNetworkHandler::SendDestroyItem(int, __int64) не вызывает UNetworkHandler::RequestDestroyItem(struct ItemInfo), видимо это какая то старая функция которая сама формирует пакет, но она работает :).
какие параметры у UNetworkHandler::RequestDestroyItem?
сейчас у самого времени нет смотреть...
Просто туда не обязательно может передаваться указатель на структуру/класс.
Кстати функция UNetworkHandler::SendDestroyItem(int, __int64) не вызывает UNetworkHandler::RequestDestroyItem(struct ItemInfo), видимо это какая то старая функция которая сама формирует пакет, но она работает :).
вот тебе и ответ на вопрос)))
UNetworkHandler::RequestDestroyItem(struct ItemInfo)
передаем не указатель, поэтому все элементы и запихиваются в стэк
xkor введи систему лайков.... твой камент хотел нажать не спасибку, а "понравилось" )))))
Sherman, я бы лучше систему -1 ввёл, имхо актуальнее, некоторых заминусовать крайне хочется...
Опять возвращавшемся к вопросу. Теперь нужно реализовать функцию
UNetworkHandler::RequestAddTradeItem(struct ItemInfo)
Опять пресловутый ItemInfo и теперь похоже не отвертеться.
Сдампив память по адресу указанному в первом поле (364707839) получил следующее:
Это в десятичном виде, 1 строка = 4 байта
1660952576
1694528000
1946181888
536896768
1694524416
1627416064
1811969280
536900608
1912631296
1879076608
.....
Но почему то совсем разные адреса. Не может же VFTable быть расположенным по адресу 364707839, а методы по адресу 1660952576+
364707839 это 0x15BCFFFF, из Dll загруженных в область памяти l2.bin в эту область входит NWindow.dll 0x15590000..0x163CA000.
Дык поищи какойнить конструктор для него штатный чем заморачиватса с полями.
Будет куда изящнее
Перезапустил клиент L2. Адрес в первом поле изменился а вот значения по этому адресу остались 1 в 1 и опять находятся в области памяти NWindow.dll.
Добавлено через 44 секунды
mira, дак если бы я знал как его найти. В какой из Dll клиента хоть искать? Уже не в Engine.dll?
Добавлено через 15 минут
При вызове другой функции имеющей в параметрах struct iteminfo первым уже идет адрес ссылающийся вообще хз куда и на какой то мусор.
Да там неважно в какой области, поидее где выделит манагер памети там и будет структура.
на что ссылаетса первый адрес уже разобралса?
mira, не разобрался. Две разных функции с iteminfo ссылаются совсем на разные области памяти.
Если 1 указатель в струкуре это вмт то во всех экземплярах он должен совпадать.
если нет то сдампи память в 1х четырех методах , будет видно хотябы исполнимый там код или данные. Если данные то пожалуй остановлюсь на 1 варианте - там данные движка типи текстуры, дескриптор из gamedata.
его в ручную точно не собрать
mira, сдампить память по указателям которые находятся по указателю в первом поле структуры? :)
Если 11ый дворд который ты не дописал начинаетса снова 5ххххххх очевидно чо эта "вмт" состоит из 4 адресов а за ней следуют другие экземпляры других итемов. Возможно они даже в какомто последовательном массиве
Добавлено через 2 минуты
mira, сдампить память по указателям которые находятся по указателю в первом поле структуры? :)
на сей раз глянуть куда указывают первые 4 адреса в "вфтейбл" пока назовем ее так))
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot