PDA

Просмотр полной версии : Помогите разобрать struct ItemInfo


Yegor
30.01.2012, 20:29
ItemInfo используется в Api клиента L2 например в функции

UNetworkHandler::RequestDestroyItem(struct ItemInfo)

При изучении выяснилось что struct ItemInfo имеет как минимум следующие поля:

INT32 - указатель хз на что в области памяти клиента L2, если оставить 0 то клиент крашится
INT32 - ItemObjectId
INT32 - 0
INT32 - 0
INT64 - itemCount

Куда интересно может ссылатся первый указатель? Может быть на экземпляр объекта Item в памяти, если так то как его найти?

mira
31.01.2012, 10:16
Сдампи память. Скорее всего указатель на очередной промежуточный обьект\структуру описывающую итем из бд клиента. Возможно содержащий текстуру.

в любом случае нужен дамп памяти оттуда.

Guzh
31.01.2012, 11:24
Это конечно не то что ты просил,но... Если хочешь удалить чтото,то используй эту функцию UNetworkHandler::SendDestroyItem(int, __int64)

mira
31.01.2012, 11:38
Наврятли он пытаетса удалить итем записав 0 вместо адреса :)

Yegor
31.01.2012, 14:50
Это конечно не то что ты просил,но... Если хочешь удалить чтото,то используй эту функцию UNetworkHandler::SendDestroyItem(int, __int64)

Да клиент эту функцию не использует при удалении, но она работает.

Добавлено через 2 минуты
Нагуглил исходники какого то бота L2Tower там так описывается эта структура

struct ItemInfo
{
void *vftable;
int itemId;
int itemType;
int type;
int quantity;
}; // struct ItemInfo

Только непонятно при чем тут указатель на vftable

xkor
31.01.2012, 16:11
Только непонятно при чем тут указатель на vftableпредположительно при том что на самом деле это не структура а класс и соответственно это ссылка на его таблицу методов)

Aries
31.01.2012, 16:31
Да клиент эту функцию не использует при удалении, но она работает.

Добавлено через 2 минуты
Нагуглил исходники какого то бота L2Tower там так описывается эта структура

struct ItemInfo
{
void *vftable;
int itemId;
int itemType;
int type;
int quantity;
}; // struct ItemInfo

Только непонятно при чем тут указатель на vftable

Я не могу сказать так это или нет, но вот то что там может быть таблица виртуальных методов, это вполне вероятно.

mira правильно сказал, что надо сдампить память и глянуть что лежит по этому адресу. Если это vftable, то ее, я думаю, ты сразу отличишь)

ЗЫ что-то давно я не отписывался на этом форуме)) пора возвращаться)

Добавлено через 9 минут
предположительно при том что на самом деле это не структура а класс и соответственно это ссылка на его таблицу методов)

не факт, кстати))
Если брать тот же cpp, то там разница структуры и класса только в доступе "по умолчанию" и мб еще каких-то мелочах. Но между тем структура так же может иметь методы, в т.ч. и виртуальные

mira
31.01.2012, 17:41
Да клиент эту функцию не использует при удалении, но она работает.

Добавлено через 2 минуты
Нагуглил исходники какого то бота L2Tower там так описывается эта структура

struct ItemInfo
{
void *vftable;
int itemId;
int itemType;
int type;
int quantity;
}; // struct ItemInfo

Только непонятно при чем тут указатель на vftable

действительно, это же не структура а класс.
в экземпляре класса первый DWORD это указатель на VMT :(

Yegor
31.01.2012, 18:43
В таком случае почему тогда объявлено как struct ItemInfo и поля которыя я привел в 1 посте все находятся прямо в стеке при вызове функции UNetworkHandler::RequestDestroyItem. Если это был бы класс то через стек передавался только указатель на него.

Добавлено через 2 минуты
Кстати функция UNetworkHandler::SendDestroyItem(int, __int64) не вызывает UNetworkHandler::RequestDestroyItem(struct ItemInfo), видимо это какая то старая функция которая сама формирует пакет, но она работает :).

Aries
31.01.2012, 19:52
какие параметры у UNetworkHandler::RequestDestroyItem?
сейчас у самого времени нет смотреть...
Просто туда не обязательно может передаваться указатель на структуру/класс.


Кстати функция UNetworkHandler::SendDestroyItem(int, __int64) не вызывает UNetworkHandler::RequestDestroyItem(struct ItemInfo), видимо это какая то старая функция которая сама формирует пакет, но она работает :).

вот тебе и ответ на вопрос)))
UNetworkHandler::RequestDestroyItem(struct ItemInfo)

передаем не указатель, поэтому все элементы и запихиваются в стэк

Sherman
05.02.2012, 03:37
xkor введи систему лайков.... твой камент хотел нажать не спасибку, а "понравилось" )))))

xkor
06.02.2012, 11:02
Sherman, я бы лучше систему -1 ввёл, имхо актуальнее, некоторых заминусовать крайне хочется...

Yegor
14.02.2012, 13:42
Опять возвращавшемся к вопросу. Теперь нужно реализовать функцию

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.

mira
14.02.2012, 14:17
Дык поищи какойнить конструктор для него штатный чем заморачиватса с полями.
Будет куда изящнее

Yegor
14.02.2012, 14:55
Перезапустил клиент L2. Адрес в первом поле изменился а вот значения по этому адресу остались 1 в 1 и опять находятся в области памяти NWindow.dll.

Добавлено через 44 секунды
mira, дак если бы я знал как его найти. В какой из Dll клиента хоть искать? Уже не в Engine.dll?

Добавлено через 15 минут
При вызове другой функции имеющей в параметрах struct iteminfo первым уже идет адрес ссылающийся вообще хз куда и на какой то мусор.

mira
15.02.2012, 10:29
Да там неважно в какой области, поидее где выделит манагер памети там и будет структура.

на что ссылаетса первый адрес уже разобралса?

Yegor
15.02.2012, 14:04
mira, не разобрался. Две разных функции с iteminfo ссылаются совсем на разные области памяти.

mira
15.02.2012, 14:28
Если 1 указатель в струкуре это вмт то во всех экземплярах он должен совпадать.

если нет то сдампи память в 1х четырех методах , будет видно хотябы исполнимый там код или данные. Если данные то пожалуй остановлюсь на 1 варианте - там данные движка типи текстуры, дескриптор из gamedata.
его в ручную точно не собрать

Yegor
15.02.2012, 14:33
mira, сдампить память по указателям которые находятся по указателю в первом поле структуры? :)

mira
15.02.2012, 14:38
Если 11ый дворд который ты не дописал начинаетса снова 5ххххххх очевидно чо эта "вмт" состоит из 4 адресов а за ней следуют другие экземпляры других итемов. Возможно они даже в какомто последовательном массиве

Добавлено через 2 минуты
mira, сдампить память по указателям которые находятся по указателю в первом поле структуры? :)

на сей раз глянуть куда указывают первые 4 адреса в "вфтейбл" пока назовем ее так))