[Delphi] 纯文本查看 复制代码
unit LDE32;
interface
uses
Windows;
const
C_ERROR = $FFFFFFFF;
C_OK = $00000000;
C_PREFIX = $00000001;
C_66 = $00000002;
C_67 = $00000004;
C_DATA66 = $00000008;
C_DATA1 = $00000010;
C_DATA2 = $00000020;
C_DATA4 = $00000040;
C_MEM67 = $00000080;
C_MEM1 = $00000100;
C_MEM2 = $00000200;
C_MEM4 = $00000400;
C_MODRM = $00000800;
C_DATAW0 = $00001000;
C_FUCKINGTEST = $00002000;
C_TABLE_0F = $00004000;
OpcodeFlags: Array [$00..$FF] of ULONG =
(
C_MODRM, // $00
C_MODRM, // $01
C_MODRM, // $02
C_MODRM, // $03
C_DATAW0, // $04
C_DATAW0, // $05
C_OK, // $06
C_OK, // $07
C_MODRM, // $08
C_MODRM, // $09
C_MODRM, // $0A
C_MODRM, // $0B
C_DATAW0, // $0C
C_DATAW0, // $0D
C_OK, // $0E
C_TABLE_0F, // $0F
C_MODRM, // $10
C_MODRM, // $11
C_MODRM, // $12
C_MODRM, // $13
C_DATAW0, // $14
C_DATAW0, // $15
C_OK, // $16
C_OK, // $17
C_MODRM, // $18
C_MODRM, // $19
C_MODRM, // $1A
C_MODRM, // $1B
C_DATAW0, // $1C
C_DATAW0, // $1D
C_OK, // $1E
C_OK, // $1F
C_MODRM, // $20
C_MODRM, // $21
C_MODRM, // $22
C_MODRM, // $23
C_DATAW0, // $24
C_DATAW0, // $25
C_PREFIX, // $26
C_OK, // $27
C_MODRM, // $28
C_MODRM, // $29
C_MODRM, // $2A
C_MODRM, // $2B
C_DATAW0, // $2C
C_DATAW0, // $2D
C_PREFIX, // $2E
C_OK, // $2F
C_MODRM, // $30
C_MODRM, // $31
C_MODRM, // $32
C_MODRM, // $33
C_DATAW0, // $34
C_DATAW0, // $35
C_PREFIX, // $36
C_OK, // $37
C_MODRM, // $38
C_MODRM, // $39
C_MODRM, // $3A
C_MODRM, // $3B
C_DATAW0, // $3C
C_DATAW0, // $3D
C_PREFIX, // $3E
C_OK, // $3F
C_OK, // $40
C_OK, // $41
C_OK, // $42
C_OK, // $43
C_OK, // $44
C_OK, // $45
C_OK, // $46
C_OK, // $47
C_OK, // $48
C_OK, // $49
C_OK, // $4A
C_OK, // $4B
C_OK, // $4C
C_OK, // $4D
C_OK, // $4E
C_OK, // $4F
C_OK, // $50
C_OK, // $51
C_OK, // $52
C_OK, // $53
C_OK, // $54
C_OK, // $55
C_OK, // $56
C_OK, // $57
C_OK, // $58
C_OK, // $59
C_OK, // $5A
C_OK, // $5B
C_OK, // $5C
C_OK, // $5D
C_OK, // $5E
C_OK, // $5F
C_OK, // $60
C_OK, // $61
C_MODRM, // $62
C_MODRM, // $63
C_PREFIX, // $64
C_PREFIX, // $65
C_PREFIX+C_66, // $66
C_PREFIX+C_67, // $67
C_DATA66, // $68
C_MODRM+C_DATA66, // $69
C_DATA1, // $6A
C_MODRM+C_DATA1, // $6B
C_OK, // $6C
C_OK, // $6D
C_OK, // $6E
C_OK, // $6F
C_DATA1, // $70
C_DATA1, // $71
C_DATA1, // $72
C_DATA1, // $73
C_DATA1, // $74
C_DATA1, // $75
C_DATA1, // $76
C_DATA1, // $77
C_DATA1, // $78
C_DATA1, // $79
C_DATA1, // $7A
C_DATA1, // $7B
C_DATA1, // $7C
C_DATA1, // $7D
C_DATA1, // $7E
C_DATA1, // $7F
C_MODRM+C_DATA1, // $80
C_MODRM+C_DATA66, // $81
C_MODRM+C_DATA1, // $82
C_MODRM+C_DATA1, // $83
C_MODRM, // $84
C_MODRM, // $85
C_MODRM, // $86
C_MODRM, // $87
C_MODRM, // $88
C_MODRM, // $89
C_MODRM, // $8A
C_MODRM, // $8B
C_MODRM, // $8C
C_MODRM, // $8D
C_MODRM, // $8E
C_MODRM, // $8F
C_OK, // $90
C_OK, // $91
C_OK, // $92
C_OK, // $93
C_OK, // $94
C_OK, // $95
C_OK, // $96
C_OK, // $97
C_OK, // $98
C_OK, // $99
C_DATA66+C_MEM2, // $9A
C_OK, // $9B
C_OK, // $9C
C_OK, // $9D
C_OK, // $9E
C_OK, // $9F
C_MEM67, // $A0
C_MEM67, // $A1
C_MEM67, // $A2
C_MEM67, // $A3
C_OK, // $A4
C_OK, // $A5
C_OK, // $A6
C_OK, // $A7
C_DATA1, // $A8
C_DATA66, // $A9
C_OK, // $AA
C_OK, // $AB
C_OK, // $AC
C_OK, // $AD
C_OK, // $AE
C_OK, // $AF
C_DATA1, // $B0
C_DATA1, // $B1
C_DATA1, // $B2
C_DATA1, // $B3
C_DATA1, // $B4
C_DATA1, // $B5
C_DATA1, // $B6
C_DATA1, // $B7
C_DATA66, // $B8
C_DATA66, // $B9
C_DATA66, // $BA
C_DATA66, // $BB
C_DATA66, // $BC
C_DATA66, // $BD
C_DATA66, // $BE
C_DATA66, // $BF
C_MODRM+C_DATA1, // $C0
C_MODRM+C_DATA1, // $C1
C_DATA2, // $C2
C_OK, // $C3
C_MODRM, // $C4
C_MODRM, // $C5
C_MODRM+C_DATA66, // $C6
C_MODRM+C_DATA66, // $C7
C_DATA2+C_DATA1, // $C8
C_OK, // $C9
C_DATA2, // $CA
C_OK, // $CB
C_OK, // $CC
C_DATA1+C_DATA4, // $CD
C_OK, // $CE
C_OK, // $CF
C_MODRM, // $D0
C_MODRM, // $D1
C_MODRM, // $D2
C_MODRM, // $D3
C_OK, // $D4
C_OK, // $D5
C_OK, // $D6
C_OK, // $D7
C_MODRM, // $D8
C_MODRM, // $D9
C_MODRM, // $DA
C_MODRM, // $DB
C_MODRM, // $DC
C_MODRM, // $DD
C_MODRM, // $DE
C_MODRM, // $DF
C_DATA1, // $E0
C_DATA1, // $E1
C_DATA1, // $E2
C_DATA1, // $E3
C_DATA1, // $E4
C_DATA1, // $E5
C_DATA1, // $E6
C_DATA1, // $E7
C_DATA66, // $E8
C_DATA66, // $E9
C_DATA66+C_MEM2, // $EA
C_DATA1, // $EB
C_OK, // $EC
C_OK, // $ED
C_OK, // $EE
C_OK, // $EF
C_PREFIX, // $F0
C_OK, // $F1
C_PREFIX, // $F2
C_PREFIX, // $F3
C_OK, // $F4
C_OK, // $F5
C_FUCKINGTEST, // $F6
C_FUCKINGTEST, // $F7
C_OK, // $F8
C_OK, // $F9
C_OK, // $FA
C_OK, // $FB
C_OK, // $FC
C_OK, // $FD
C_MODRM, // $FE
C_MODRM // $FF
);
OpcodeFlagsExt: Array [$00..$FF] of ULONG =
(
C_MODRM, // $00
C_MODRM, // $01
C_MODRM, // $02
C_MODRM, // $03
C_ERROR, // $04
C_ERROR, // $05
C_OK, // $06
C_ERROR, // $07
C_OK, // $08
C_OK, // $09
C_OK, // $0A
C_OK, // $0B
C_ERROR, // $0C
C_ERROR, // $0D
C_ERROR, // $0E
C_ERROR, // $0F
C_ERROR, // $10
C_ERROR, // $11
C_ERROR, // $12
C_ERROR, // $13
C_ERROR, // $14
C_ERROR, // $15
C_ERROR, // $16
C_ERROR, // $17
C_ERROR, // $18
C_ERROR, // $19
C_ERROR, // $1A
C_ERROR, // $1B
C_ERROR, // $1C
C_ERROR, // $1D
C_ERROR, // $1E
C_ERROR, // $1F
C_ERROR, // $20
C_ERROR, // $21
C_ERROR, // $22
C_ERROR, // $23
C_ERROR, // $24
C_ERROR, // $25
C_ERROR, // $26
C_ERROR, // $27
C_ERROR, // $28
C_ERROR, // $29
C_ERROR, // $2A
C_ERROR, // $2B
C_ERROR, // $2C
C_ERROR, // $2D
C_ERROR, // $2E
C_ERROR, // $2F
C_ERROR, // $30
C_ERROR, // $31
C_ERROR, // $32
C_ERROR, // $33
C_ERROR, // $34
C_ERROR, // $35
C_ERROR, // $36
C_ERROR, // $37
C_ERROR, // $38
C_ERROR, // $39
C_ERROR, // $3A
C_ERROR, // $3B
C_ERROR, // $3C
C_ERROR, // $3D
C_ERROR, // $3E
C_ERROR, // $3F
C_ERROR, // $40
C_ERROR, // $41
C_ERROR, // $42
C_ERROR, // $43
C_ERROR, // $44
C_ERROR, // $45
C_ERROR, // $46
C_ERROR, // $47
C_ERROR, // $48
C_ERROR, // $49
C_ERROR, // $4A
C_ERROR, // $4B
C_ERROR, // $4C
C_ERROR, // $4D
C_ERROR, // $4E
C_ERROR, // $4F
C_ERROR, // $50
C_ERROR, // $51
C_ERROR, // $52
C_ERROR, // $53
C_ERROR, // $54
C_ERROR, // $55
C_ERROR, // $56
C_ERROR, // $57
C_ERROR, // $58
C_ERROR, // $59
C_ERROR, // $5A
C_ERROR, // $5B
C_ERROR, // $5C
C_ERROR, // $5D
C_ERROR, // $5E
C_ERROR, // $5F
C_ERROR, // $60
C_ERROR, // $61
C_ERROR, // $62
C_ERROR, // $63
C_ERROR, // $64
C_ERROR, // $65
C_ERROR, // $66
C_ERROR, // $67
C_ERROR, // $68
C_ERROR, // $69
C_ERROR, // $6A
C_ERROR, // $6B
C_ERROR, // $6C
C_ERROR, // $6D
C_ERROR, // $6E
C_ERROR, // $6F
C_ERROR, // $70
C_ERROR, // $71
C_ERROR, // $72
C_ERROR, // $73
C_ERROR, // $74
C_ERROR, // $75
C_ERROR, // $76
C_ERROR, // $77
C_ERROR, // $78
C_ERROR, // $79
C_ERROR, // $7A
C_ERROR, // $7B
C_ERROR, // $7C
C_ERROR, // $7D
C_ERROR, // $7E
C_ERROR, // $7F
C_DATA66, // $80
C_DATA66, // $81
C_DATA66, // $82
C_DATA66, // $83
C_DATA66, // $84
C_DATA66, // $85
C_DATA66, // $86
C_DATA66, // $87
C_DATA66, // $88
C_DATA66, // $89
C_DATA66, // $8A
C_DATA66, // $8B
C_DATA66, // $8C
C_DATA66, // $8D
C_DATA66, // $8E
C_DATA66, // $8F
C_MODRM, // $90
C_MODRM, // $91
C_MODRM, // $92
C_MODRM, // $93
C_MODRM, // $94
C_MODRM, // $95
C_MODRM, // $96
C_MODRM, // $97
C_MODRM, // $98
C_MODRM, // $99
C_MODRM, // $9A
C_MODRM, // $9B
C_MODRM, // $9C
C_MODRM, // $9D
C_MODRM, // $9E
C_MODRM, // $9F
C_OK, // $A0
C_OK, // $A1
C_OK, // $A2
C_MODRM, // $A3
C_MODRM+C_DATA1, // $A4
C_MODRM, // $A5
C_ERROR, // $A6
C_ERROR, // $A7
C_OK, // $A8
C_OK, // $A9
C_OK, // $AA
C_MODRM, // $AB
C_MODRM+C_DATA1, // $AC
C_MODRM, // $AD
C_ERROR, // $AE
C_MODRM, // $AF
C_MODRM, // $B0
C_MODRM, // $B1
C_MODRM, // $B2
C_MODRM, // $B3
C_MODRM, // $B4
C_MODRM, // $B5
C_MODRM, // $B6
C_MODRM, // $B7
C_ERROR, // $B8
C_ERROR, // $B9
C_MODRM+C_DATA1, // $BA
C_MODRM, // $BB
C_MODRM, // $BC
C_MODRM, // $BD
C_MODRM, // $BE
C_MODRM, // $BF
C_MODRM, // $C0
C_MODRM, // $C1
C_ERROR, // $C2
C_ERROR, // $C3
C_ERROR, // $C4
C_ERROR, // $C5
C_ERROR, // $C6
C_ERROR, // $C7
C_OK, // $C8
C_OK, // $C9
C_OK, // $CA
C_OK, // $CB
C_OK, // $CC
C_OK, // $CD
C_OK, // $CE
C_OK, // $CF
C_ERROR, // $D0
C_ERROR, // $D1
C_ERROR, // $D2
C_ERROR, // $D3
C_ERROR, // $D4
C_ERROR, // $D5
C_ERROR, // $D6
C_ERROR, // $D7
C_ERROR, // $D8
C_ERROR, // $D9
C_ERROR, // $DA
C_ERROR, // $DB
C_ERROR, // $DC
C_ERROR, // $DD
C_ERROR, // $DE
C_ERROR, // $DF
C_ERROR, // $E0
C_ERROR, // $E1
C_ERROR, // $E2
C_ERROR, // $E3
C_ERROR, // $E4
C_ERROR, // $E5
C_ERROR, // $E6
C_ERROR, // $E7
C_ERROR, // $E8
C_ERROR, // $E9
C_ERROR, // $EA
C_ERROR, // $EB
C_ERROR, // $EC
C_ERROR, // $ED
C_ERROR, // $EE
C_ERROR, // $EF
C_ERROR, // $F0
C_ERROR, // $F1
C_ERROR, // $F2
C_ERROR, // $F3
C_ERROR, // $F4
C_ERROR, // $F5
C_ERROR, // $F6
C_ERROR, // $F7
C_ERROR, // $F8
C_ERROR, // $F9
C_ERROR, // $FA
C_ERROR, // $FB
C_ERROR, // $FC
C_ERROR, // $FD
C_ERROR, // $FE
C_ERROR // $FF
);
procedure GetOpCodeLength(OpCodePtr: Pointer; OpCodeLen: PULONG);
implementation
// 判断指令长度
procedure GetOpCodeLength(OpCodePtr: Pointer; OpCodeLen: PULONG);
label
prefix;
var
iptr0, iptr: PBYTE;
b, bmod, rm: BYTE;
f: ULONG;
begin
iptr0 := PBYTE(OpCodePtr);
iptr := iptr0;
f := 0;
prefix:
b := iptr^;
Inc(iptr);
f := OpcodeFlags[b] or f;
if ((f and C_FUCKINGTEST) > 0) then
begin
if ((iptr^ and $38) = 0) then
begin
f := C_MODRM + C_DATAW0; // TEST
end else
begin
f := C_MODRM; // NOT,NEG,MUL,IMUL,DIV,IDIV
end;
end;
if ((f and C_TABLE_0F) > 0) then
begin
b := iptr^;
Inc(iptr);
f := OpcodeFlags[b];
end;
if (f = C_ERROR) then
begin
OpCodeLen^ := C_ERROR;
Exit;
end;
if ((f and C_PREFIX) > 0) then
begin
f := not C_PREFIX and f;
goto prefix;
end;
if ((f and C_DATAW0) > 0) then
begin
if ((b and $01) > 0) then
begin
f := C_DATA66 or f;
end else
begin
f := C_DATA1 or f;
end;
end;
if ((f and C_MODRM) > 0) then
begin
b := iptr^;
Inc(iptr);
bmod := b and $C0;
rm := b and $07;
if (bmod <> $C0) then
begin
if ((f and C_67) > 0) then // modrm16
begin
if ((bmod = $00) and (rm = $06)) then f := C_MEM2 or f;
if (bmod = $40) then f := C_MEM1 or f;
if (bmod = $80) then f := C_MEM1 or f;
end else
begin
if (bmod = $40) then f := C_MEM1 or f;
if (bmod = $80) then f := C_MEM4 or f;
if (rm = $04) then
begin
rm := (iptr^) and $07;
Inc(iptr);
end;
if ((rm = $05) and (bmod = $00)) then f := C_MEM4 or f;
end;
end;
end;
if ((f and C_MEM67) > 0) then
begin
if ((f and C_67) > 0) then
begin
f := C_MEM2 or f;
end else
begin
f := C_MEM4 or f;
end;
end;
if ((f and C_DATA66) > 0) then
begin
if ((f and C_66) > 0) then
begin
f := C_DATA2 or f;
end else
begin
f := C_DATA4 or f;
end;
end;
if ((f and C_MEM1) > 0) then Inc(iptr);
if ((f and C_MEM2) > 0) then Inc(iptr, 2);
if ((f and C_MEM4) > 0) then Inc(iptr, 4);
if ((f and C_DATA1) > 0) then Inc(iptr);
if ((f and C_DATA2) > 0) then Inc(iptr, 2);
if ((f and C_DATA4) > 0) then Inc(iptr, 4);
OpCodeLen^ := ULONG(iptr) - ULONG(iptr0);
end;
end.