碎碎念【2】- 熟能生巧

	(烦心事天天有,最近特别多。天将降大任于斯人也,希望我不是孔乙已。)

今晚找到了一个烦了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:居然还没有意识到问题。

比较大意,应该顺着“有罪推定”来调试的。

还有就是粗心,不够有经验,对英文说明有抵触心理,都是不好的。官网说明一般都是最有用的。


碎碎念——熟能生巧。

 
 

你可能感兴趣的:(function,python,object,脚本,测试)