Oki danke für eure Antworten. Kennt jemand diese Engine:
http://patkov-site.narod.ru/eng.html
Ich wurschtele mir nämlich grade Code zusammen, das gibts gar nicht
Folgende Struktur bekomme ich für jede Instruction geliefert:
Delphi-Quellcode:
type
hde32s = packed record
len: Byte;
p_rep: Byte;
p_lock: Byte;
p_seg: Byte;
p_66: Byte;
p_67: Byte;
opcode: Byte;
opcode2: Byte;
modrm: Byte;
modrm_mod: Byte;
modrm_reg: Byte;
modrm_rm: Byte;
sib: Byte;
sib_scale: Byte;
sib_index: Byte;
sib_base: Byte;
imm: packed record case Byte of
0: (imm8: Byte);
1: (imm16: Word);
2: (imm32: LongWord);
end;
disp: packed record case Byte of
0: (disp8: Byte);
1: (disp16: Word);
2: (disp32: LongWord);
end;
rel: packed record case Byte of
0: (rel8: Byte);
1: (rel16: Word);
2: (rel32: LongWord);
end;
Flags: LongWord;
end;
So das Problem ist, dass ich nicht weiß wie ich für alle Operanden die dazugehörigen "Flags" ermitteln kann. Teilweise werden ja die selben Opcodes für verschiedene Sachen verwendet. Z.b.
Code:
add [eax + $12], $04
add [eax], $04
add eax, ecx
add eax, [ecx]
Also muss ich für jeden Operanden wissen, ob es sich um eine Zahl oder um ein Register handelt, ob die Dereferenzierungs-Klammern drum müssen und auf welchen Operanten (fals verwendet) das Register passt. (ds:eax; cs:[$45]) Und dann kann ja theoretisch noch for jedem Operand irgendwas in der Art "dword ptr" oder "byte ptr" stehen.
Besonders lustig ist es bei den "add" Opcodes, welche gleich den "sub" Opcodes sind
Hat da jemand ne Idee für mich?