Дизассемблирование программы

Тема в разделе "WASM.BEGINNERS", создана пользователем Lars6693, 27 авг 2005.

  1. Lars6693

    Lars6693 New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2005
    Сообщения:
    2
    Вот что сделано в MSVC 6.


    Код (Text):
    1.  
    2. #pragma comment(linker,"/MERGE:.data=.text")
    3. #pragma comment(linker,"/MERGE:.rdata=.text")
    4. #pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,ER /IGNORE:4078")
    5. #pragma comment(linker,"/SUBSYSTEM:WINDOWS")
    6. #pragma comment(linker,"/ENTRY:New_WinMain")
    7. #pragma comment(linker,"/NODEFAULTLIB")
    8. #include "windows.h"
    9.  
    10. void New_WinMain(void)
    11. {
    12.     DWORD dwFibra=0x6688;
    13.     DWORD dwptr=(DWORD)&dwFibra;
    14.     __asm{
    15.         call delta
    16.    
    17.         delta:
    18.         //pop ebp
    19.         mov eax,[esp]
    20.         sub eax,offset delta
    21.        
    22.     }
    23.     //printf("Hello World!\n");
    24.     char lpMessage[]="HELLO!\0x0";
    25.     char lpCaption[]="CAPTION\0x0";
    26.    
    27.    
    28.     MessageBoxA(NULL,lpMessage,lpCaption,MB_OK);
    29.  
    30.  
    31. //  return 0;
    32. }
    33.  




    А вот что выдала ИДА


    Код (Text):
    1.  
    2. 00401020 ; Attributes: bp-based frame
    3. 00401020
    4. 00401020                 public start
    5. 00401020 start           proc near
    6. 00401020
    7. 00401020 var_30          = dword ptr -30h
    8. 00401020 var_20          = dword ptr -20h
    9. 00401020 var_1C          = dword ptr -1Ch
    10. 00401020 var_18          = word ptr -18h
    11. 00401020 var_16          = byte ptr -16h
    12. 00401020 var_14          = dword ptr -14h
    13. 00401020 var_10          = dword ptr -10h
    14. 00401020 var_C           = word ptr -0Ch
    15. 00401020 var_8           = dword ptr -8
    16. 00401020 var_4           = dword ptr -4
    17. 00401020
    18. 00401020                 push    ebp
    19. 00401021                 mov     ebp, esp
    20. 00401023                 sub     esp, 20h
    21. 00401026                 push    ebx
    22. 00401027                 push    esi
    23. 00401028                 push    edi
    24. 00401029                 mov     [ebp+var_4], 6688h
    25. 00401030                 lea     eax, [ebp+var_4]
    26. 00401033                 mov     [ebp+var_8], eax
    27. 00401036                 call    $+5
    28. 0040103B                 mov     eax, [esp+30h+var_30]
    29. 0040103E                 sub     eax, 40103Bh
    30. 00401043                 mov     ecx, ds:dword_401008
    31. 00401049                 mov     [ebp+var_14], ecx
    32. 0040104C                 mov     edx, ds:dword_40100C
    33. 00401052                 mov     [ebp+var_10], edx
    34. 00401055                 mov     ax, ds:word_401010
    35. 0040105B                 mov     [ebp+var_C], ax
    36. 0040105F                 mov     ecx, ds:dword_401014
    37. 00401065                 mov     [ebp+var_20], ecx
    38. 00401068                 mov     edx, ds:dword_401018
    39. 0040106E                 mov     [ebp+var_1C], edx
    40. 00401071                 mov     ax, ds:word_40101C
    41. 00401077                 mov     [ebp+var_18], ax
    42. 0040107B                 mov     cl, ds:byte_40101E
    43. 00401081                 mov     [ebp+var_16], cl
    44. 00401084                 push    0
    45. 00401086                 lea     edx, [ebp+var_20]
    46. 00401089                 push    edx
    47. 0040108A                 lea     eax, [ebp+var_14]
    48. 0040108D                 push    eax
    49. 0040108E                 push    0
    50. 00401090                 call    ds:MessageBoxA
    51. 00401096                 pop     edi
    52. 00401097                 pop     esi
    53. 00401098                 pop     ebx
    54. 00401099                 mov     esp, ebp
    55. 0040109B                 pop     ebp
    56. 0040109C                 retn
    57. 0040109C start           endp
    58. 0040109C
    59. 0040109C ; ──────────────────────────────────────────────────────────────────────   ─────
    60. 0040109D                 align 4
    61. 004010A0                 dd 10C8h, 2 dup(0), 10DEh, 1000h, 5 dup(0), 10D0h, 0, 654D01BEh
    62. 004010A0                 dd 67617373h, 786F4265h, 53550041h, 32335245h, 6C6C642Eh
    63. 004010A0                 dd 46h dup(0)
    64. 004010A0 _text           ends
    65. 004010A0
    66. 004010A0
    67. 004010A0                 end start
    68.  






    Прагмы поставлены для уменьшения размера и совмещения секций. Но данных нет вообще в листинге.

    Вопрос!

    Начиная с адреса 00401043 что это и откуда взялось?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Это:

    char lpMessage[]="HELLO!\0x0";

    char lpCaption[]="CAPTION\0x0";

    суть - переменные объявлены в стеке, и туда копируются строчки.

    Решение:

    static char lpMessage[]="HELLO!\0x0";

    static char lpCaption[]="CAPTION\0x0";
     
  3. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    в общем читать про автоматические перменные и их размещение в стеке

    а также еслли тебе интересны подробности компиляции

    сделай pdb или map файл , импортируй в IDA и наслаждайся

    области памяти( переменные ) будут поименованы



    там где вот такая конструкция ecx, ds:dword_401008

    встань на dword_401008 и нажми "o" тогда операнд сконвертируется в offset и станет понятно что и куда ссылается будет потом сходи по этим ссылкам и если ида не обнаружила что это строки - сделай их строками вручную, текст приобретёт читаемый вид
     
  4. Lars6693

    Lars6693 New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2005
    Сообщения:
    2
    Спасибо