Сейчас на форуме: Rio (+10 невидимых)

 eXeL@B —› Основной форум —› Передача аргументов через стек
Посл.ответ Сообщение

Ранг: 4.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 апреля 2006 08:15
· Личное сообщение · #1

Господа! Столкнулся со следующей проблемой: задача - вызвать функцию находящуюся в готовой dll библиотеке на языке высокого уровня. Вот что выдал IDA

.text:10001250 ; int __cdecl SetSize(int &,float *,char *)
.text:10001250 public ?SetSize@@Z
.text:10001250 ?SetSize@@Z proc near
.text:10001250
.text:10001250 var_C = dword ptr -0Ch
.text:10001250 var_4 = dword ptr -4
.text:10001250 arg_0 = dword ptr 4
.text:10001250 arg_4 = dword ptr 8
.text:10001250 arg_8 = dword ptr 0Ch
.text:10001250
.text:10001250 mov eax, large fs:0
.text:10001256 mov ecx, [esp+arg_0]
...............................................................
...............................................................
и выход из нее

mov ecx, [esp+18h+var_C]
pop edi
pop esi
xor eax, eax
mov large fs:0, ecx
pop ebp
add esp, 0Ch
retn

Если с arg0,arg_4,arg_8 вроде как все ясно, то что такое var_C и var_4 Почему возращаемые аргументы - ниже вершины стека???



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 04 апреля 2006 09:23
· Личное сообщение · #2

Натупил что-то я, спать надо по ночам
Допустим есть функция, которая принимает 3 параметра и имеет локальные переменные. Тгда при входе в ф-ию будет примерно след:
push ebp
mov ebp,esp
sub esp,xx

тогда
arg_4,arg_8 - обращение к переданным параметрам
arg_4,arg_8 - обращение к локальным переменным

p.s. зачем второй топик-то создавать?



Ранг: 4.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 апреля 2006 10:28
· Личное сообщение · #3

Так понимаю ты хотел сказать var_C и var_4 - обращение к локальным переменным. НО переменные на то и локальные - они не могут быть использованы в ином месте - кроме как в функции в которой их описали. А в моем случае - они возвращаются в [ESP-0Ch] и [ESP-4]
Как, прмерно, будет выглядеть вызов этой функции на языке высокого уровня?



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

Создано: 04 апреля 2006 10:33
· Личное сообщение · #4

bloM пишет:
Почему возращаемые аргументы - ниже вершины стека???

Это штучки Микрософтовского Си. Для оптимизации он временные переменные
на стеке создает. В обычных дизассемблерах дельта по подпрограммам "плавает".
IDA пытается отследить такие переменные и создает для них единое имя.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 04 апреля 2006 10:50
· Личное сообщение · #5

bloM
А в моем случае - они возвращаются в [ESP-0Ch] и [ESP-4]

Где? Покажи в коде, где что возвращается.
.text:10001250 var_C = dword ptr -0Ch
.text:10001250 var_4 = dword ptr -4
это не возвращаемые значения, или я чего-то не понимаю.
Что и куда функция возвращает можно сказать только после её полного реверса.

bloM
Как, прмерно, будет выглядеть вызов этой функции на языке высокого уровня?
Передай ей 3 параметра.



Ранг: 4.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 апреля 2006 11:54 · Поправил: bloM
· Личное сообщение · #6

Похоже в [ESP-0Ch] и [ESP-4] и впрямь мусор...



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 апреля 2006 13:31
· Личное сообщение · #7

чтобы вызвать фунцкцию надо написать:
int __cdecl SetSize(int &,float *,char *)
push arg3_ptr_string
push arg2_ptr_float
push arg1_int
call SetSize

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



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

Создано: 04 апреля 2006 20:31
· Личное сообщение · #8

bloM пишет:
Почему возращаемые аргументы - ниже вершины стека???

Внимательнее смотри : var_C и arg_8 - это одно то же место,
то же самое var_4 и arg_0. Просто в аргументы идет присваивание
и ИДА решила, что это локальные переменные на стеке - ошиблась.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 04 апреля 2006 23:32
· Личное сообщение · #9

tundra37 пишет:
Внимательнее смотри : var_C и arg_8 - это одно то же место,
то же самое var_4 и arg_0.

Совсем не так, это две разные переменныё.



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

Создано: 05 апреля 2006 08:38 · Поправил: tundra37
· Личное сообщение · #10

bloM пишет:
mov ecx, [esp+18h+var_C]
pop edi

Ну во-первых я перепутал arg's местами. Внимательно считаем :
на стеке сохранено 3 регистра = +С и еще +С на 3 аргумента.
С+С=18. Т.е. 18+var_С указывает на верхушку стека - там где arg_0.
Соответственно var_4 - это arg_8. Просто тов. bloM
начало должен был поподробнее указать.
Там обязательно стоит кроме
.text:10001250 mov eax, large fs:0
.text:10001256 mov ecx, [esp+arg_0]
...............................................................

еще
push ebp
push esi
push edi - Это же Си - их не может не быть.
Соответственно esp просто разный и естественно

bloM пишет:
Похоже в [ESP-0Ch] и [ESP-4] и впрямь мусор...

- эти ячейки ничего общего не имеют с [sp+18h+var_c] и ....

asd пишет:
Натупил что-то я, спать надо по ночам

Особенно весной !



Ранг: 4.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 апреля 2006 09:21
· Личное сообщение · #11

Всем спасибо за помощь. Подитожив все сказанное вами - var_C и var_4 - просто локальные переменные, которые после возврата из call SetSize просто напросто затираются.



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 05 апреля 2006 10:12
· Личное сообщение · #12

http://www.exelab.ru/f/action=vthread&forum=5&topic=4449


 eXeL@B —› Основной форум —› Передача аргументов через стек
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати