Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 28.11.2016, 20:20   #1
Новичок
 
Регистрация: 14.11.2016
Сообщений: 8
Сказал Спасибо: 4
Имеет 2 спасибок в 1 сообщении
fastx пока неопределено
По умолчанию va_arg на asm (разбив стека по format)

Некоторые апи функции 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 вот в этом треде, но не уверен, что это верный вариант.
Есть ли более точный способ разбить стек?
fastx вне форума   Ответить с цитированием
Старый 29.11.2016, 11:19   #2
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Smwr на пути к лучшему
По умолчанию

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

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

Последний раз редактировалось Smwr, 29.11.2016 в 11:25.
Smwr вне форума   Ответить с цитированием
За это сообщение Smwr нажился спасибкой от:
Старый 29.11.2016, 16:32   #3
Новичок
 
Регистрация: 14.11.2016
Сообщений: 8
Сказал Спасибо: 4
Имеет 2 спасибок в 1 сообщении
fastx пока неопределено
По умолчанию

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

советую посмотреть исходники rguard, там есть пример хука sendpacket (на с++ правда).
Rguard смотрел)) Насторожило то, что "c" и "h" занимают больше места, чем достаточно. Теперь буду пробовать запустить l2 под отладчиком
fastx вне форума   Ответить с цитированием
Старый 29.11.2016, 17:57   #4
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Smwr на пути к лучшему
По умолчанию

Потому что push не может впринципе закинуть меньше 4х байт.
Smwr вне форума   Ответить с цитированием
Старый 29.11.2016, 20:50   #5
Новичок
 
Регистрация: 14.11.2016
Сообщений: 8
Сказал Спасибо: 4
Имеет 2 спасибок в 1 сообщении
fastx пока неопределено
По умолчанию

Вроде push ax может закинуть два байта в стек. Кстати, по поводу формата "b" - там нету указателя, походу байты в стеке самом. А не подскажите тогда, как определить где конец этого аргумента? Пробовал запустить l2 под olly по этому гайду, но l2 выбивает с критом, типа не исправен клиент.
fastx вне форума   Ответить с цитированием
Старый 29.11.2016, 22:31   #6
Местный
 
Аватар для ScythLab
 
Регистрация: 24.10.2014
Сообщений: 190
Сказал Спасибо: 4
Имеет 42 спасибок в 40 сообщенях
ScythLab пока неопределено
По умолчанию

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

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

Гайд по запуску Ольки - что-то мне подсказывает, что данный метод не будет работать на некоторых современных защитах.
__________________
Хобби: разработка бота для Lineage.
ScythLab вне форума   Ответить с цитированием
За это сообщение ScythLab нажился спасибкой от:
Старый 30.11.2016, 18:43   #7
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Smwr на пути к лучшему
По умолчанию

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

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:57.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!