Сейчас на форуме: Rio (+10 невидимых) |
![]() |
eXeL@B —› Основной форум —› Передача аргументов через стек |
Посл.ответ | Сообщение |
|
Создано: 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 Почему возращаемые аргументы - ниже вершины стека??? ![]() |
|
Создано: 04 апреля 2006 09:23 · Личное сообщение · #2 Натупил что-то я, спать надо по ночам ![]() Допустим есть функция, которая принимает 3 параметра и имеет локальные переменные. Тгда при входе в ф-ию будет примерно след: push ebp mov ebp,esp sub esp,xx тогда arg_4,arg_8 - обращение к переданным параметрам arg_4,arg_8 - обращение к локальным переменным p.s. зачем второй топик-то создавать? ![]() |
|
Создано: 04 апреля 2006 10:28 · Личное сообщение · #3 Так понимаю ты хотел сказать var_C и var_4 - обращение к локальным переменным. НО переменные на то и локальные - они не могут быть использованы в ином месте - кроме как в функции в которой их описали. А в моем случае - они возвращаются в [ESP-0Ch] и [ESP-4] Как, прмерно, будет выглядеть вызов этой функции на языке высокого уровня? ![]() |
|
Создано: 04 апреля 2006 10:33 · Личное сообщение · #4 |
|
Создано: 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 параметра. ![]() |
|
Создано: 04 апреля 2006 11:54 · Поправил: bloM · Личное сообщение · #6 |
|
Создано: 04 апреля 2006 13:31 · Личное сообщение · #7 |
|
Создано: 04 апреля 2006 20:31 · Личное сообщение · #8 |
|
Создано: 04 апреля 2006 23:32 · Личное сообщение · #9 |
|
Создано: 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 пишет: Натупил что-то я, спать надо по ночам Особенно весной ! ![]() |
|
Создано: 05 апреля 2006 09:21 · Личное сообщение · #11 |
|
Создано: 05 апреля 2006 10:12 · Личное сообщение · #12 |
![]() |
eXeL@B —› Основной форум —› Передача аргументов через стек |
Эта тема закрыта. Ответы больше не принимаются. |