بهروز عباسی
دوشنبه 03 تیر 1392, 23:17 عصر
درود به همه
خسته نباشید .
بازم یه کار عجیب دارم:شیطان:
من دارم یه تابع برای ساخت Shell Code مینویسم چندتای مشکل دارم :
چرا این تابع (فعلاً تا همینجای کار) هم درست کار میکنه و هم اشتباه.
چطوری یک/مجموعه دستورات زبان Assembly رو به صورت یک پارامتر رشته ای به تابع پاس بدم و توی تابع اونو به صورت Inline Assembly دربیارم.
این تابعی که نوشتم :
(*
uses
System.StrUtils; *)
function ASM2Sh3lc0de: String;
type
TOpCode = array of Byte;
var
_Result: AnsiString;
function ASM2Opcode: TOpCode;
var
_Begin, _End: Pointer;
begin
ASM
LEA EAX, @@Begin
MOV _Begin, EAX
LEA EAX, @@end
MOV _End, EAX
JMP @@end
@@Begin:
(* --| Begin |-- *)
XOR EAX,EAX
POP EDX
POP ECX
(* --| End |-- *)
@@end:
end;
SetLength(Result, Integer(DWORD(_End) - DWORD(_Begin)));
Move(_Begin^, Pointer(Result)^, Length(Result));
end;
var
i: Integer;
begin
for i := 0 to High(ASM2Opcode) do
begin
_Result := _Result + (Format('$%X,', [ASM2Opcode[i]]));
end;
if RightStr(_Result, 1) = ',' then
_Result := LeftStr(_Result, Length(_Result) - 1);
Result := 'Const ShellCode:Array[0..' + IntToStr(High(ASM2Opcode)) + '] of byte = (' +
_Result + ');';
end;
این نتیجه حاصل از یک برنامه جا افتاده:قهقهه: :
106125
این هم نتیجه برنامه من برای همون دستورات Assembly :
106128
تا اینجا سوال اول من بود ،همون طور که توی تصاویر مشاهده میکنید چند دستور درسته و چندتا ...
سوال بعدی ؛اگه بخوام تابع رو به این صورت بنویسم باید چکار کنم ،اصلاً میشه ؟
(*
uses
System.StrUtils; *)
function ASM2Sh3lc0de(AInstruction: AnsiString): String;
type
TOpCode = array of Byte;
var
_Result: AnsiString;
function ASM2Opcode: TOpCode;
var
_Begin, _End: Pointer;
begin
ASM
LEA EAX, @@Begin
MOV _Begin, EAX
LEA EAX, @@end
MOV _End, EAX
JMP @@end
@@Begin:
(* --| Begin |-- *)
AInstruction
(* --| End |-- *)
@@end:
end;
SetLength(Result, Integer(DWORD(_End) - DWORD(_Begin)));
Move(_Begin^, Pointer(Result)^, Length(Result));
end;
var
i: Integer;
begin
for i := 0 to High(ASM2Opcode) do
begin
_Result := _Result + (Format('$%X,', [ASM2Opcode[i]]));
end;
if RightStr(_Result, 1) = ',' then
_Result := LeftStr(_Result, Length(_Result) - 1);
Result := 'Const ShellCode:Array[0..' + IntToStr(High(ASM2Opcode)) + '] of byte = (' +
_Result + ');';
end;
و مثلا اینطوری فراخوانیش کنم :
ASM2Sh3lc0de('XOR EAX,EAX')
با تشکر از همه.:لبخند:
خسته نباشید .
بازم یه کار عجیب دارم:شیطان:
من دارم یه تابع برای ساخت Shell Code مینویسم چندتای مشکل دارم :
چرا این تابع (فعلاً تا همینجای کار) هم درست کار میکنه و هم اشتباه.
چطوری یک/مجموعه دستورات زبان Assembly رو به صورت یک پارامتر رشته ای به تابع پاس بدم و توی تابع اونو به صورت Inline Assembly دربیارم.
این تابعی که نوشتم :
(*
uses
System.StrUtils; *)
function ASM2Sh3lc0de: String;
type
TOpCode = array of Byte;
var
_Result: AnsiString;
function ASM2Opcode: TOpCode;
var
_Begin, _End: Pointer;
begin
ASM
LEA EAX, @@Begin
MOV _Begin, EAX
LEA EAX, @@end
MOV _End, EAX
JMP @@end
@@Begin:
(* --| Begin |-- *)
XOR EAX,EAX
POP EDX
POP ECX
(* --| End |-- *)
@@end:
end;
SetLength(Result, Integer(DWORD(_End) - DWORD(_Begin)));
Move(_Begin^, Pointer(Result)^, Length(Result));
end;
var
i: Integer;
begin
for i := 0 to High(ASM2Opcode) do
begin
_Result := _Result + (Format('$%X,', [ASM2Opcode[i]]));
end;
if RightStr(_Result, 1) = ',' then
_Result := LeftStr(_Result, Length(_Result) - 1);
Result := 'Const ShellCode:Array[0..' + IntToStr(High(ASM2Opcode)) + '] of byte = (' +
_Result + ');';
end;
این نتیجه حاصل از یک برنامه جا افتاده:قهقهه: :
106125
این هم نتیجه برنامه من برای همون دستورات Assembly :
106128
تا اینجا سوال اول من بود ،همون طور که توی تصاویر مشاهده میکنید چند دستور درسته و چندتا ...
سوال بعدی ؛اگه بخوام تابع رو به این صورت بنویسم باید چکار کنم ،اصلاً میشه ؟
(*
uses
System.StrUtils; *)
function ASM2Sh3lc0de(AInstruction: AnsiString): String;
type
TOpCode = array of Byte;
var
_Result: AnsiString;
function ASM2Opcode: TOpCode;
var
_Begin, _End: Pointer;
begin
ASM
LEA EAX, @@Begin
MOV _Begin, EAX
LEA EAX, @@end
MOV _End, EAX
JMP @@end
@@Begin:
(* --| Begin |-- *)
AInstruction
(* --| End |-- *)
@@end:
end;
SetLength(Result, Integer(DWORD(_End) - DWORD(_Begin)));
Move(_Begin^, Pointer(Result)^, Length(Result));
end;
var
i: Integer;
begin
for i := 0 to High(ASM2Opcode) do
begin
_Result := _Result + (Format('$%X,', [ASM2Opcode[i]]));
end;
if RightStr(_Result, 1) = ',' then
_Result := LeftStr(_Result, Length(_Result) - 1);
Result := 'Const ShellCode:Array[0..' + IntToStr(High(ASM2Opcode)) + '] of byte = (' +
_Result + ');';
end;
و مثلا اینطوری فراخوانیش کنم :
ASM2Sh3lc0de('XOR EAX,EAX')
با تشکر از همه.:لبخند: