Динамическая загрузка DLL написанной на FASM

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

  1. nastvood

    nastvood New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2009
    Сообщения:
    3
    Доброго дня уважаемые!
    Некоторое время писал на C, сейчас решил покодить на асм, выбрал FASM.
    Вопрос такой, написал я функцию реализующую md5(хотя грубо, но ладно не об этом), запихнул в каркас для DLL, вот чего получилось.
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5.  
    6. A_INIT=0x67452301
    7. B_INIT=0xefcdab89
    8. C_INIT=0x98badcfe
    9. D_INIT=0x10325476
    10.  
    11. section '.text' code readable executable
    12.  
    13. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    14.         mov     eax,TRUE
    15.         ret
    16. endp
    17.  
    18. macro F X,Y,Z
    19. {
    20.   mov eax,[X]
    21.   and eax,[Y]
    22.   mov edx,eax
    23.   mov eax,[X]
    24.   not eax
    25.   and eax,[Z]
    26.   or eax,edx
    27. }
    28.  
    29. macro G X,Y,Z
    30. {
    31.   mov eax,[X]
    32.   and eax,[Z]
    33.   mov edx,eax
    34.   mov eax,[Z]
    35.   not eax
    36.   and eax,[Y]
    37.   or eax,edx
    38. }
    39.  
    40. macro H X,Y,Z
    41. {
    42.    mov eax,[X]
    43.    xor eax,[Y]
    44.    xor eax,[Z]
    45. }
    46.  
    47. macro I X,Y,Z
    48. {
    49.    mov eax,[Z]
    50.    not eax
    51.    or eax,[X]
    52.    xor eax,[Y]
    53. }
    54.  
    55. macro RoundF a,b,c,d,x,s,ac
    56. {
    57.    F b,c,d
    58.    add eax,x
    59.    add eax,ac
    60.    add eax,[a]
    61.    rol eax,s
    62.    add eax,[b]
    63.    mov [a],eax
    64. }
    65.  
    66. macro RoundG a,b,c,d,x,s,ac
    67. {
    68.    G b,c,d
    69.    add eax,x
    70.    add eax,ac
    71.    add eax,[a]
    72.    rol eax,s
    73.    add eax,[b]
    74.    mov [a],eax
    75. }
    76.  
    77. macro RoundH a,b,c,d,x,s,ac
    78. {
    79.    H b,c,d
    80.    add eax,x
    81.    add eax,ac
    82.    add eax,[a]
    83.    rol eax,s
    84.    add eax,[b]
    85.    mov [a],eax
    86. }
    87.  
    88. macro RoundI a,b,c,d,x,s,ac
    89. {
    90.    I b,c,d
    91.    add eax,x
    92.    add eax,ac
    93.    add eax,[a]
    94.    rol eax,s
    95.    add eax,[b]
    96.    mov [a],eax
    97. }
    98.  
    99. proc md5s ucM:DWORD,len:BYTE, dig:DWORD
    100.      locals
    101.         dwMes dd 16 dup(0)
    102.         ucLenMes dd 8
    103.  
    104.         a dd 0
    105.         b dd 0
    106.         c dd 0
    107.         d dd 0
    108.      endl
    109.  
    110.         mov esi, [ucM]
    111.         lea edi, [dwMes]
    112.         xor ecx,ecx
    113.         mov cl,[len]
    114.         rep movsb
    115.  
    116.         mov [edi],dword 0x00000080 ;äîáàâëÿåì â êîíåö ñîîáùåíèÿ áèò ðàâíûé 1
    117.  
    118.         xor eax,eax
    119.         mov al,[len]  ;äîáàâëÿåì â êîíåö ëîê. ìàññèâà ïðåäòàâëåíèå äëèíû ñîîáùåíèÿ
    120.         mul [ucLenMes]
    121.         mov [ucLenMes-8],eax
    122.  
    123.         mov [a],A_INIT
    124.         mov [b],B_INIT
    125.         mov [c],C_INIT
    126.         mov [d],D_INIT
    127.  
    128.         RoundF a,b,c,d,[dwMes],7,0xd76aa478
    129.         RoundF d,a,b,c,[dwMes+4],12,0xe8c7b756
    130.         RoundF c,d,a,b,[dwMes+8],17,0x242070db
    131.         RoundF b,c,d,a,[dwMes+12],22,0xc1bdceee
    132.         RoundF a,b,c,d,[dwMes+16],7,0xf57c0faf
    133.         RoundF d,a,b,c,[dwMes+20],12,0x4787c62a
    134.         RoundF c,d,a,b,[dwMes+24],17,0xa8304613
    135.         RoundF b,c,d,a,[dwMes+28],22,0xfd469501
    136.         RoundF a,b,c,d,[dwMes+32],7,0x698098d8
    137.         RoundF d,a,b,c,[dwMes+36],12,0x8b44f7af
    138.         RoundF c,d,a,b,[dwMes+40],17,0xffff5bb1
    139.         RoundF b,c,d,a,[dwMes+44],22,0x895cd7be
    140.         RoundF a,b,c,d,[dwMes+48],7,0x6b901122
    141.         RoundF d,a,b,c,[dwMes+52],12,0xfd987193
    142.         RoundF c,d,a,b,[dwMes+56],17,0xa679438e
    143.         RoundF b,c,d,a,[dwMes+60],22,0x49b40821
    144.  
    145.         RoundG a,b,c,d,[dwMes+4],5,0xf61e2562
    146.         RoundG d,a,b,c,[dwMes+24],9,0xc040b340
    147.         RoundG c,d,a,b,[dwMes+44],14,0x265e5a51
    148.         RoundG b,c,d,a,[dwMes],20,0xe9b6c7aa
    149.         RoundG a,b,c,d,[dwMes+20],5,0xd62f105d
    150.         RoundG d,a,b,c,[dwMes+40],9,0x02441453
    151.         RoundG c,d,a,b,[dwMes+60],14,0xd8a1e681
    152.         RoundG b,c,d,a,[dwMes+16],20,0xe7d3fbc8
    153.         RoundG a,b,c,d,[dwMes+36],5,0x21e1cde6
    154.         RoundG d,a,b,c,[dwMes+56],9,0xc33707d6
    155.         RoundG c,d,a,b,[dwMes+12],14,0xf4d50d87
    156.         RoundG b,c,d,a,[dwMes+32],20,0x455a14ed
    157.         RoundG a,b,c,d,[dwMes+52],5,0xa9e3e905
    158.         RoundG d,a,b,c,[dwMes+8],9,0xfcefa3f8
    159.         RoundG c,d,a,b,[dwMes+28],14,0x676f02d9
    160.         RoundG b,c,d,a,[dwMes+48],20,0x8d2a4c8a
    161.  
    162.         RoundH a,b,c,d,[dwMes+20],4,0xfffa3942
    163.         RoundH d,a,b,c,[dwMes+32],11,0x8771f681
    164.         RoundH c,d,a,b,[dwMes+44],16,0x6d9d6122
    165.         RoundH b,c,d,a,[dwMes+56],23,0xfde5380c
    166.         RoundH a,b,c,d,[dwMes+4],4,0xa4beea44
    167.         RoundH d,a,b,c,[dwMes+16],11,0x4bdecfa9
    168.         RoundH c,d,a,b,[dwMes+28],16,0xf6bb4b60
    169.         RoundH b,c,d,a,[dwMes+40],23,0xbebfbc70
    170.         RoundH a,b,c,d,[dwMes+52],4,0x289b7ec6
    171.         RoundH d,a,b,c,[dwMes],11,0xeaa127fa
    172.         RoundH c,d,a,b,[dwMes+12],16,0xd4ef3085
    173.         RoundH b,c,d,a,[dwMes+24],23,0x04881d05
    174.         RoundH a,b,c,d,[dwMes+32],4,0xd9d4d039
    175.         RoundH d,a,b,c,[dwMes+48],11,0xe6db99e5
    176.         RoundH c,d,a,b,[dwMes+60],16,0x1fa27cf8
    177.         RoundH b,c,d,a,[dwMes+8],23,0xc4ac5665
    178.  
    179.         RoundI a,b,c,d,[dwMes],6,0xf4292244
    180.         RoundI d,a,b,c,[dwMes+28],10,0x432aff97
    181.         RoundI c,d,a,b,[dwMes+56],15,0xab9423a7
    182.         RoundI b,c,d,a,[dwMes+20],21,0xfc93a039
    183.         RoundI a,b,c,d,[dwMes+48],6,0x655b59c3
    184.         RoundI d,a,b,c,[dwMes+12],10,0x8f0ccc92
    185.         RoundI c,d,a,b,[dwMes+40],15,0xffeff47d
    186.         RoundI b,c,d,a,[dwMes+4],21,0x85845dd1
    187.         RoundI a,b,c,d,[dwMes+32],6,0x6fa87e4f
    188.         RoundI d,a,b,c,[dwMes+60],10,0xfe2ce6e0
    189.         RoundI c,d,a,b,[dwMes+24],15,0xa3014314
    190.         RoundI b,c,d,a,[dwMes+52],21,0x4e0811a1
    191.         RoundI a,b,c,d,[dwMes+16],6,0xf7537e82
    192.         RoundI d,a,b,c,[dwMes+44],10,0xbd3af235
    193.         RoundI c,d,a,b,[dwMes+8],15,0x2ad7d2bb
    194.         RoundI b,c,d,a,[dwMes+32],21,0xeb86d391
    195.  
    196.         add [a],A_INIT
    197.         add [b],B_INIT
    198.         add [c],C_INIT
    199.         add [d],D_INIT
    200.  
    201.         lea esi, [a]
    202.         mov edi, [dig]
    203.         mov ecx,dword 0x4
    204.         rep movsd
    205.  
    206.         ret
    207. endp
    208.  
    209. section '.edata' export data readable
    210.  
    211.   export 'md5.dll',\
    212.          md5s,'md5s'
    213.  
    214. section '.reloc' fixups data discardable
    Получил md5.dll
    Теперь хочу пользовать эту dll из VC2008

    пишу такой код
    Код (Text):
    1. typedef void (WINAPI* _md5s)(unsigned char *ms,unsigned char len,unsigned char *ret);
    2. ......
    3. char cData[]="1234567";
    4. unsigned char uc[16]={0};
    5. HMODULE hDLL = LoadLibrary("md5.dll");
    6. _md5s md5s = (_md5s)GetProcAddress(hDLL,"md5s");
    7. md5s((unsigned char *)cData,7,uc);
    VC ругается, пишет

    Run-Time Check Failure #0 — The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention


    Я так понимаю проблема в передаче параметров, но решить ее не могу.

    Если кто-нибудь знает что надо делать, пожалуйсто напишите решение!
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Есть подозрение, что дело не в стеке, а в том, что регистры esi/edi не сохраняются. Вызываемая ф-ия должна сохранять регистры ebp, ebx, esi, edi, также флаг направления цепочеченых команд.
     
  3. nastvood

    nastvood New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2009
    Сообщения:
    3
    Уважаемый я вам бесконечно благодарен, вставил pushad/popad и все OK!!!!
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    обычно отладка помогает
     
  5. nastvood

    nastvood New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2009
    Сообщения:
    3
    в том то и дело, что отлаживался! в отдельном ехе функция пахала дай бог