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

#! 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,0;
read (TRACE,$inst,4);
$inst=unpack("H*",$inst);
#print "指令地址:".$inst."\n";
#
seek TRACE ,$eh_start+8,0;
read (TRACE,$inst_length,2);
$inst_length=unpack("S*",$inst_length);
#print "指令长度:".$inst_length."\n";
seek TRACE ,$eh_start+10,0;
read (TRACE,$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,0;
read (TRACE,$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,$eh_start,0;
read (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,0;
read (TRACE,$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,0,0;
read (TRACE,$trace_head,$th_length+$pr_length+($n_mods*40));
#$trace_head=unpack("H*",$trace_head);
print TRACES $trace_head;
seek TRACE,$eh_start,0;
read (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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值