Сейчас на форуме: tyns777, cppasm, dutyfree, asfa (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Работа с аргументами функции в IDA
Посл.ответ Сообщение

Ранг: 3.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 06 марта 2017 21:33
· Личное сообщение · #1

Всем привет!

Имееться функция WSASend, второй аргумент данной функции это указатель на структуру "WSABUF," которая, в свою очередь, содержит указатель на "buf", до содержимого этого буфера мне и нужно добраться. В IDA Pro это выглядит так:


Вопрос вот в чем, как В IDA работать с передаваемыми в функцию значениями? Я предполагаю, что для того чтобы получить доступ к буферу нужно проделать следующее:
1. достать из второго аргумента WSASend адрес структуры "WSABUF";
2. по адресу структуры найти указатель на "buf";
Проблема в том, что я не могу понять как достать эти значения. Также не понятно что содержиться во всплывающем окошке при наведении курсора на аргумент, по идее там же должен быть адрес WSABUF, почему тогда напротив arg8 стоит знак '?'.




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 06 марта 2017 21:45 · Поправил: =TS=
· Личное сообщение · #2

Проще всего по "Y" задать прототип функции, тогда параметрам автоматически привоится тип (или не присвоится).
Во всплывающем окошке отображаются стековые параметры функции (можно увидеть по "Ctrl-K").

-----
DREAMS CALL US




Ранг: 3.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 06 марта 2017 21:56 · Поправил: Rew
· Личное сообщение · #3

=TS=
Спасибо за ответ.

Прототип задан "__int64 __fastcall ws2_32_WSASend(int, int, __int64, __int64)" потому что подключен сервер символов. Только странно почему на MSDN речь идет про 7 аргументов, а в прототипе всео 4.
Забыл добавить что я работаю в режиме отладки, отладчик Windbg.



Ранг: 58.3 (постоянный), 50thx
Активность: 0.040.08
Статус: Участник

Создано: 06 марта 2017 22:07 · Поправил: DrVB_5_6
· Личное сообщение · #4

arg0 ...arg_30 - это аргументы функции. Их там явно больше 4, а точнее - 7, как и требуется. Прототип функции - кривой.
Правда не совсем понятно, х64 по типам переменных (скорей всего, в том числе и разрядность аргументов), а функция Win32?
Во всплывающем окошке всего-навсего типы данных из фрейма функции, в данном случае - аргументы.



Ранг: 3.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 06 марта 2017 23:26 · Поправил: Rew
· Личное сообщение · #5

DrVB_5_6
Да, это приложение х64, а функция WSASend экспортируется из библиотеки WS2_32.dll. Могу предположить, что это просто историческое название библиотеки, а не деле она скомпилирована под х64.

Если даже прототип неправильный, ведь это влияет только на отображение, верно? В дизассемблированом виде все же правильно. В данном случае, меня в первую очередь интересует как вытащить из второго аргумента(arg_8) адрес структуры на которую он указывает. Я не могу разобраться как узнать какие значения передала вызывающая функция, функции WSASend.



Ранг: 58.3 (постоянный), 50thx
Активность: 0.040.08
Статус: Участник

Создано: 07 марта 2017 00:41
· Личное сообщение · #6

Rew пишет:
Я не могу разобраться как узнать какие значения передала вызывающая функция

Так смотреть и надо вызов этой функции в вызывающей функции. __fastcall предполагает определённый порядок передачи параметров в функцию. В МСДН всё это есть!




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 07 марта 2017 01:37
· Личное сообщение · #7

Rew
Проверь перед самым вызовом функции первые параметры наверняка передаются в регистрах, а не в стеке.

почему тогда напротив arg8 стоит знак '?'
Потому что данный аргумент располагается в стеке и не имеет заданного заранее значения, в отличие от инициализированных данных.

-----
EnJoy!




Ранг: 3.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 марта 2017 05:24 · Поправил: Rew
· Личное сообщение · #8

DrVB_5_6,Jupiter
Благодарю за ответы.

Мне казалось что IDA понимает соглашения о вызове и предоставляет возможность быстро перейти к переданным значениям в памяти.

Прототип WSASend выглядит таким образом:
Code:
  1. int WSASend(
  2.   _In_  SOCKET                             s,
  3.   _In_  LPWSABUF                           lpBuffers,
  4.   _In_  DWORD                              dwBufferCount,
  5.   _Out_ LPDWORD                            lpNumberOfBytesSent,
  6.   _In_  DWORD                              dwFlags,
  7.   _In_  LPWSAOVERLAPPED                    lpOverlapped,
  8.   _In_  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
  9. );

Судя по этой заметке, при fastcall аргументы передаются слева направо - первые 4 аргумента в регистрах RCX, RDX, R8, R9, остальные через стек. Мне нужен второй аргумент, который содержит указатель на структуру WSABUF и как я понимаю его нужно искать в регистре RDX.
Структура WSABUF выглядит таким образом:
Code:
  1. typedef struct __WSABUF {
  2.   u_long   len;
  3.   char FAR *buf;
  4. } WSABUF, *LPWSABUF;


Вот что происходит перед вызовом WSASend:

И сразу после захода в функцию:

Как я понимаю инструкция "lea rdx, [rsp+170h+var_120]", должна положить в RDX адрес [rsp+170h+var_120], верно? Тогда почему на момент захода в WSASend, в RDX лежит адрес со смещением в 8 байт от [rsp+170h+var_120]?
Ладно, идем по текущему адресу в RDX:

И тут вопрос, как интерпретировать эти значения, то есть, первые 8 байт от RDX получается - "u_long len", а следующие 8 - "char FAR *buf"?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 марта 2017 20:27
· Личное сообщение · #9

что значит как интерпретировать ? а превратить эти значение в DQ 8 байтовый и посмотреть куда что указывает - кто мешает ?

вообще прежде чем дебажить и разбирать не плохо для начала что называется "расчистить пространство"
т.е. посмотреть и понять что вообще происходить намного впереди и намного дальше того места что изучаете

я вот прямо так сразу даже зная о конверсии соглашения не могу назвать и знать что куда там у вас передалось,
значит надо тупо с самого начала уже идти у вас на поводу ваших угадываний и уходить дальше в лес ? нет уж

начните с того что бы отталкиваться от чего то 100% уверенностью, и идите дальше только по 100% уверенности

а то вы начали с угадывания и дальше ушли в угадывание, но зато с кучей вопросов на который вряд ли кто то сможет что то сказать

декомпилер под 64 вроде слили ? так нормально разберите этот сенд вызов определив где там что передается в каких регистрах на 100%
а потом уже дальше изучайте




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 08 марта 2017 01:35
· Личное сообщение · #10

Rew пишет:
И тут вопрос, как интерпретировать эти значения, то есть, первые 8 байт от RDX получается - "u_long len", а следующие 8 - "char FAR *buf"?


всё верно

-----
IZ.RU





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 08 марта 2017 02:01
· Личное сообщение · #11

call cs:offset, а ничего что сегментация урезана:

Code:
  1. 64-bit mode — Segmentation is generally (but not completely) disabled, 
  2. creating a flat 64-bit linear-address space. Specifically, the processor treats the 
  3. segment base of CS, DS, ES, and SS as zero in 64-bit mode (this makes a linear 
  4. address equal an effective address).


Может быть и в остальном это косяки дизасма ?

-----
vx




Ранг: 58.3 (постоянный), 50thx
Активность: 0.040.08
Статус: Участник

Создано: 08 марта 2017 16:24
· Личное сообщение · #12

difexacaw пишет:
Может быть и в остальном это косяки дизасма ?

Это косяки компилятора, который данный код сотворил.
difexacaw
call cs:offset и call offset в х64 могут быть и различаются шестнадцатиричными значениями. Все претензии к Intel'у. А вообще-то надо знать матчасть!!!

| Сообщение посчитали полезным: difexacaw


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 08 марта 2017 17:11
· Личное сообщение · #13

DrVB_5_6

На счёт матчасти согласен, плюсану даже.

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 марта 2017 19:10
· Личное сообщение · #14

а не связано ли колупания храмого с этой новостью ? --> Link <--



Ранг: 58.3 (постоянный), 50thx
Активность: 0.040.08
Статус: Участник

Создано: 08 марта 2017 20:32
· Личное сообщение · #15

reversecode пишет:
а не связано ли колупания храмого с этой новостью ? --> Link <--

ну с такими познаниями, как у ТС, до подобных результатов, как до Китая ...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 марта 2017 20:39
· Личное сообщение · #16

где то новость проскакивала, в штатах или канаде много шахтеров осталось без работы, поэтому на местном рынке появилось много предложений о начинающих программерах

жажда денег и не такое заставит выучить



Ранг: 3.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 марта 2017 20:49
· Личное сообщение · #17

Всем спасибо, разобрался.

reversecode пишет:
а не связано ли колупания храмого с этой новостью ? --> Link <--

Не связано.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 марта 2017 20:50
· Личное сообщение · #18

что то часто вспоминается с пиратов кариб

- че ты пялишься в библию? ты ж читать не умеешь!
- старания в прок идут!



 eXeL@B —› Вопросы новичков —› Работа с аргументами функции в IDA
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати