刚学Delphi不久,写程序时需要判断指令长度,上网找了一个LDE32的Delphi版,但是拿到Delphi7下编译时出错,有两个地方,想改但是不知道这两句代码是什么意思。第一句:f := OpcodeFlags or f;第二句:f := OpcodeFlags;f: ULONG;OpcodeFlags: Array [$00..$FF] of ULONG =
(
C_MODRM, // $00
C_MODRM, // $01
C_MODRM, // $02
C_MODRM, // $03
省略。
)
不知道如何修改。
(
C_MODRM, // $00
C_MODRM, // $01
C_MODRM, // $02
C_MODRM, // $03
省略。
)
不知道如何修改。
解决方案 »
- iw控件如何弹出模式对话框?
- 主程序与DLL的关系(属于不同进程,还是属于同一进程的不同线程,还是其他?)
- 我用delphi7写的软件,在一个win2000的机器上无法正常使用
- Delphi可以切换所安装的OFFICE版本不?
- 谁能帮我做做这两道题目呀,很急呀,关系到我毕业的问题呀。
- 预览和打印
- 怎么知道Table中 Name 字段 位于DBGrid中的第几列?
- Grid++Report报表点击打印很慢
- 大家能否帮我分析一份协议
- 小弟以前打过一个delphi5的补丁,然后delphi 5的office控件就升级为支持office2000的控件了,时间太久了,现在急用,但我忘记是从那里下载的了,请大家帮忙,一定加分
- delphi需要怎么深入研究?
- 使用webbrowser无法点击链接、
f := OpcodeFlags[0];这样才行
f := OpcodeFlags or f;
f := OpcodeFlags;
知道是错的,我猜他好像是想要查表吧,于是我改成
f := OpcodeFlags[f];
但还是不行,函数不论你输入地址什么总是返回一个固定的值。
我想f是bool型,我不懂编程,瞎猜的。
unit LDE32;interfacetype
ULONG = Cardinal;
PULONG = ^ULONG;
PBYTE = ^BYTE;const
C_ERROR = $FFFFFFFF;
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
0, // $06
0, // $07
C_MODRM, // $08
C_MODRM, // $09
C_MODRM, // $0A
C_MODRM, // $0B
C_DATAW0, // $0C
C_DATAW0, // $0D
0, // $0E
C_TABLE_0F, // $0F
C_MODRM, // $10
C_MODRM, // $11
C_MODRM, // $12
C_MODRM, // $13
C_DATAW0, // $14
C_DATAW0, // $15
0, // $16
0, // $17
C_MODRM, // $18
C_MODRM, // $19
C_MODRM, // $1A
C_MODRM, // $1B
C_DATAW0, // $1C
C_DATAW0, // $1D
0, // $1E
0, // $1F
C_MODRM, // $20
C_MODRM, // $21
C_MODRM, // $22
C_MODRM, // $23
C_DATAW0, // $24
C_DATAW0, // $25
C_PREFIX, // $26
0, // $27
C_MODRM, // $28
C_MODRM, // $29
C_MODRM, // $2A
C_MODRM, // $2B
C_DATAW0, // $2C
C_DATAW0, // $2D
C_PREFIX, // $2E
0, // $2F
C_MODRM, // $30
C_MODRM, // $31
C_MODRM, // $32
C_MODRM, // $33
C_DATAW0, // $34
C_DATAW0, // $35
C_PREFIX, // $36
0, // $37
C_MODRM, // $38
C_MODRM, // $39
C_MODRM, // $3A
C_MODRM, // $3B
C_DATAW0, // $3C
C_DATAW0, // $3D
C_PREFIX, // $3E
0, // $3F
0, // $40
0, // $41
0, // $42
0, // $43
0, // $44
0, // $45
0, // $46
0, // $47
0, // $48
0, // $49
0, // $4A
0, // $4B
0, // $4C
0, // $4D
0, // $4E
0, // $4F
0, // $50
0, // $51
0, // $52
0, // $53
0, // $54
0, // $55
0, // $56
0, // $57
0, // $58
0, // $59
0, // $5A
0, // $5B
0, // $5C
0, // $5D
0, // $5E
0, // $5F
0, // $60
0, // $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
0, // $6C
0, // $6D
0, // $6E
0, // $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
0, // $90
0, // $91
0, // $92
0, // $93
0, // $94
0, // $95
0, // $96
0, // $97
0, // $98
0, // $99
C_DATA66+C_MEM2, // $9A
0, // $9B
0, // $9C
0, // $9D
0, // $9E
0, // $9F
C_MEM67, // $A0
C_MEM67, // $A1
C_MEM67, // $A2
C_MEM67, // $A3
0, // $A4
0, // $A5
0, // $A6
0, // $A7
C_DATA1, // $A8
C_DATA66, // $A9
0, // $AA
0, // $AB
0, // $AC
0, // $AD
0, // $AE
0, // $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
0, // $C3
C_MODRM, // $C4
C_MODRM, // $C5
C_MODRM+C_DATA66, // $C6
C_MODRM+C_DATA66, // $C7
C_DATA2+C_DATA1, // $C8
0, // $C9
C_DATA2, // $CA
0, // $CB
0, // $CC
C_DATA1+C_DATA4, // $CD
0, // $CE
0, // $CF
C_MODRM, // $D0
C_MODRM, // $D1
C_MODRM, // $D2
C_MODRM, // $D3
0, // $D4
0, // $D5
0, // $D6
0, // $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
0, // $EC
0, // $ED
0, // $EE
0, // $EF
C_PREFIX, // $F0
0, // $F1
C_PREFIX, // $F2
C_PREFIX, // $F3
0, // $F4
0, // $F5
C_FUCKINGTEST, // $F6
C_FUCKINGTEST, // $F7
0, // $F8
0, // $F9
0, // $FA
0, // $FB
0, // $FC
0, // $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
0, // $06
C_ERROR, // $07
0, // $08
0, // $09
0, // $0A
0, // $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
0, // $A0
0, // $A1
0, // $A2
C_MODRM, // $A3
C_MODRM+C_DATA1, // $A4
C_MODRM, // $A5
C_ERROR, // $A6
C_ERROR, // $A7
0, // $A8
0, // $A9
0, // $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
0, // $C8
0, // $C9
0, // $CA
0, // $CB
0, // $CC
0, // $CD
0, // $CE
0, // $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
);
function GetProcLength(myiptr0: Pointer): ULONG;implementation// 判断指令长度
procedure GetInstLenght(myiptr0: Pointer; osizeptr: PULONG);
label
prefix;
var
iptr0, iptr: PBYTE;
b, bmod, rm: BYTE;
f: ULONG;
begin
iptr0 := PBYTE(myiptr0);
iptr := iptr0;
f := 0;prefix:
b := iptr^;
Inc(iptr);f := OpcodeFlags 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; //这个也是
end;if (f = C_ERROR) then
begin
osizeptr^ := 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);osizeptr^ := ULONG(iptr) - ULONG(iptr0);
end;
// 判断过程长度
function GetProcLength(myiptr0: Pointer): ULONG;
var
lpFuncProc: Pointer;
InlineLen, OpCodeLen: ULONG;
begin
Result := 0;
lpFuncProc := myiptr0;
if (lpFuncProc = nil) then Exit;
InlineLen := 0;while (True) do
begin
GetInstLenght(lpFuncProc, @OpCodeLen);
case OpCodeLen of0: // 无法解析的指令
begin
Result := C_ERROR;
Break;
end;C_ERROR: // 无法解析的指令
begin
Result := C_ERROR;
Break;
end;1: // 判断是否是retn
begin
if (PBYTE(lpFuncProc)^ = $C3) then
begin
Result := InlineLen + 1;
Break;
end;
end;3: // ret $0001
begin
if (PBYTE(lpFuncProc)^ = $C2) then
begin
Result := InlineLen + 3;
Break;
end;
end;
end;Inc(PBYTE(lpFuncProc), OpCodeLen);
Inc(InlineLen, OpCodeLen);
end;
end;end.
很长,不过网上找得到一样的。
f := OpcodeFlags[n] or f; 和
f := OpcodeFlags[n];其中n的取值范围是$00..$FF 具体要取什么值有待于你自己
对整个对码的理解后才知道.没有文档只有代码,这样来改错有够呛的.