Wystarczy zastosować procedurę atrapę następujący kod i odjąć dwa, np:
procedure Code
asm
call ebx;
end;
procedure CodeEnd;
asm end;
CodeSize := DWORD_PTR(@CodeEnd) - DWORD_PTR(@Code);
CopyMemory(@MyByteArray[0], @Code, CodeSize);
pamiętać, że w kodzie używać również użyć kodu Delphi zamiast ASM tak długo, jak nie nazywają się inny kod (funkcje/procedury/rtl)
EDYCJA: jako odpowiedź na komentarze Serga i Davida Heffernana zweryfikowałem wyniki z Delphi 2010 w trybie zwolnienia.
Użyłem poniższy kod:
procedure Code;
asm
mov eax, 0;
end;
procedure CodeEnd;
asm end;
procedure TForm4.Button1Click(Sender: TObject);
begin
ShowMessageFmt('CodeSize=%d', [DWORD_PTR(@CodeEnd) - DWORD_PTR(@Code)]);
end;
Podawane CodeSize jest 8 bajtów, to następnie weryfikowane za pomocą Ida Pro (dezasembler na wykonywalnego):
.text:004B3344 Code proc near
.text:004B3344
.text:004B3344 B8 00 00 00 00 mov eax, 0
.text:004B3349 C3 retn
.text:004B3349 Code endp
.text:004B3349
.text:004B3349 ; -----------------------------
.text:004B334A 8B C0 align 4
Więc w tym przykładzie mov eax , 0 to 5 bajtów (B8 00 00 00 00), retn (dodane przez kompilator) to 1 bajt (C3), wyrównanie 4 wynosi 2 bajty (8B C0), co daje łącznie 8.
Jeśli używasz języka z wbudowanym asemblerem, dlaczego nie używać tego asemblera? – hvd
Różne powody. Ale dzięki za twoją odpowiedź. –
szukasz czegoś takiego? http://www.delphibasics.info/home/delphibasicssnippets/executingpreparedshellcodeindelphi – bummi