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