PDA

Просмотр полной версии : va_arg на asm (разбив стека по format)


fastx
28.11.2016, 20:20
Некоторые апи функции l2 идут с неопределенным количеством аргументов, в частности sendpacket. Переменные параметры заносятся в стек. Но до них идет указатель на строку с маской(format)(пример "cdddbSqq"). По ней мы бьем стек и получаем те самые параметры.
А как корректно рассчитать смещение по маске:
c - 1 байт, но в стеке занимает 4 байта(можно же было в 2 уложить)
d - 4 байта, в стеке 4 (тут и вопросов нет)
h - 2 байта, а сколько занимает в стеке?
q - 8 байт, а в стеке тоже 8?
Но больше всего не понятно, сколько байт в стеке занимает b и S(S - указатель или сама строка(unicode же?)? за что отвечает b? (байты?))
Те, к примеру, [esp+24] - указатель на строку с маской(форматом). 1 символ маски всегда c => после mov al, [esp+28] в al у нас будет первый байт. Если второй символ d => mov eax, [esp+32] в eax будет 4 байтное число. А как эта цепь продолжится для h, b, S?
В c++ есть va_arg, а здесь чуть сложнее. Хотя я нашел что-то мне подходящее более менее на delphi+asm вот в этом (http://coderx.ru/showthread.php?t=7197&page=24) треде, но не уверен, что это верный вариант.
Есть ли более точный способ разбить стек?

Smwr
29.11.2016, 11:19
все аргументы лежат в стеке по адресам кратным четырём байтам.
|c***|dddd|hh**|qqqq|qqqq| и по аналогии.
s=указатель на юникод строку (4 байта).
b=массив байт, только я не знаю как он передается, по указателю или же про значению. надо брякаться и смотреть. вообще, я не помню, что бы в c->s пакетах он встречался.

советую посмотреть исходники rguard, там есть пример хука sendpacket (на с++ правда).

fastx
29.11.2016, 16:32
все аргументы лежат в стеке по адресам кратным четырём байтам.
|c***|dddd|hh**|qqqq|qqqq| и по аналогии.
s=указатель на юникод строку (4 байта).
b=массив байт, только я не знаю как он передается, по указателю или же про значению. надо брякаться и смотреть. вообще, я не помню, что бы в c->s пакетах он встречался.

советую посмотреть исходники rguard, там есть пример хука sendpacket (на с++ правда).
Rguard смотрел)) Насторожило то, что "c" и "h" занимают больше места, чем достаточно. Теперь буду пробовать запустить l2 под отладчиком

Smwr
29.11.2016, 17:57
Потому что push не может впринципе закинуть меньше 4х байт.

fastx
29.11.2016, 20:50
Вроде push ax может закинуть два байта в стек. Кстати, по поводу формата "b" - там нету указателя, походу байты в стеке самом. А не подскажите тогда, как определить где конец этого аргумента? Пробовал запустить l2 под olly по этому (http://www.rf-cheats.ru/forum/archive/index.php/t-301510.html) гайду, но l2 выбивает с критом, типа не исправен клиент.

ScythLab
29.11.2016, 22:31
"b" - занимает 8 байт в стеке, первые 4 байта - длина, остальные 4 байта - указатель на буфер.
va_arg(args, type) достаточно простая конструкция, она достает значение из указателя args и приводит его к типу type, при этом указатель args увеличивается на 4 (с некоторыми типами - на 8), вот и все.

push ax - занесет ax в стек, но все равно это дело займет 4 байта.

Гайд по запуску Ольки - что-то мне подсказывает, что данный метод не будет работать на некоторых современных защитах.

Smwr
30.11.2016, 18:43
Гайд по запуску Ольки - что-то мне подсказывает, что данный метод не будет работать на некоторых современных защитах.
У меня как раз таки эти настройки переваривают почти все защиты в w7 x64, с которыми я встречался, разве что смарт запустился только в xp (побрякаться правда так и не вышло, пока не поборол).