Сейчас на форуме: _MBK_, Adler (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Переписывание кода с ASM на C++. небольшая функция.
Посл.ответ Сообщение

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

Создано: 10 апреля 2011 03:23
· Личное сообщение · #1

С помощью IDA Pro исследую одно приложенице и мне нужно выдрать оттуда небольшую функцию, но вот совсем нехватает знаний C++ и ASM.
Это не вся функция, но пока я бьюсь вот над таким куском:
Code:
  1. CreateHash proc near                     ; CODE XREF: sub_783F20+28p
  2.  
  3. var_4= dword ptr -4
  4. arg_0= dword ptr  8
  5. arg_4= dword ptr  0Ch
  6. arg_8= dword ptr  10h
  7.  
  8. push    ebp
  9. mov     ebp, esp
  10. push    ecx
  11. push    ebx
  12. mov     ebx, [ebp+arg_0]
  13. mov     [ebp+var_4], ecx
  14. mov     al, bl
  15. mov     cl, 9Dh 
  16. imul    cl
  17. xor     edx, edx
  18. push    esi
  19. mov     esi, 86Dh
  20. mov     byte ptr [ebp+arg_0+3], al
  21. test    ebx, ebx
  22. jle     short loc_783E50
  23. mov     eax, [ebp+arg_4]
  24. sub     eax, [ebp+arg_8]
  25. ...

Методику выбрал простую - смотрю значения всех регистров в IDA Pro, пишу код в C++, смотрю уже свою программку через туже IDA Pro и вижу большие расхождения..

Вот так вызывается она в исходном приложении:
Code:
  1. mov     ecx, [ebp+login_length]
  2. mov     [edi+ebx], eax
  3. mov     eax, [ebp+arg_8]
  4. push    eax
  5. push    ebx                             ; ïàðîëü
  6. push    ecx
  7. mov     ecx, esi
  8. call    CreateHash 


Значения параметров:
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:
  1. #include <stdio.h>
  2. int xasm = 0x123; // 0x123 - просто чтобы понять, что что-то поменялось
  3.  
  4. int createHash(int length,char *login, char *key_f)
  5. {
  6. __asm(".intel_syntax noprefix\t\n"); // Да я пытаюсь вставить кусок ASM, чтобы он у меня заработал.. это же возможно да?
  7.  
  8. __asm("mov ebp, esp");
  9. __asm("mov ebx, [ebp+8]");
  10. __asm("mov [ebp-4], ecx");
  11. __asm("mov al, bl");
  12. __asm("mov cl, 0x9d");
  13. __asm("imul cl");
  14. __asm("xor edx,edx");
  15. __asm("mov esi, 0x86d");
  16. __asm("mov byte ptr [ebp+8+3],al");
  17. __asm("test ebx,ebx");
  18. //__asm("jle short loc_783E50");
  19. __asm("mov eax,[ebp+0x0C]");
  20. __asm("sub eax,[ebp+0x10]");
  21. __asm("mov _xasm, eax");
  22.  
  23. }
  24.  
  25.  
  26. int main()
  27. {
  28. char login[]="77";
  29. char f_key[]={0x00,0x00};
  30.  
  31. createHash(6,login,f_key);
  32.  
  33. printf( "xasm = %x\n", xasm);
  34.  
  35. return 0;


У меня складывается полное ощущение, что я просто неправильно объявляю функцию и аргументы, неправильно их передаю, но множество комбинаций не дало должного результата.. получал в итоге 0x10,0x20,0x8, а нужно, чтобы eax был равен 000000E8.
Буду рад за любую помощь.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 10 апреля 2011 09:20
· Личное сообщение · #2

В сях соглашение о вызове по дефолту cdecl, а нужно stdcall.

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

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

Создано: 10 апреля 2011 09:58 · Поправил: Veliant
· Личное сообщение · #3

Code:
  1. mov     eax, [ebp+arg_4]
  2. sub     eax, [ebp+arg_8]

Полагаю это оптимизация компилятора. На самом деле код считает длину последовательности в eax, эдакий sizeof()

Начало функции на C может выглядеть так
Code:
  1. {
  2.          length = (((length & 0xFF)*9Dh) << 24) | (length & 0xFFFFFF);
  3.          if ( length > 0 )
  4.          {
  5.          }
  6. }




Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

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

Если не получается, попробуй Hex-Rays для IDA Pro.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

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

в ecx-this, скорее всего первым reintepret_cast идет. Произведние последнего байта и 0x9D в Арг.0 обратно идет. Если Hex-rays кривой код сгенерит, проще одной асм вставкой скопировать себе.



Ранг: 15.5 (новичок), 6thx
Активность: 0.01=0.01
Статус: Участник

Создано: 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 ) )



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 11 апреля 2011 08:45
· Личное сообщение · #7

vuliad
Может целиком всю функцию выложите? А так по крохам собирать - сначала вопросы будут по одному куску, потом - по другому... Да и анализировать всю функцию будет гораздо проще.


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


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