Кодогенерация от vc++ 7.0

Тема в разделе "LANGS.C", создана пользователем cresta, 8 окт 2007.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вот такая функция:

    Код (Text):
    1.     void __declspec(naked)foo (){
    2.         __asm {
    3.             push    ebx
    4.             sub     esp,1024
    5.             mov     ebx,[esp+1032]
    6.             xor     eax,eax
    7.             dec     ebx
    8.         _loop:    
    9.             inc     ebx
    10.             cmp     byte ptr[ebx],'0'
    11.             jne     _next
    12.             inc     eax
    13.         _next:
    14.             cmp     byte ptr[ebx],0
    15.             jne     _loop
    16.  
    17.             xor     ebx,ebx
    18.         _loop1:
    19.             mov     ecx,[1032+eax*4]
    20.             mov     edx,[esp+ecx]
    21.             push    edx
    22.             inc     ebx
    23.             dec     eax
    24.             jns     _loop1
    25.  
    26.             push    [esp]
    27.             call    foo_1
    28.  
    29.             inc     ebx
    30.         _loop2:
    31.             pop     eax
    32.             dec     ebx
    33.             jnz     _loop2
    34.  
    35.             push    [esp]
    36.             call    foo_2
    37.  
    38.             pop     ebx
    39.             add     esp,1024
    40.         }
    41.     }
    Вот код, вернее огрызки кода, которые вижу в Оле:

    Код (Text):
    1. 00403590   $ 53             PUSH EBX
    2. 00403591   . 81EC 00040000  SUB ESP,400
    3. 00403597   . 8B9C24 0804000>MOV EBX,DWORD PTR SS:[ESP+408]
    4. 0040359E   . 33C0           XOR EAX,EAX
    5. 004035A0   . 4B             DEC EBX
    6. 004035A1   > 43             INC EBX
    7. 004035A2   . 803B 25        CMP BYTE PTR DS:[EBX],30
    8. 004035A5   . 75 01          JNZ SHORT prog.004035A8
    9. 004035A7   . 40             INC EAX
    10. 004035A8   > 803B 00        CMP BYTE PTR DS:[EBX],0
    11. 004035AB   .^75 F4          JNZ SHORT prog.004035A1
    12. 004035AD   . 33DB           XOR EBX,EBX
    13. 004035AF     8B             DB 8B
    14. 004035B0     0C             DB 0C
    15. 004035B1     85             DB 85
    16. 004035B2     08             DB 08
    17. 004035B3     04             DB 04
    18. 004035B4     00             DB 00
    19. 004035B5     00             DB 00
    20. 004035B6     8B             DB 8B
    21. 004035B7     14             DB 14
    22. 004035B8     0C             DB 0C
    23. 004035B9     52             DB 52                                    ;  CHAR 'R'
    24. 004035BA     43             DB 43                                    ;  CHAR 'C'
    25. 004035BB     48             DB 48                                    ;  CHAR 'H'
    26. 004035BC     79             DB 79                                    ;  CHAR 'y'
    27. 004035BD     F1             DB F1
    28. 004035BE     FF             DB FF
    29. 004035BF     34             DB 34                                    ;  CHAR '4'
    30. 004035C0     24             DB 24                                    ;  CHAR '$'
    31. 004035C1     E8             DB E8
    32. 004035C2   . 4F 5A 00       ASCII "OZ",0
    33. 004035C5     00             DB 00
    34. 004035C6     43             DB 43                                    ;  CHAR 'C'
    35. 004035C7     58             DB 58                                    ;  CHAR 'X'
    36. 004035C8     4B             DB 4B                                    ;  CHAR 'K'
    37. 004035C9     75             DB 75                                    ;  CHAR 'u'
    38. 004035CA     FC             DB FC
    39. 004035CB     FF             DB FF
    40. 004035CC     34             DB 34                                    ;  CHAR '4'
    41. 004035CD     24             DB 24                                    ;  CHAR '$'
    42. 004035CE     E8             DB E8
    43. 004035CF     F9             DB F9
    44. 004035D0     DA             DB DA
    45. 004035D1     FF             DB FF
    46. 004035D2     FF             DB FF
    47. 004035D3     5B             DB 5B                                    ;  CHAR '['
    далее такой же мусор.

    Куда делась часть функции после xor ebx,ebx ?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    mov ecx,[1032+eax*4]
    наверное [esp+1032+eax*4]
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Мда, посыпаю голову пеплом :dntknw:
    Что-то засиделся я в сях, пора назад в асм возвращаться. Элементарное забывается...
    Должно быть lea ecx,[1032+eax*4], а не mov ecx,[1032+eax*4]

    Хотя тут возникает другой вопрос: почему такую инструкцию пропускает cl? Если это некорректная инструкция, то должно было быть сообщение об ошибке. Если сообщения об ошибке нет - значит валидная инструкция, и должен быть какой-то опкод, а не куча байт.
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    А в Иду нельзя засунуть? Олли по части дизасма не большой спец
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Asterix

    Иды у меня нет. А Оля действительно что-то напутала.
    Сейчас вспомнил про PeExplorer, там тоже дизассемблер есть, и в нем всё нормально отображается. В смысле показывает инструкцию mov ecx,[1032+eax*4], а не набор DB, как в Оле.
    Значит будем знать, что оля спотыкается.
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Можно заставить Олю трактовать выделенный кусок памяти как код или данные.
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    особенно если много call-jmp-ret и кросс-адресация между ними :dntknw:
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Есть такое, в таких случаях надо убирать анализ (Analys - remove analys from module).
     
  9. den_po

    den_po New Member

    Публикаций:
    0
    Регистрация:
    18 май 2007
    Сообщения:
    1
    дизасм odbg можно поправить

    Plugin OllyDbg : FullDisasm
    Here is a small plugin for OllyDbg 1.10 which allows you to replace the old disassemble routine used in OllyDbg by a more recent one (beaengine). With this plugin, you can now debug MMX, FPU, SSE, SSE2, SSE3 and SSSE3 without problems
    http://binary-reverser.org/tools/FullDisasm/FullDisasm.dll
    или
    http://reverseengineering.online.fr/spip/IMG/zip/FullDisasm.zip

    отсюда: http://www.cracklab.ru/f/index.php?action=vthread&forum=3&topic=9198