📄 morphine.dpr
字号:
begin
ShrReg32Num8(AMem,RandomReg32All,Random(8)*$20);
end;
procedure SalReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C1; //shl | shr | sal | sar
Inc(AMem);
AMem^:=$F0+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure SalReg32RandNum8FullRand(var AMem:PByte);
begin
SalReg32Num8(AMem,RandomReg32All,Random(8)*$20);
end;
procedure SarReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C1; //shl | shr | sal | sar
Inc(AMem);
AMem^:=$F8+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure SarReg32RandNum8FullRand(var AMem:PByte);
begin
SarReg32Num8(AMem,RandomReg32All,Random(8)*$20);
end;
procedure RolReg8Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C0; //rol | ror
Inc(AMem);
AMem^:=$C0+AReg; //reg8
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure RolReg8RandNum8FullRand(var AMem:PByte);
begin
RolReg8Num8(AMem,RandomReg8ABCD,Random($20)*8);
end;
procedure RorReg8Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C0; //rol | ror
Inc(AMem);
AMem^:=$C8+AReg; //reg8
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure RorReg8RandNum8FullRand(var AMem:PByte);
begin
RorReg8Num8(AMem,RandomReg8ABCD,Random($20)*8);
end;
procedure RolReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C1; //rol | ror
Inc(AMem);
AMem^:=$C0+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure RolReg32RandNum8FullRand(var AMem:PByte);
begin
RolReg32Num8(AMem,RandomReg32All,Random(8)*$20);
end;
procedure RorReg32Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$C1; //rol | ror
Inc(AMem);
AMem^:=$C8+AReg; //reg32
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure RorReg32RandNum8FullRand(var AMem:PByte);
begin
RorReg32Num8(AMem,RandomReg32All,Random(8)*$20);
end;
procedure TestAxNum16(var AMem:PByte;ANum:Word);
begin
AMem^:=$66; //test ax
Inc(AMem);
AMem^:=$A9;
Inc(AMem);
PWord(AMem)^:=ANum; //num16
Inc(AMem,2);
end;
procedure TestAxNum16Rand(var AMem:PByte);
begin
TestAxNum16(AMem,Random($10000));
end;
procedure CmpAxNum16(var AMem:PByte;ANum:Word);
begin
AMem^:=$66; //cmp ax
Inc(AMem);
AMem^:=$3D;
Inc(AMem);
PWord(AMem)^:=ANum; //num16
Inc(AMem,2);
end;
procedure CmpAxNum16Rand(var AMem:PByte);
begin
TestAxNum16(AMem,Random($10000));
end;
procedure PushNum8(var AMem:PByte;ANum:Byte);
begin
AMem^:=$6A; //push
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure PushNum8Rand(var AMem:PByte);
begin
PushNum8(AMem,Random($100));
end;
function XorRand(var AMem:PByte):Word;
var
LRnd:Byte;
LRes:PWord;
begin
LRes:=Pointer(AMem);
LRnd:=Random(5);
AMem^:=$30+LRnd; //xor
Inc(AMem);
if LRnd=4 then AMem^:=Random($100) //num8
else AMem^:=Random(7)*9+Random(8)+1+$C0; //reg8 | reg32 but never the same reg
Inc(AMem);
Result:=LRes^;
end;
procedure InvertXor(var AMem:PByte;AXor:Word);
begin
PWord(AMem)^:=AXor;
Inc(AMem,2);
end;
procedure DoubleXorRand(var AMem:PByte);
begin
InvertXor(AMem,XorRand(AMem));
end;
function NotReg32(var AMem:PByte;AReg:Byte):Byte;
begin
Result:=2;
AMem^:=$F7; //not
Inc(AMem);
AMem^:=$D0+AReg; //reg32
Inc(AMem);
end;
function NegReg32(var AMem:PByte;AReg:Byte):Byte;
begin
Result:=2;
AMem^:=$F7; //not
Inc(AMem);
AMem^:=$D8+AReg; //reg32
Inc(AMem);
end;
function NotRand(var AMem:PByte):Word;
var
LRes:PWord;
begin
LRes:=Pointer(AMem);
AMem^:=$F6+Random(1); //not
Inc(AMem);
AMem^:=$D0+Random(8); //reg8 | reg32
Inc(AMem);
Result:=LRes^;
end;
procedure InvertNot(var AMem:PByte;ANot:Word);
begin
PWord(AMem)^:=ANot;
Inc(AMem,2);
end;
procedure DoubleNotRand(var AMem:PByte);
begin
InvertNot(AMem,NotRand(AMem));
end;
function NegRand(var AMem:PByte):Word;
var
LRes:PWord;
begin
LRes:=Pointer(AMem);
AMem^:=$F6+Random(1); //neg
Inc(AMem);
AMem^:=$D8+Random(8); //reg8 | reg32
Inc(AMem);
Result:=LRes^;
end;
procedure InvertNeg(var AMem:PByte;ANeg:Word);
begin
PWord(AMem)^:=ANeg;
Inc(AMem,2);
end;
procedure DoubleNegRand(var AMem:PByte);
begin
InvertNeg(AMem,NegRand(AMem));
end;
procedure AddReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //add | or | and | sub | xor | cmp
Inc(AMem);
AMem^:=$83;
Inc(AMem);
AMem^:=$C0+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num;
Inc(AMem);
end;
procedure AddReg16Num8Rand(var AMem:PByte;ANum:Byte);
begin
AddReg16Num8(AMem,RandomReg16All,ANum);
end;
procedure OrReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //add | or | and | sub | xor | cmp
Inc(AMem);
AMem^:=$83;
Inc(AMem);
AMem^:=$C8+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num
Inc(AMem);
end;
procedure OrReg16Num8Rand(var AMem:PByte;ANum:Byte);
begin
OrReg16Num8(AMem,RandomReg16All,ANum);
end;
procedure AndReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //add | or | and | sub | xor | cmp
Inc(AMem);
AMem^:=$83;
Inc(AMem);
AMem^:=$E0+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num
Inc(AMem);
end;
procedure AndReg16Num8Rand(var AMem:PByte;ANum:Byte);
begin
AndReg16Num8(AMem,RandomReg16All,ANum);
end;
procedure SubReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //add | or | and | sub | xor | cmp
Inc(AMem);
AMem^:=$83;
Inc(AMem);
AMem^:=$E8+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num
Inc(AMem);
end;
procedure SubReg16Num8Rand(var AMem:PByte;ANum:Byte);
begin
SubReg16Num8(AMem,RandomReg16All,ANum);
end;
procedure XorReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //add | or | and | sub | xor | cmp
Inc(AMem);
AMem^:=$83;
Inc(AMem);
AMem^:=$F0+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num
Inc(AMem);
end;
procedure XorReg16Num8Rand(var AMem:PByte;ANum:Byte);
begin
XorReg16Num8(AMem,RandomReg16All,ANum);
end;
procedure CmpReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //add | or | and | sub | xor | cmp
Inc(AMem);
AMem^:=$83;
Inc(AMem);
AMem^:=$F8+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num
Inc(AMem);
end;
procedure CmpReg16Num8RandRand(var AMem:PByte);
begin
CmpReg16Num8(AMem,RandomReg16All,Random($100));
end;
procedure RolReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //rol | ror
Inc(AMem);
AMem^:=$C1;
Inc(AMem);
AMem^:=$C0+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure RolReg16RandNum8FullRand(var AMem:PByte);
begin
RolReg16Num8(AMem,RandomReg16All,Random($10)*$10);
end;
procedure RorReg16Num8(var AMem:PByte;AReg,ANum:Byte);
begin
AMem^:=$66; //rol | ror
Inc(AMem);
AMem^:=$C1;
Inc(AMem);
AMem^:=$C1+AReg; //reg16
Inc(AMem);
AMem^:=ANum; //num8
Inc(AMem);
end;
procedure RorReg16RandNum8FullRand(var AMem:PByte);
begin
RorReg16Num8(AMem,RandomReg16All,Random($10)*$10);
end;
function XchgRand(var AMem:PByte):Word;
var
LRes:PWord;
LRnd:Byte;
begin
LRes:=Pointer(AMem);
LRnd:=Random(4);
case LRnd of
0,1:AMem^:=$66+LRnd; //xchg
2,3:AMem^:=$86+LRnd-2; //xchg
end;
Inc(AMem);
case LRnd of
0,1:AMem^:=$90+Random(8); //reg16 | reg32
2,3:AMem^:=$C0+Random($10); //reg8 | reg32
end;
Inc(AMem);
Result:=LRes^;
end;
procedure InvertXchg(var AMem:PByte;AXchg:Word);
begin
PWord(AMem)^:=AXchg;
Inc(AMem,2);
end;
procedure DoubleXchgRand(var AMem:PByte);
begin
InvertXchg(AMem,XchgRand(AMem));
end;
procedure LoopNum8(var AMem:PByte;ANum:Byte);
begin
AMem^:=$E2; //loop
Inc(AMem);
AMem^:=ANum; //ANum
Inc(AMem);
end;
procedure JecxzNum8(var AMem:PByte;ANum:Byte);
begin
AMem^:=$E3; //jecxz
Inc(AMem);
AMem^:=ANum; //ANum
Inc(AMem);
end;
procedure MovzxEcxCl(var AMem:PByte);
begin
AMem^:=$0F; //movzx
Inc(AMem);
AMem^:=$B6;
Inc(AMem);
AMem^:=$C9; //ecx:cx
Inc(AMem);
end;
procedure MovReg32Reg32Rand(var AMem:PByte;AReg:Byte);
begin
AMem^:=$8B; //mov
Inc(AMem);
AMem^:=$C0+8*AReg+RandomReg32All; //reg32
Inc(AMem);
end;
procedure CmpEaxNum32(var AMem:PByte;ANum:Cardinal);
begin
AMem^:=$3D; //cmp eax
Inc(AMem);
PCardinal(AMem)^:=ANum; //num32
Inc(AMem,4);
end;
procedure CmpEaxNum32Rand(var AMem:PByte);
begin
CmpEaxNum32(AMem,Random($FFFFFFFF));
end;
procedure TestEaxNum32(var AMem:PByte;ANum:Cardinal);
begin
AMem^:=$A9; //test eax
Inc(AMem);
PCardinal(AMem)^:=ANum; //num32
Inc(AMem,4);
end;
procedure TestEaxNum32Rand(var AMem:PByte);
begin
TestEaxNum32(AMem,Random($FFFFFFFF));
end;
procedure SubEaxNum32(var AMem:PByte;ANum:Cardinal);
begin
AMem^:=$2D; //sub eax
Inc(AMem);
PCardinal(AMem)^:=ANum; //num32
Inc(AMem,4);
end;
procedure AddEaxNum32(var AMem:PByte;ANum:Cardinal);
begin
AMem^:=$05; //add eax
Inc(AMem);
PCardinal(AMem)^:=ANum;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -