[QUOTE=westboy;544923]near调用时,CALL的操作数确实就是跳转地址,但是当是far时,或者需要取DS:[XXXX],或者类似:CALL EDI,再取EDI的值,有点麻烦。
您说的libdasm的特点我不太明白指的是什么?[/QUOTE]
我是看到:
typedef struct _INSTRUCTION {
int length; // Instruction length
enum Instruction type; // Instruction type
enum Mode mode; // Addressing mode
BYTE opcode; // Actual opcode
BYTE modrm; // MODRM byte
BYTE sib; // SIB byte
int modrm_offset; // MODRM byte offset
int extindex; // Extension table index
int fpuindex; // FPU table index
int dispbytes; // Displacement bytes (0 = no displacement)
int immbytes; // Immediate bytes (0 = no immediate)
int sectionbytes; // Section prefix bytes (0 = no section prefix)
OPERAND op1; // First operand (if any)
OPERAND op2; // Second operand (if any)
OPERAND op3; // Additional operand (if any)
PINST ptr; // Pointer to instruction table
int flags; // Instruction flags
short eflags_affected; // Process eflags affected
short eflags_used; // Processor eflags used by this instruction
int iop_written; // mask of affected implied registers (written)
int iop_read; // mask of affected implied registers (read)
} INSTRUCTION, *PINSTRUCTION;
这个结构所说的。不需要判断near,还是far调用。
enum Instruction type; // Instruction type
可以根据这个来判断是不是INSTRUCTION_TYPE_CALL/JMP,如果是则进行判断。由于跳转指令一般只有一个操作数,所以再根据op1来判断:
typedef struct _OPERAND {
enum Operand type; // Operand type (register, memory, etc)
int reg; // Register (if any)
int basereg; // Base register (if any)
int indexreg; // Index register (if any)
int scale; // Scale (if any)
int dispbytes; // Displacement bytes (0 = no displacement)
int dispoffset; // Displacement value offset
int immbytes; // Immediate bytes (0 = no immediate)
int immoffset; // Immediate value offset
int sectionbytes; // Section prefix bytes (0 = no section prefix)
WORD section; // Section prefix value
DWORD displacement; // Displacement value
DWORD immediate; // Immediate value
int flags; // Operand flags
} OPERAND, *POPERAND;
根据
enum Operand type;
这个成员判断操作数的类型,直接根据操作数结构体中的各个成员来从相应的地方取值判断。
我想说的就是,可以根据这些以有的信息来判断,而不是解析最后生成的字符串。解析字符串也挺好的,但是还是感觉这种方法相对更合适一点。
总之,实践的人(比如说你自己)才有最发言权,我只是说说我的想法而已,能实现功能的方法才是好方法。