решил поэкперементировать взял SendMessage да там и команд немного скопировал что там есть к себе первоначально он такой Код (Text): ;-------исходный MOV EDI,EDI PUSH EBP MOV EBP,ESP PUSH ESI MOV ESI,DWORD PTR SS:[EBP+C] TEST ESI,FFFE0000 JNZ user32.77D6117E MOV ECX,DWORD PTR SS:[EBP+8] CMP ECX,-1 JE user32.77D5DA92 CMP ECX,0FFFF JE user32.77D5DA92 CALL user32.77D38490 TEST EAX,EAX JE user32.77D5DA8B PUSH 1 PUSH DWORD PTR SS:[EBP+14] PUSH DWORD PTR SS:[EBP+10] PUSH ESI PUSH EAX CALL user32.77D3B67B POP ESI POP EBP RETN 10 ;-------исходный переделал на такой gettext proc ;hwnd:DWORD,message:DWORD,dlinna:DWORD,offset_:DWORD MOV EDI,EDI PUSH EBP MOV EBP,ESP PUSH ESI MOV ESI,DWORD PTR SS:[EBP+0Ch] TEST ESI,0FFFE0000h ;------------1 ;JNZ 077D6117Eh;user32.77D6117E jnz next1 jmp next1_ next1: push 077D6117Eh ret next1_: ;------------1 MOV ECX,DWORD PTR SS:[EBP+8] CMP ECX,-1 ;------------2 ;JE 077D5DA92h;user32.77D5DA92 je next2 jmp next2_ next2: push 077D5DA92h ret next2_: ;------------2 CMP ECX,0FFFFh ;------------3 ;JE 077D5DA92h;user32.77D5DA92 je next3 jmp next3_ next3: push 077D5DA92h ret next3_: ;------------3 ;------*-*-*-*4 ;CALL 077D38490h;user32.77D38490 mov eax,077D38490h call eax ;------*-*-*-*4 TEST EAX,EAX ;------------5 ;JE 077D5DA8Bh;user32.77D5DA8B je next4 jmp next4_ next4: push 077D5DA8Bh ret next4_: ;------------5 PUSH 1 PUSH DWORD PTR SS:[EBP+14] PUSH DWORD PTR SS:[EBP+10] PUSH ESI PUSH EAX ;----------6 ;CALL 077D3B67Bh ;user32.77D3B67B mov eax,077D3B67Bh call eax ;----------6 POP ESI POP EBP ret 10 gettext endp вроде переделал так что от аригинала не должен отличаться вызываю так Код (Text): push offset ascicod push 10 push 0dh;WM_GETTEXT push hwnd call gettext к примеру если вызвать с хандэлм нулевым то нет ошибок, а если с теми пораметрами как должна быть то выскакивает ошибка непойму в чём проблема
readme Возможно потому что в твоем коде не у всех цифр стоят h, например, перед решающим вызовом Код (Text): ... PUSH 1 PUSH DWORD PTR SS:[EBP+14] ;; !!! PUSH DWORD PTR SS:[EBP+10] ;; !!! PUSH ESI PUSH EAX ;----------6 ;CALL 077D3B67Bh ;user32.77D3B67B mov eax,077D3B67Bh call eax ... и при возврате Код (Text): ... POP EBP ret 10 ;; !!! gettext endp ...
а вот непонятно почему такая команда как call 077D38490h у компилятора вызывает ошибку? может можно как то обойти?
q_q как это нет? А переход на метку как осуществляется? другое дело MASM так задать не позволяет. Задай кодом: db 0E8h, 90h, 84h, 0D3h, 77h Только этот адрес 077D38490h может быть разный при загрузке системы- Винда DLL user32 может ведь в другое место подгрузить.
yureckor Нету, переход идет через смещение (расстояние от текущего адреса инструкции call до требуемого 0x77d38490), в фасме как-то так можно задавать Код (Text): ;======================================================= format pe gui at imagebase ;======================================================= imagebase = 0x00400000 ;======================================================= call $ + (0x77d38490 - imagebase - rva $) ;======================================================= а винда (nt так точно) user32 (системные dll) в другое место не загрузит, разный адрес будет в разных build'ах
bogrus цитаты из IntelQuickreference: E9 cd JMP rel32 Jump near, relative, displacement relative to next instruction EA cp JMP ptr16:32 Jump far, absolute, address given in operand
yureckor другое дело MASM так задать не позволяет Если _очень_ надо, то можно так Код (Text): ... mov ax,cs mov ll,ax jmp short @F @@: db 09Ah ; call ptr16:32 dd 077D38490h ll dw 0 ... Только этот адрес 077D38490h может быть разный Это совсем другая история, я вообще не понимаю затеи readme.
то что call на смещение переходит я тогда тоже в отладчике убедился, впринципе устраивает и mov eax,** call eax присто думал что можно с фиксированным адресом тоже