📄 morphine.dpr
字号:
Inc(AMem);
PCardinal(AMem)^:=ANum;
Inc(AMem,4);
end;
procedure JmpReg32(var AMem:PByte;AReg:Byte);
begin
AMem^:=$FF; //jmp | call
Inc(AMem);
AMem^:=$E0+AReg; //reg32
Inc(AMem);
end;
procedure CallReg32(var AMem:PByte;AReg:Byte);
begin
AMem^:=$FF; //jmp | call
Inc(AMem);
AMem^:=$D0+AReg; //reg32
Inc(AMem);
end;
procedure Cld(var AMem:PByte);
begin
AMem^:=$FC; //cld
Inc(AMem);
end;
procedure Std(var AMem:PByte);
begin
AMem^:=$FD; //std
Inc(AMem);
end;
procedure Nop(var AMem:PByte);
begin
AMem^:=$90; //nop
Inc(AMem);
end;
procedure Stc(var AMem:PByte);
begin
AMem^:=$F9; //stc
Inc(AMem);
end;
procedure Clc(var AMem:PByte);
begin
AMem^:=$F8; //clc
Inc(AMem);
end;
procedure Cmc(var AMem:PByte);
begin
AMem^:=$F5; //cmc
Inc(AMem);
end;
procedure XchgReg32Rand(var AMem:PByte);
begin
AMem^:=$87; //xchg
Inc(AMem);
AMem^:=$C0+RandomReg32All*9; //reg32
Inc(AMem);
end;
function XchgReg32Reg32(var AMem:PByte;AReg1,AReg2:Byte):Byte;
begin
if AReg2=REG_EAX then begin AReg2:=AReg1; AReg1:=REG_EAX end;
if AReg1=REG_EAX then ThrowTheDice(Result,2)
else Result:=2;
if Result=2 then
begin
AMem^:=$87; //xchg
Inc(AMem);
AMem^:=$C0+AReg2*8+AReg1; //reg32
end else AMem^:=$90+AReg2; //xchg eax,reg32
Inc(AMem);
end;
procedure MovReg32Rand(var AMem:PByte);
begin
AMem^:=$8B; //mov
Inc(AMem);
AMem^:=$C0+RandomReg32All*9; //reg32
Inc(AMem);
end;
procedure IncReg32(var AMem:PByte;AReg:Byte);
begin
AMem^:=$40+AReg; //inc reg32
Inc(AMem);
end;
procedure DecReg32(var AMem:PByte;AReg:Byte);
begin
AMem^:=$48+AReg; //dec reg32
Inc(AMem);
end;
function IncReg32Rand(var AMem:PByte):Byte;
begin
Result:=RandomReg32All;
IncReg32(AMem,Result);
end;
function DecReg32Rand(var AMem:PByte):Byte;
begin
Result:=RandomReg32All;
DecReg32(AMem,Result);
end;
function LeaReg32Reg32(var AMem:PByte;AReg1,AReg2:Byte):Byte;
begin
Result:=2;
AMem^:=$8D; //mov
Inc(AMem);
if AReg2=REG_EBP then
begin
Inc(Result);
AMem^:=AReg1*8+$45; //reg32,ebp
Inc(AMem);
AMem^:=$00; //+0
end else AMem^:=AReg1*8+AReg2; //reg32,regmem
Inc(AMem);
if AReg2=REG_ESP then
begin
Inc(Result);
AMem^:=$24; //esp
Inc(AMem);
end;
end;
function LeaReg32Reg32MemIdx8(var AMem:PByte;AReg1,AReg2,AIdx:Byte):Byte;
begin
Result:=3;
AMem^:=$8D; //lea
Inc(AMem);
AMem^:=$40+AReg1*8+AReg2; //reg32,reg32mem
Inc(AMem);
if AReg2=REG_ESP then
begin
Inc(Result);
AMem^:=$24; //esp
Inc(AMem);
end;
AMem^:=AIdx; //idx8
Inc(AMem);
end;
procedure LeaReg32Rand(var AMem:PByte);
begin
AMem^:=$8D; //lea
Inc(AMem);
AMem^:=$00+RandomReg32EspEbp*9; //reg32
Inc(AMem);
end;
procedure LeaReg32Addr32(var AMem:PByte;AReg,AAddr:Cardinal);
begin
AMem^:=$8D; //lea
Inc(AMem);
AMem^:=$05+AReg*8; //reg32
Inc(AMem);
PCardinal(AMem)^:=AAddr; //addr32
Inc(AMem,4);
end;
procedure TestReg32Rand(var AMem:PByte);
begin
AMem^:=$85; //test
Inc(AMem);
AMem^:=$C0+RandomReg32All*9; //reg32
Inc(AMem);
end;
procedure OrReg32Rand(var AMem:PByte);
begin
AMem^:=$0B; //or
Inc(AMem);
AMem^:=$C0+RandomReg32All*9; //reg32
Inc(AMem);
end;
procedure AndReg32Rand(var AMem:PByte);
begin
AMem^:=$23; //and
Inc(AMem);
AMem^:=$C0+RandomReg32All*9; //reg32
Inc(AMem);
end;
procedure TestReg8Rand(var AMem:PByte);
var
LReg8:Byte;
begin
LReg8:=RandomReg8ABCD;
AMem^:=$84; //test
Inc(AMem);
AMem^:=$C0+LReg8*9; //reg8
Inc(AMem);
end;
procedure OrReg8Rand(var AMem:PByte);
var
LReg8:Byte;
begin
LReg8:=RandomReg8ABCD;
AMem^:=$0A; //or
Inc(AMem);
AMem^:=$C0+LReg8*9; //reg8
Inc(AMem);
end;
procedure AndReg8Rand(var AMem:PByte);
var
LReg8:Byte;
begin
LReg8:=RandomReg8ABCD;
AMem^:=$22; //and
Inc(AMem);
AMem^:=$C0+LReg8*9; //reg8
Inc(AMem);
end;
procedure CmpRegRegNum8Rand(var AMem:PByte);
var
LRnd:Byte;
begin
LRnd:=Random(3);
AMem^:=$3A+LRnd; //cmp
Inc(AMem);
if LRnd<2 then LRnd:=Random($40)+$C0
else LRnd:=Random($100);
AMem^:=LRnd; //reg16 | reg32 | num16
Inc(AMem);
end;
function CmpReg32Reg32(var AMem:Pbyte;AReg1,AReg2:Byte):Byte;
begin
Result:=2;
AMem^:=$39; //cmp
Inc(AMem);
AMem^:=$C0+AReg1+AReg2*8; //reg1,reg2
Inc(AMem);
end;
procedure CmpReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$83; //cmp
Inc(AMem);
AMem^:=$F8+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure CmpReg32RandNum8(var AMem:PByte;AReg:Byte);
begin
CmpReg32Num8(AMem,AReg,Random($100));
end;
procedure CmpRandReg32RandNum8(var AMem:PByte);
begin
CmpReg32RandNum8(AMem,RandomReg32All);
end;
procedure JmpNum8(var AMem:PByte;ANum:Byte);
var
LRnd:Byte;
begin
LRnd:=Random(16);
if LRnd=16 then AMem^:=$EB //jmp
else AMem^:=$70+LRnd; //cond jmp
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure SubReg32Reg32(var AMem:PByte;AReg1,AReg2:Byte);
begin
AMem^:=$29; //sub
Inc(AMem);
AMem^:=AReg2*8+AReg1+$C0; //reg32,reg32
Inc(AMem);
end;
procedure SubReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$83; //sub
Inc(AMem);
AMem^:=$E8+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
function SubReg32Num8Rand(var AMem:PByte;ANum:Byte):Byte;
begin
Result:=RandomReg32All;
SubReg32Num8(AMem,Result,ANum);
end;
function AddReg32Num8Rand(var AMem:PByte;ANum:Byte):Byte;
begin
Result:=RandomReg32All;
AddReg32Num8(AMem,Result,ANum);
end;
procedure SubAlNum8(var AMem:PByte;ANum:Byte);
begin
AMem^:=$2C; //sub al
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure TestAlNum8(var AMem:PByte;ANum:Byte);
begin
AMem^:=$A8; //test al
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure TestAlNum8Rand(var AMem:PByte);
begin
TestAlNum8(AMem,Random($100));
end;
procedure SubReg8Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$80; //sub
Inc(AMem);
AMem^:=$E8+AReg; //reg8
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure SubReg8Num8Rand(var AMem:PByte;ANum:Byte);
var
LReg8:Byte;
begin
LReg8:=RandomReg8ABCD;
SubReg8Num8(AMem,LReg8,ANum);
end;
procedure TestReg8Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$F6; //test
Inc(AMem);
AMem^:=$C0+AReg; //reg8
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure TestReg8Num8Rand(var AMem:PByte);
begin
TestReg8Num8(AMem,RandomReg8ABCD,Random($100));
end;
procedure AddReg8Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$80; //add
Inc(AMem);
AMem^:=$C0+AReg; //reg8
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure AddReg8Num8Rand(var AMem:PByte;ANum:Byte);
var
LReg8:Byte;
begin
LReg8:=RandomReg8ABCD;
AddReg8Num8(AMem,LReg8,ANum);
end;
procedure AddAlNum8(var AMem:PByte;ANum:Byte);
begin
AMem^:=$04; //add al
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure FNop(var AMem:PByte);
begin
AMem^:=$D9; //fnop
Inc(AMem);
AMem^:=$D0;
Inc(AMem);
end;
procedure OrReg16Rand(var AMem:PByte);
var
LReg16:Byte;
begin
LReg16:=RandomReg16All;
AMem^:=$66; //or | test | and
Inc(AMem);
AMem^:=$0B;
Inc(AMem);
AMem^:=$C0+LReg16*9; //reg16
Inc(AMem);
end;
procedure TestReg16Rand(var AMem:PByte);
var
LReg16:Byte;
begin
LReg16:=RandomReg16All;
AMem^:=$66; //or | test | and
Inc(AMem);
AMem^:=$85;
Inc(AMem);
AMem^:=$C0+LReg16*9; //reg16
Inc(AMem);
end;
procedure AndReg16Rand(var AMem:PByte);
var
LReg16:Byte;
begin
LReg16:=RandomReg16All;
AMem^:=$66; //or | test | and
Inc(AMem);
AMem^:=$23;
Inc(AMem);
AMem^:=$C0+LReg16*9; //reg16
Inc(AMem);
end;
procedure Cdq(var AMem:PByte);
begin
AMem^:=$99;
Inc(AMem);
end;
procedure ShlReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C1; //shl | shr | sal | sar
Inc(AMem);
AMem^:=$E0+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure ShlReg32RandNum8FullRand(var AMem:PByte);
begin
ShlReg32Num8(AMem,RandomReg32All,Random(8)*$20);
end;
procedure ShrReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C1; //shl | shr | sal | sar
Inc(AMem);
AMem^:=$E8+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure ShrReg32RandNum8FullRand(var AMem:PByte);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -