Ollydbg v 1.10 插件编写

逆向工程 ollydbg 插入
2021-06-11 10:06:30

我正在尝试编写一个插件,除此之外,还需要将一些代码段的程序集写入文件。由于文档有点缺乏,我在某些事情上迷失了方向,并且不确定如何使用反汇编函数。我正在使用 Readcommand 函数读取命令,然后使用 Disasm 函数来获取汇编代码,但我得到的只是一些胡言乱语。此外,在帮助文件中,它说 Readcommand 函数应该返回读取指令的实际大小,但它总是返回最大大小。任何关于我做错了什么或如何继续获取汇编代码的帮助将不胜感激。我试图反汇编的代码位于下面。

code_length = Readcommand(reg->ip, cmd);
指令长度 = Disasm(cmd, code_length, reg->ip, dest, disasm, DISASM_ALL,thread_id);

2个回答

ReadCommand() 从内部缓存的缓冲区返回字节并返回最多 MAXCMDSIZE 字节

下面的代码段将采用一个地址(仅限十六进制)读取命令打印字节和反汇编与该地址相关的日志窗口看看

void disasm( void) {
  ULONG data = 0;
  if((Getlong("enter address to disassemble",&data,4,0,DIA_HEXONLY)) != -1) {
    Addtolist(data,1,"eip provided is %x\n",data);
    char buff[MAXCMDSIZE+10] = {0};
    ULONG srcsize = 0;
    t_disasm mydisasm = {0};
  if((srcsize = Readcommand(data,buff)) !=0) {
    char pbuff[50] = {0};
    for (ulong i = 0;i<srcsize; i++){
      sprintf_s((char *)(pbuff+(i*2)),50,"%02x",*(char *)(buff+i));     
    }
    Addtolist(data,1,"command read %s size %x\n",pbuff,srcsize);
    Disasm((uchar *)buff,srcsize,data,NULL,&mydisasm,DISASM_ALL,NULL);
    Addtolist(data,1,"%s\n",mydisasm.result);
    }    
  }  
}

我已经解决了。如果其他人有相同或类似的问题,调用 Disasm 函数的正确方法是(使用问题中定义的 cmd 变量):

Disasm(cmd, code_length, reg->ip, DEC_UNKNOWN, DISASM_ALL, thread_id);