如何测量执行的汇编程序指令的数量?

时间:2013-05-01 03:20:39

标签: assembly measure

我想以某种方式从二进制文件中获取“执行的汇编程序指令数”。 请考虑以下代码:

if(password[0] == 'p') {
 if(password[1] == 'a') {
   ......
     printf("Correct Password\n");
 }
}

然后我是否会以例如“abc”它不会占用第一个分支,因此它会执行较少的指令。如果我输入“pbc”它将采用第一个分支,因此它将执行更多(约4-5)指令。 (这是CTF(捕获标志)文件的一些研究)。所以我的想法不是反转二进制文件并尝试理解算法,而是使用更快的方法来计算不同设置的执行汇编程序指令的数量(如不同的字符或密码长度等等,看看我是否可以采用另一个分支使用另一个输入,从而创建更多的汇编指令)。

我的基本想法是编写一个简单的调试器,只需在当前指令之后放置一个int3,在那里递增一个计数器,反汇编下一条指令,并在该指令之后放置一个int3(我想法的强简化版本)。

是否有任何程序/库/ ...已经完成了那些东西? (因为当程序处理信号时我看到一些问题,...)

(我已经尝试使用高精度计时器来测量时间,但由于差异仅为4-5条指令,因此完全失败)

1 个答案:

答案 0 :(得分:5)

Linux“perf”工具可以使用硬件性能计数器为您提供包括执行指令在内的许多内容的精确数字。

$ perf stat true

 Performance counter stats for 'true':

          0.183734 task-clock                #    0.314 CPUs utilized          
                 0 context-switches          #    0.000 M/sec                  
                 0 CPU-migrations            #    0.000 M/sec                  
               118 page-faults               #    0.642 M/sec                  
           627,313 cycles                    #    3.414 GHz                    
           396,604 stalled-cycles-frontend   #   63.22% frontend cycles idle   
           268,222 stalled-cycles-backend    #   42.76% backend  cycles idle   
           404,935 instructions              #    0.65  insns per cycle        
                                             #    0.98  stalled cycles per insn
            75,949 branches                  #  413.364 M/sec                  
             3,602 branch-misses             #    4.74% of all branches        

       0.000584503 seconds time elapsed

仅获取用户模式说明:

$ perf stat -e instructions:u true

 Performance counter stats for 'true':

            92,687 instructions:u            #    0.00  insns per cycle        

       0.000520925 seconds time elapsed

我看到了这方面的一些变化,如5-6指令。不确定这是真的还是仅仅是测量工件。为了获得更可靠的结果,我想转向像Valgrind这样的模拟器。我很幸运得到稳定的指令计数,这些指令只能从这两个命令中改变1条指令:

$ valgrind --tool=callgrind true
$ valgrind --tool=exp-bbv true