(烦心事天天有,最近特别多。天将降大任于斯人也,希望我不是孔乙已。)
今晚找到了一个烦了2天的问题的答案,顿时……对,不是激动,是抓狂。
问题大概如下:用IDAPython载入了一个清楚花指令的脚本,结果一直报错。(本人IDA新手,更是Python新手……)
def get_push_reg(ea): ''' 测试ea处的指令是否为push reg 是则返回reg,否则返回BADADDR ''' ins = DecodeInstruction(ea) if ins.itype == NN_push and ins.Op1.type == o_reg: return ins.Op1.reg return BADADDR
报错:ins是空类型,没有itype属性。
当时,第一感觉是DecodeInstruction函数无法识别,头文件没有引入。后来不断的查找,没有发现错误。后来,也怀疑过IDAPython插件安装问题。但是,结果是脚本的全局循环没有停止条件,既是无限循环。顿时反应过来,最后的ea为空指令,返回值肯定为空。这样当然报错啦!
但是,刚刚想下,自己调试的水平真得提高提高。这错误判断错得离谱。
1、报错说ins是空类型,并没有说DecodeInstruction函数无法识别,我怎么能理解为DecodeInstruction引入错误?
2、阅读DecodeInstruction函数说明没有足够仔细。Hex-Rays官网的声明如下:
// Decode an instruction // This function decodes an instruction and returns an insn_t object // ea - linear address of the instruction to decode // The return values are: // 0 => if the function fails. // insn_t object: // cs, ip, ea, itype, auxpref, insnpref, segpref, flags: check ua.hpp // n: number of operands // Op0..Op5: instances of op_t (check ua.hpp) // n, type, offb, offo, flags, dtyp, reg, value, // addr, specval, specflag1, specflag2, specflag3, specflag4我该清清楚楚看到0 => if the function fails这句,可是当时怎么就“瞬秒”returns an insn_t object就切换了呢?
3、IDAPython使用经验少,当时点击到的指令都是结尾,所以即使运行成功都没有效果,所以误会为脚本没有问题。(脚本是看雪cpfive给的,当然这里没有任何贬义。只是我代码阅读不够仔细,脚本作用也没有认识到,脚本只是要删掉花指令,最后怎样结束都没关系。所以,才误会了。)
因此吧,反思之后,得到如下启示:
熟能生巧,调试经验不足,是这个犯错的主要原因。
阅览代码而不是审阅代码,而且,明明看到了while true:居然还没有意识到问题。
比较大意,应该顺着“有罪推定”来调试的。
还有就是粗心,不够有经验,对英文说明有抵触心理,都是不好的。官网说明一般都是最有用的。
碎碎念——熟能生巧。