perl写的一个文件二进制文件trace切割

perl写的一个文件二进制文件trace切割,第1张

概述#! usr/bin/perl -w open (TRACE,"removeflash.trace") or die "$!"; binmode(TRACE); #{ #die"open file failed!($!)"; #} open RESULT,">origin.txt"; my $th_length=20;              #0-19 my $pr_length=44;   #! usr/bin/perl -w open (TRACE,"removeflash.trace") or dIE "$!"; binmode(TRACE); #{ #dIE"open file Failed!($!)"; #} open RESulT,">origin.txt"; my $th_length=20;              #0-19 my $pr_length=44;              #20-63 my $mod_length=40; my $eh_adr_df_length=24; my $opr_length=14; my $taint_length=13; my $inst_length=0; my $n_mods; my $file_length; my $eh_start; my $taint_space; my $opr_number=0; my $taint_origin; my $n=0; my $trap=0; my $n_taint; my @tmp_taint_origin; my $bp=0; my $bn=0; #trace 文件的结构是20字节的文件头(重要的是进程的个数),44字节的进程记录(主要的是第37-40字节的模块数) # 下面是模块数乘以模块大小40,接着就是每个指令的开始,先是地址到偏移量的24字节(重要的是9-10字节的指令长度,11字节的 *** 作数,),然后是inst_length指令,然后是第一个 *** 作数(重要的是3-4字节,标记是否有污点),如果有的话是污点的记录13字节(重要的是第一字节有多少个污点记录空间和第6-9字节,这个是orgin) push(@tmp_taint_origin,0); @stat1=stat(TRACE); $file_length=$stat1[7];                #计算文件的大小 seek TRACE,56,0; read (TRACE,$n_mods,4); $n_mods=unpack("I*",$n_mods); seek TRACE,($th_length+$pr_length+($n_mods*40)),0; $eh_start=tell(TRACE); print "eh_start:$eh_start\n"; print "模块数$n_mods\n"; $eh_st=$eh_start; while($eh_start<$file_length) { if($bn!=$bp) { $bp=$bn; $eh_st=$eh_start; } seek TRACE,$eh_start,$inst,4); $inst=unpack("H*",$inst); #print "指令地址:".$inst."\n"; # seek TRACE,$eh_start+8,$inst_length,2); $inst_length=unpack("S*",$inst_length); #print "指令长度:".$inst_length."\n"; seek TRACE,$eh_start+10,$opr_number,1); $opr_number = unpack("C*",$opr_number); #print " *** 作数:".$opr_number."\n"; $eh_start=$eh_start+$eh_adr_df_length+$inst_length;           #第一个 *** 作数开始的位置 for($i=0;$i<$opr_number;$i++) { $n_taint=0; seek TRACE,$eh_start+2,$taint,2); $taint=unpack("S*",$taint); if($taint!=0) { #print"污点".($n+1)."的第".$i."个污点:".$taint."\n"; } while(($taint/2)!=0) { if(($taint%2)!=0) { $n_taint++; } $taint=$taint/2; } #print"taint number:".$n_taint."\n"; $eh_start+=$opr_length;           #开始记录污点 if($n_taint!=0) { $b=0; for($j=0;$j<$n_taint;$j++)                 #是否有污点空间 { seek TRACE,$taint_space,1); #$taint_space2=unpack("H*",$taint_space); $taint_space=unpack("C*",$taint_space); #print "EH_start:".$eh_start."\n"; if($taint_space==0) { $eh_start=$eh_start+1; }else { seek TRACE,$eh_start+5,$taint_origin,4); # $taint_origin2=unpack("H*",$taint_origin); $taint_origin=unpack("I*",$taint_origin); # print "    origin$n:".$taint_origin2."\n"; foreach(@tmp_taint_origin) { if($_==$taint_origin){$b=1;} } if(($b==0)&&($j==$n_taint-1)) { $bn++; push(@tmp_taint_origin,$taint_origin); if($bp==0){shift @tmp_taint_origin;} $n++; print RESulT "\n第".$n."个污点:"; print "\n第".$n."个污点:".$taint_origin."\n"; print RESulT "    origin$n:".$taint_origin; open (TRACES,">tace$n")or dIE "$!"; binmode(TRACES); seek TRACE,$trace_head,$th_length+$pr_length+($n_mods*40)); #$trace_head=unpack("H*",$trace_head); print TRACES $trace_head; seek TRACE,$eh_trace,$eh_start+$taint_length-$eh_st); #$eh_trace=unpack("H*",$eh_trace); print TRACES $eh_trace; #$tmp_taint_origin=$taint_origin; } $eh_start=$eh_start+$taint_length; } } } } $trap++; #if($trap==1){last;} } print RESulT "\n总共有$n个污点"; #} close TRACE; close RESulT; 总结

以上是内存溢出为你收集整理的perl写的一个文件二进制文件trace切割全部内容,希望文章能够帮你解决perl写的一个文件二进制文件trace切割所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1293525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存