Chỉ cần sử dụng một thủ tục giả sau mã và trừ hai, ví dụ:
procedure Code
asm
call ebx;
end;
procedure CodeEnd;
asm end;
CodeSize := DWORD_PTR(@CodeEnd) - DWORD_PTR(@Code);
CopyMemory(@MyByteArray[0], @Code, CodeSize);
Lưu ý rằng trong mã bạn cũng sử dụng sử dụng Delphi mã thay vì asm miễn là bạn đừng gọi vào mã khác (chức năng/thủ tục/rtl)
EDIT: như một câu trả lời cho các ý kiến từ Serg và David Heffernan tôi đã xác minh kết quả với Delphi 2010 trong chế độ phát hành.
tôi đã sử dụng đoạn mã sau:
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;
Các báo cáo CodeSize là 8 Bytes, tôi sau đó xác nhận bằng Ida Pro (disassembler trên thực thi):
.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
Vì vậy, trong ví dụ này mov eax , 0 là 5 byte (B8 00 00 00 00), retn (được thêm bởi trình biên dịch) là 1 byte (C3), căn chỉnh 4 là 2 byte (8B C0) là 8 trong tổng số.
Nếu bạn đang sử dụng một ngôn ngữ có trình tích hợp sẵn, tại sao không sử dụng bộ kết hợp đó? – hvd
Lý do khác nhau. Nhưng cảm ơn bạn đã trả lời. –
tìm kiếm nội dung như vậy? http://www.delphibasics.info/home/delphibasicssnippets/executingpreparedshellcodeindelphi – bummi