fasm+mysql

Тема в разделе "WASM.BEGINNERS", создана пользователем common_up, 18 ноя 2010.

  1. common_up

    common_up New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    85
    hi, сегодня пробывал работать с mysql. В общем обнаружился косяк, который не могу понять как разрешить
    1) Есть бинарный файл, в котором реализована работа с mysql (example)
    2) Есть мой бинарь, скелет которого:
    Код (Text):
    1. format PE gui 4.0
    2. section '.text' code readable executable
    3.  
    4.             entry start            
    5.     proc start 
    6.             local dd ?
    7.            
    8.             xor ebx,ebx
    9. int 3          
    10.             stdcall [my_init],ebx
    11.             ret
    12.     endp
    13.  
    14.  
    15. section '.data' data readable writable executable
    16. dd ?
    17. section '.rdata' import data readable
    18. library             kernel32,                   'KERNEL32.DLL',\
    19.                     user32,                 'USER32.DLL',\
    20.                     shell32,                'SHELL32.DLL',\
    21.                     libmysql,               'libmysql.dll' 
    22.                     include                 '%fasminc%\api\KERNEL32.INC'
    23.                     include                 '%fasminc%\api\USER32.INC'
    24.                     include                 '%fasminc%\api\SHELL32.INC'
    25. import libmysql             my_init,                'my_init'
    Собираю я значит скелет, запускаю его и вижу, что я при вызове stdcall [my_init] прыгаю совсем не туда:
    Код (Text):
    1. 1001ED40 >/$  803D E1731910>CMP BYTE PTR DS:[101973E1],0
    2. 1001ED47  |.  0F85 B2000000 JNZ 1001EDFF                                            ;  1001EDFF
    3. 1001ED4D  |.  FF05 E4731910 INC DWORD PTR DS:[101973E4]
    4. 1001ED53  |.  C605 E1731910>MOV BYTE PTR DS:[101973E1],1
    5. 1001ED5A  |.  C705 883D1910>MOV DWORD PTR DS:[10193D88],1B0
    6. 1001ED64  |.  C705 8C3D1910>MOV DWORD PTR DS:[10193D8C],1C0
    7. 1001ED6E  |.  E8 1D840200   CALL 10047190                                           ;  10047190
    8. 1001ED73  |.  E8 68140000   CALL 100201E0                                           ;  100201E0
    9. 1001ED78  |.  84C0          TEST AL,AL
    10. 1001ED7A  |.  74 03         JE SHORT 1001ED7F                                       ;  1001ED7F
    11. 1001ED7C  |.  B0 01         MOV AL,1
    12. 1001ED7E  |.  C3            RETN
    13. 1001ED7F  |>  833D F4731910>CMP DWORD PTR DS:[101973F4],0
    14. 1001ED86  |.  75 72         JNZ SHORT 1001EDFA                                      ;  1001EDFA
    15. 1001ED88  |.  E8 B3FCFFFF   CALL 1001EA40                                           ;  1001EA40
    16. 1001ED8D  |.  68 50D20610   PUSH 1006D250                                           ;  ASCII "HOME"
    17. 1001ED92  |.  E8 04140300   CALL 1005019B                                           ;  1005019B
    18. 1001ED97  |.  83C4 04       ADD ESP,4
    19. 1001ED9A  |.  A3 F4731910   MOV DWORD PTR DS:[101973F4],EAX
    20. 1001ED9F  |.  85C0          TEST EAX,EAX
    21. 1001EDA1  |.  74 13         JE SHORT 1001EDB6                                       ;  1001EDB6
    22. 1001EDA3  |.  50            PUSH EAX
    23. 1001EDA4  |.  68 00761910   PUSH 10197600
    24. 1001EDA9  |.  E8 22CEFFFF   CALL 1001BBD0                                           ;  1001BBD0
    25. 1001EDAE  |.  83C4 08       ADD ESP,8
    26. 1001EDB1  |.  A3 F4731910   MOV DWORD PTR DS:[101973F4],EAX
    27. 1001EDB6  |>  68 48D20610   PUSH 1006D248                                           ;  ASCII "UMASK"
    28. 1001EDBB  |.  E8 DB130300   CALL 1005019B                                           ;  1005019B
    29. 1001EDC0  |.  83C4 04       ADD ESP,4
    30. 1001EDC3  |.  85C0          TEST EAX,EAX
    31. 1001EDC5  |.  74 11         JE SHORT 1001EDD8                                       ;  1001EDD8
    32. 1001EDC7  |.  8BC8          MOV ECX,EAX
    33. 1001EDC9  |.  E8 52FBFFFF   CALL 1001E920                                           ;  1001E920
    34. 1001EDCE  |.  0D 80010000   OR EAX,180
    35. 1001EDD3  |.  A3 883D1910   MOV DWORD PTR DS:[10193D88],EAX
    36. 1001EDD8  |>  68 3CD20610   PUSH 1006D23C                                           ;  ASCII "UMASK_DIR"
    37. 1001EDDD  |.  E8 B9130300   CALL 1005019B                                           ;  1005019B
    38. 1001EDE2  |.  83C4 04       ADD ESP,4
    39. 1001EDE5  |.  85C0          TEST EAX,EAX
    40. 1001EDE7  |.  74 11         JE SHORT 1001EDFA                                       ;  1001EDFA
    41. 1001EDE9  |.  8BC8          MOV ECX,EAX
    42. 1001EDEB  |.  E8 30FBFFFF   CALL 1001E920                                           ;  1001E920
    43. 1001EDF0  |.  0D C0010000   OR EAX,1C0
    44. 1001EDF5  |.  A3 8C3D1910   MOV DWORD PTR DS:[10193D8C],EAX
    45. 1001EDFA  |>  E8 C1FEFFFF   CALL 1001ECC0                                           ;  1001ECC0
    46. 1001EDFF  |>  32C0          XOR AL,AL
    47. 1001EE01  \.  C3            RETN
    Судя по коду это тоже какая-то функка в libmysql.dll, но не та, что мне нужна.
    Открываю я значит бинарный example и протрассировав его вижу, что у бинарника example прыжок в:
    Код (Text):
    1. 10003540 >/$  6A 00         PUSH 0
    2. 10003542  |.  6A 00         PUSH 0
    3. 10003544  |.  6A 00         PUSH 0
    4. 10003546  |.  E8 D56F0100   CALL 1001A520                                           ;  mysql_server_init
    5. 1000354B  |.  85C0          TEST EAX,EAX
    6. 1000354D  |.  74 05         JE SHORT 10003554                                       ;  10003554
    7. 1000354F  |.  33C0          XOR EAX,EAX
    8. 10003551  |.  C2 0400       RETN 4
    9. 10003554  |>  56            PUSH ESI
    10. 10003555  |.  8B7424 08     MOV ESI,DWORD PTR SS:[ESP+8]
    11. 10003559  |.  85F6          TEST ESI,ESI
    12. 1000355B  |.  75 41         JNZ SHORT 1000359E                                      ;  1000359E
    13. 1000355D  |.  6A 30         PUSH 30
    14. 1000355F  |.  68 C8030000   PUSH 3C8
    15. 10003564  |.  E8 67BC0100   CALL 1001F1D0                                           ;  my_malloc
    16. 10003569  |.  8BF0          MOV ESI,EAX
    17. 1000356B  |.  83C4 08       ADD ESP,8
    18. 1000356E  |.  85F6          TEST ESI,ESI
    19. 10003570  |.  75 23         JNZ SHORT 10003595                                      ;  10003595
    20. 10003572  |.  A1 203A1910   MOV EAX,DWORD PTR DS:[10193A20]
    21. 10003577  |.  50            PUSH EAX
    22. 10003578  |.  68 E08D1910   PUSH 10198DE0
    23. 1000357D  |.  C705 E08F1910>MOV DWORD PTR DS:[10198FE0],7D8
    24. 10003587  |.  E8 C4FC0100   CALL 10023250                                           ;  strmov
    25. 1000358C  |.  83C4 08       ADD ESP,8
    26. 1000358F  |.  33C0          XOR EAX,EAX
    27. 10003591  |.  5E            POP ESI
    28. 10003592  |.  C2 0400       RETN 4
    29. 10003595  |>  C686 84030000>MOV BYTE PTR DS:[ESI+384],1
    30. 1000359C  |.  EB 10         JMP SHORT 100035AE                                      ;  100035AE
    31. 1000359E  |>  68 C8030000   PUSH 3C8
    32. 100035A3  |.  6A 00         PUSH 0
    33. 100035A5  |.  56            PUSH ESI
    34. 100035A6  |.  E8 75C70400   CALL 1004FD20                                           ;  1004FD20
    35. 100035AB  |.  83C4 0C       ADD ESP,0C
    36. 100035AE  |>  C786 F8020000>MOV DWORD PTR DS:[ESI+2F8],14
    37. 100035B8  |.  89B6 9C030000 MOV DWORD PTR DS:[ESI+39C],ESI
    38. 100035BE  |.  89B6 A0030000 MOV DWORD PTR DS:[ESI+3A0],ESI
    39. 100035C4  |.  89B6 A8030000 MOV DWORD PTR DS:[ESI+3A8],ESI
    40. 100035CA  |.  8B0D 18100810 MOV ECX,DWORD PTR DS:[10081018]                         ;  libmysql.1013C3A0
    41. 100035D0  |.  898E 90020000 MOV DWORD PTR DS:[ESI+290],ECX
    42. 100035D6  |.  8B15 0C100810 MOV EDX,DWORD PTR DS:[1008100C]                         ;  libmysql.10069510
    43. 100035DC  |.  52            PUSH EDX
    44. 100035DD  |.  8D86 5F020000 LEA EAX,DWORD PTR DS:[ESI+25F]
    45. 100035E3  |.  50            PUSH EAX
    46. 100035E4  |.  E8 67FC0100   CALL 10023250                                           ;  strmov
    47. 100035E9  |.  818E 0C030000>OR DWORD PTR DS:[ESI+30C],80
    48. 100035F3  |.  C686 9B030000>MOV BYTE PTR DS:[ESI+39B],1
    49. 100035FA  |.  8B0D 14100810 MOV ECX,DWORD PTR DS:[10081014]                         ;  libmysql.10069500
    50. 10003600  |.  83C4 08       ADD ESP,8
    51. 10003603  |.  898E 4C030000 MOV DWORD PTR DS:[ESI+34C],ECX
    52. 10003609  |.  C786 5C030000>MOV DWORD PTR DS:[ESI+35C],10
    53. 10003613  |.  C686 65030000>MOV BYTE PTR DS:[ESI+365],1
    54. 1000361A  |.  C686 85030000>MOV BYTE PTR DS:[ESI+385],0
    55. 10003621  |.  8BC6          MOV EAX,ESI
    56. 10003623  |.  5E            POP ESI
    57. 10003624  \.  C2 0400       RETN 4
    my binary code jamped to:
    Код (Text):
    1. 00403080 >40 ED 01 10                                      @н 1001ED40
    example binary file jamped to:
    Код (Text):
    1. 0001116A >40 35 00 10                                      @5. 10003540
    т.е получается разница в 0x1B800. Оке, пробуем:
    Код (Text):
    1. format PE gui 4.0
    2. section '.text' code readable executable
    3.  
    4.             entry start            
    5.     proc start 
    6.             local dd ?
    7.            
    8.             xor ebx,ebx
    9.             lea eax,[my_init]
    10.             mov eax,[eax]
    11.             [b]sub eax,0x1B800[/b]
    12.             push ebx
    13.             call  eax
    14.             ret
    15.     endp
    16.  
    17. section '.data' data readable writable executable
    18. dd ?
    19. section '.rdata' import data readable
    20. library             kernel32,                   'KERNEL32.DLL',\
    21.                     user32,                 'USER32.DLL',\
    22.                     shell32,                'SHELL32.DLL',\
    23.                     libmysql,               'libmysql.dll' 
    24.                     include                 '%fasminc%\api\KERNEL32.INC'
    25.                     include                 '%fasminc%\api\USER32.INC'
    26.                     include                 '%fasminc%\api\SHELL32.INC'
    27. import libmysql             my_init,                'my_init'
    Вуаля, мы на месте:)
    Код (Text):
    1. 10003540 >/$  6A 00         PUSH 0
    2. 10003542  |.  6A 00         PUSH 0
    3. 10003544  |.  6A 00         PUSH 0
    4. 10003546  |.  E8 D56F0100   CALL 1001A520                                           ;  mysql_server_init
    5. 1000354B  |.  85C0          TEST EAX,EAX
    6. 1000354D  |.  74 05         JE SHORT 10003554                                       ;  10003554
    7. 1000354F  |.  33C0          XOR EAX,EAX
    8. 10003551  |.  C2 0400       RETN 4
    9. 10003554  |>  56            PUSH ESI
    10. 10003555  |.  8B7424 08     MOV ESI,DWORD PTR SS:[ESP+8]
    11. 10003559  |.  85F6          TEST ESI,ESI
    12. 1000355B  |.  75 41         JNZ SHORT 1000359E                                      ;  1000359E
    13. 1000355D  |.  6A 30         PUSH 30
    14. 1000355F  |.  68 C8030000   PUSH 3C8
    15. 10003564  |.  E8 67BC0100   CALL 1001F1D0                                           ;  my_malloc
    16. 10003569  |.  8BF0          MOV ESI,EAX
    17. 1000356B  |.  83C4 08       ADD ESP,8
    18. 1000356E  |.  85F6          TEST ESI,ESI
    19. 10003570  |.  75 23         JNZ SHORT 10003595                                      ;  10003595
    20. 10003572  |.  A1 203A1910   MOV EAX,DWORD PTR DS:[10193A20]
    21. 10003577  |.  50            PUSH EAX
    22. 10003578  |.  68 E08D1910   PUSH 10198DE0
    23. 1000357D  |.  C705 E08F1910>MOV DWORD PTR DS:[10198FE0],7D8
    24. 10003587  |.  E8 C4FC0100   CALL 10023250                                           ;  strmov
    25. 1000358C  |.  83C4 08       ADD ESP,8
    26. 1000358F  |.  33C0          XOR EAX,EAX
    27. 10003591  |.  5E            POP ESI
    28. 10003592  |.  C2 0400       RETN 4
    29. 10003595  |>  C686 84030000>MOV BYTE PTR DS:[ESI+384],1
    30. 1000359C  |.  EB 10         JMP SHORT 100035AE                                      ;  100035AE
    31. 1000359E  |>  68 C8030000   PUSH 3C8
    32. 100035A3  |.  6A 00         PUSH 0
    33. 100035A5  |.  56            PUSH ESI
    34. 100035A6  |.  E8 75C70400   CALL 1004FD20                                           ;  1004FD20
    35. 100035AB  |.  83C4 0C       ADD ESP,0C
    36. 100035AE  |>  C786 F8020000>MOV DWORD PTR DS:[ESI+2F8],14
    37. 100035B8  |.  89B6 9C030000 MOV DWORD PTR DS:[ESI+39C],ESI
    38. 100035BE  |.  89B6 A0030000 MOV DWORD PTR DS:[ESI+3A0],ESI
    39. 100035C4  |.  89B6 A8030000 MOV DWORD PTR DS:[ESI+3A8],ESI
    40. 100035CA  |.  8B0D 18100810 MOV ECX,DWORD PTR DS:[10081018]                         ;  libmysql.1013C3A0
    41. 100035D0  |.  898E 90020000 MOV DWORD PTR DS:[ESI+290],ECX
    42. 100035D6  |.  8B15 0C100810 MOV EDX,DWORD PTR DS:[1008100C]                         ;  libmysql.10069510
    43. 100035DC  |.  52            PUSH EDX
    44. 100035DD  |.  8D86 5F020000 LEA EAX,DWORD PTR DS:[ESI+25F]
    45. 100035E3  |.  50            PUSH EAX
    46. 100035E4  |.  E8 67FC0100   CALL 10023250                                           ;  strmov
    47. 100035E9  |.  818E 0C030000>OR DWORD PTR DS:[ESI+30C],80
    48. 100035F3  |.  C686 9B030000>MOV BYTE PTR DS:[ESI+39B],1
    49. 100035FA  |.  8B0D 14100810 MOV ECX,DWORD PTR DS:[10081014]                         ;  libmysql.10069500
    50. 10003600  |.  83C4 08       ADD ESP,8
    51. 10003603  |.  898E 4C030000 MOV DWORD PTR DS:[ESI+34C],ECX
    52. 10003609  |.  C786 5C030000>MOV DWORD PTR DS:[ESI+35C],10
    53. 10003613  |.  C686 65030000>MOV BYTE PTR DS:[ESI+365],1
    54. 1000361A  |.  C686 85030000>MOV BYTE PTR DS:[ESI+385],0
    55. 10003621  |.  8BC6          MOV EAX,ESI
    56. 10003623  |.  5E            POP ESI
    57. 10003624  \.  C2 0400       RETN 4
    Честно говоря первый раз использую стороннюю API. Понятия не имею почему в импорт пишется неверное RVA имени API и как это вообще поправить ?
     
  2. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    а тут запятую не надо случайно:
    Код (Text):
    1. import libmysql,
    2.          my_init,'my_init'
    ?
    давно не программировал на fasm под Windows, но раньше всегда так делал.
     
  3. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    KIV
    Да, нужно.
     
  4. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    У меня исходник работает (после правки в import) и прыгает, куда надо. Кстати, почему int 3 с пробелом?
     
  5. common_up

    common_up New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    85
    Пилять нашел причину:) Стыдно товаищи, стыдно мне.
    closed.