Nije losa ideja, samo sto zauzima dosta bajtova. Razmisljao sam o problemu, i
sastavio sam listu svega (ukljucujuci i tvoje ideje) sto bi moglo da dodje u
obzir za call. Hvala na pomoci.
Code:
(1)
mov eax, addr
call eax
5 + 2 = 7 bajtova (unistava eax)
(2)
push eax
mov eax, addr
call eax
pop eax
1 + 5 + 2 + 1 = 9 bajtova
(3)
push addr
call dword [esp]
add esp, 4
5 + 3 + 3 = 11 bajtova
(4)
push addr
push addr
retn
5 + 5 + 1 = 11 bajtova (+ dodatni fixup 4 bajta)
u pocetku sam koristio ovo:
(5)
nasm makro:
%macro calla 1
[section .data] ; prebaci se u .data sekciju
%%addr:
dd %1 ; stavi na %%addr nalazi ciljnu adresu
__SECT__ ; vrati se na sekciju u kojoj si bio
call dword [%%addr] ; indirektni skok
%endmacro
4 bajta u .data + 6 = 10 bajtova, ali posto nemam nacina da iz makroa proverim
koje su sve adrese vec bile, svaki naredni poziv istoj funkciji nepotrebno
ponovo stavlja istu adresu u .data
Verovatno je najbolje kombinovati opcije (1) i (2) preko makroa:
calla 0x12345678 ; mov eax, 0x12345678/call eax
calla 0x12345678, ecx ; mov ecx, 0x12345678/call ecx
calla 0x12345678, push ; push eax/mov eax, 0x12345678/call eax/pop eax