2014-01-19 3 views
0

У меня есть эта разобранном функция: (? 0x14 = 20 правого)Где аргументы этой функции ASM?

PUSH EBP 
MOV  EBP, ESP 
SUB  ESP, C 
PUSH 408506 
MOV  EAX, DWORD PTR FS:[0] 
PUSH EAX 
MOV  DWORD PTR FS:[0], ESP 
SUB  ESP, 14 
PUSH EBX 
PUSH ESI 
PUSH EDI 
MOV  DWORD PTR [EBP-C], ESP 
MOV  DWORD PTR [EBP-8], 4077D8 
XOR  EBX, EBX 
MOV  DWORD PTR [EBP-4], EBX 
MOV  EDI, DWORD PTR [EBP+8] 
PUSH EDI 
MOV  EAX, DWORD PTR [EDI] 
CALL NEAR DWORD PTR [EAX+4] 
MOV  ESI, DWORD PTR [EBP+C] 
MOV  ECX, DWORD PTR [EDI] 
LEA  EDX, DWORD PTR [EBP-1C] 
MOV  DWORD PTR [EBP-18], EBX 
PUSH EDX 
PUSH ESI 
PUSH EDI 
MOV  DWORD PTR [EBP-1C], EBX 
CALL NEAR DWORD PTR [ECX+37C] 
CMP  WORD PTR [EBP-1C], BX 
JE  00558206 
MOV  EAX, DWORD PTR [EDI+D8] 
CMP  EAX, EBX 
JE  0055819A 
CMP  WORD PTR [EAX], 1 
JNZ  0055819A 
MOV  EDX, DWORD PTR [EAX+14] 
MOV  ECX, DWORD PTR [EAX+10] 
MOV  EBX, DWORD PTR [401190] 
MOVSX ESI, SI 
SUB  ESI, EDX 
CMP  ESI, ECX 
JB  0055818F 
CALL NEAR EBX 
LEA  EAX, DWORD PTR [ESI+ESI*4] 
LEA  EAX, DWORD PTR [EAX+EAX*4] 
SHL  EAX, 5 
JMP  005581A2 
MOV  EBX, DWORD PTR [401190] 
CALL NEAR EBX 
MOV  ECX, DWORD PTR [EDI+D8] 
MOV  EDX, DWORD PTR [ECX+C] 
MOV  ECX, DWORD PTR [EBP+10] 
MOV  AX, WORD PTR [EDX+EAX+2C8] 
MOV  WORD PTR [ECX], AX 
MOV  EAX, DWORD PTR [EDI+D8] 
TEST EAX, EAX 
JE  005581E6 
CMP  WORD PTR [EAX], 1 
JNZ  005581E6 
MOVSX ESI, WORD PTR [EBP+C] 
MOV  EDX, DWORD PTR [EAX+14] 
MOV  ECX, DWORD PTR [EAX+10] 
SUB  ESI, EDX 
CMP  ESI, ECX 
JB  005581DB 
CALL NEAR EBX 
LEA  EAX, DWORD PTR [ESI+ESI*4] 
LEA  EAX, DWORD PTR [EAX+EAX*4] 
SHL  EAX, 5 
JMP  005581E8 
CALL NEAR EBX 
MOV  EDX, DWORD PTR [EDI+D8] 
MOV  DWORD PTR [EBP-18], -1 
MOV  ECX, DWORD PTR [EDX+C] 
MOV  DX, WORD PTR [ECX+EAX+2CA] 
MOV  EAX, DWORD PTR [EBP+14] 
MOV  WORD PTR [EAX], DX 
MOV  EAX, DWORD PTR [EBP+8] 
PUSH EAX 
MOV  ECX, DWORD PTR [EAX] 
CALL NEAR DWORD PTR [ECX+8] 
MOV  EDX, DWORD PTR [EBP+18] 
MOV  AX, WORD PTR [EBP-18] 
MOV  WORD PTR [EDX], AX 
MOV  EAX, DWORD PTR [EBP-4] 
MOV  ECX, DWORD PTR [EBP-14] 
POP  EDI 
POP  ESI 
MOV  DWORD PTR FS:[0], ECX 
POP  EBX 
MOV  ESP, EBP 
POP  EBP 
RETN 14 

я могу догадаться, что функция принимает, возможно, 5 аргументов по 4 байта каждый из них из-за RETN 14. Тогда я также вижу в этом разобранном коде такие вещи, как EBP+8 и EBP+C, поэтому я думаю: «О, это первый и второй аргументы». Ну, верно, это первый и второй аргументы функции. Но я не могу догадаться, где другие. Я пробовал EBP+16, EBP+20 и EBP+24, но значения, которые они мне дают, не похожи на аргументы.

Как я могу интерпретировать этот разобранный код?

Заранее спасибо.

+0

Ваша математика неправильно. 0xC + 4 - 0x10, а не 0x16. Вы сделали ту же ошибку, когда добавили 4 к 0x16. –

+0

Спасибо за ваш комментарий, но я уже знаю это. Я удалил '0x', поэтому компилятор автоматически преобразует десятичные значения в шестнадцатеричные значения. – cdonts

+1

Ну, код обращается к MOV EAX, DWORD PTR [EBP + 14] ', который равен 20 десятичным, поэтому, если там есть мусор, код обращается к мусору. –

ответ

1

Ваше предположение верно; Сканирование через разборку, я нашел пять параметров, которые ссылаются, все DWORD так 4 байта:

DWORD PTR [EBP+8]  ; first parameter (the first 8 bytes are reserved for return address and original EBP) 
DWORD PTR [EBP+C]  ; hexadecimal C = decimal 12 
DWORD PTR [EBP+10] ; hexadecimal 10 = decimal 16 
DWORD PTR [EBP+14] ; hexadecimal 14 = decimal 20 
DWORD PTR [EBP+18] ; hexadecimal 18 = decimal 24 

Учитывая число предложенных для параметров 3/4/5, я полагаю, вы просто запутались, когда преобразование между десятичной и шестнадцатеричное; вы должны хранить таблицу чисел на вашей стороне, пока это не станет для вас второй натурой.

EDIT: о вызовах ...

разборки, как представляется, является функцией с stdcall вызывающей конвенции. Чтобы вызвать функцию, сначала нужно нажать каждое значение параметра двойного слова в стеке, справа налево (т. Е. Первый параметр будет последним). Функция очищает стек, поэтому вам не нужно ничего всплывать после этого. Вы можете найти образцы источник здесь:

+0

Спасибо за ваш ответ! Я делал именно это, и он все еще дает мне неправильные значения для трех последних аргументов. Если я хочу передать эти значения в качестве аргументов новой функции, какие регистры следует использовать? 'eax ebx ecx edx esi'? Я не очень уверен в последнем. – cdonts

+0

Если вызываемый пользователь обнаруживает недопустимые значения в стеке, то вызывающий абонент поднимается. Если вызывающий абонент написан на ассемблере, обратите внимание на правильное соглашение о вызове (см. Мое редактирование выше). Если вызывающий объект написан на языке высокого уровня, убедитесь, что он скомпилирован в присутствии правильного прототипа функции. –

+0

Да, я думаю, проблема в функции (которая написана на языке высокого уровня, а не в ASM). Я соглашусь с этим ответом из-за вашей помощи. Благодаря! – cdonts

Смежные вопросы