![]() |
eXeL@B —› Вопросы новичков —› Переписывание кода с ASM на C++. небольшая функция. |
Посл.ответ | Сообщение |
|
Создано: 10 апреля 2011 03:23 · Личное сообщение · #1 С помощью IDA Pro исследую одно приложенице и мне нужно выдрать оттуда небольшую функцию, но вот совсем нехватает знаний C++ и ASM. Это не вся функция, но пока я бьюсь вот над таким куском: Code:
Методику выбрал простую - смотрю значения всех регистров в IDA Pro, пишу код в C++, смотрю уже свою программку через туже IDA Pro и вижу большие расхождения.. Вот так вызывается она в исходном приложении: Code:
Значения параметров: eax=Stack[00001094]:0018F4C4 Stack[00001094]:0018F4C4 db 0 Stack[00001094]:0018F4C5 db 0 .... Stack[00001094]:0018F4C9 db 0 Stack[00001094]:0018F4CA db 0 .... ebx=Stack[00001094]:0018F5AC Stack[00001094]:0018F5AC db 37h ; 7 Stack[00001094]:0018F5AD db 37h ; 7 Stack[00001094]:0018F5AE db 3Bh ; ; Stack[00001094]:0018F5AF db 0E8h ; ø Stack[00001094]:0018F5B0 db 9Ch ; Ü Stack[00001094]:0018F5B1 db 96h ; Ö Stack[00001094]:0018F5B2 db 74h ; t Stack[00001094]:0018F5B3 db 1 Stack[00001094]:0018F5B4 db 0C8h ; L Stack[00001094]:0018F5B5 db 16h Stack[00001094]:0018F5B6 db 74h ; t Stack[00001094]:0018F5B7 db 1 Stack[00001094]:0018F5B8 db 0CCh ; ¦ .... eсx=00000006 В исходном приложении после выполнения: sub eax, [ebp+arg_8] eax становится равен 000000E8. У меня он равен чему угодно только не этому значению. Пишу в QT(win32-gcc - фактически - mingw32) на С++ c использованием ASM с параметрами QMAKE_CXXFLAGS += -masm=intel фактически в приложение я подую на вход "77" (остальное.. мусор?) ecx это strlen("77")+4 eax это неизвестно что(может ключ) но вообщем равен он нулям. Code:
У меня складывается полное ощущение, что я просто неправильно объявляю функцию и аргументы, неправильно их передаю, но множество комбинаций не дало должного результата.. получал в итоге 0x10,0x20,0x8, а нужно, чтобы eax был равен 000000E8. Буду рад за любую помощь. ![]() |
|
Создано: 10 апреля 2011 09:20 · Личное сообщение · #2 |
|
Создано: 10 апреля 2011 09:58 · Поправил: Veliant · Личное сообщение · #3 |
|
Создано: 10 апреля 2011 10:46 · Личное сообщение · #4 |
|
Создано: 10 апреля 2011 10:52 · Личное сообщение · #5 |
|
Создано: 11 апреля 2011 01:20 · Поправил: Vintersorg · Личное сообщение · #6 По-моему, какая-то ерунда у опа. Полная. vuliad пишет: В исходном приложении после выполнения: sub eax, [ebp+arg_8] eax становится равен 000000E8. У меня он равен чему угодно только не этому значению. Внутри функции createHash у тебя от второго аргумента, переданного этой функции (адрес массива login) отнимается третий (адрес массива f_key). Результат вычитания зависит от того, как и где компилятор расместил в памяти массивы (а он вообще не обязан размещать в памяти два последовательно объявленных массива друг за другом). И ты уверен, что оригинальной функции вторым и третим аргументами передаются именно адреса массивов, а не значения из них? Потому что странное какое-то действие - вычитать из адреса одного массива адрес другого. Кроме того, я не вижу, где у тебя в коде выделяется память под локальную переменную var_4 (адрес ebp-4). И да, в ecx, конечно, передается this. Veliant пишет: Полагаю это оптимизация компилятора. На самом деле код считает длину последовательности в eax, эдакий sizeof() Кстати да, может быть. Хотя длина обычно высчитывается на стадии компиляции и вставляется в код в виде константы. А вообще, подобные ассемблерные вставки - мина замедленного действия. Хочешь использовать выдранный код без модификации, переходи на VC и используй "голые" функции ( директива __declspec ( naked ) ) ![]() |
|
Создано: 11 апреля 2011 08:45 · Личное сообщение · #7 |
![]() |
eXeL@B —› Вопросы новичков —› Переписывание кода с ASM на C++. небольшая функция. |