⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiger.idc

📁 《网络渗透技术》一书所附源代码
💻 IDC
📖 第 1 页 / 共 2 页
字号:
/**
文件名: tiger.idc
用途  : 通过分析函数调用场景来试图找出危险的调用。
说明  : 针对HP-UX PA指令。
编写  : watercloud
日期  : 2003-3-1
**/


/**
函数名:void func1arg(string,string,long,long,string)  
说明:  企图分析全部对__funcName的调用时使用_reg寄存器的调用情景。
强调:  函数为调试目的对__debugFlag>10时做了特殊处理,此时__funcName为一个地址,表示从该
        地址回溯,在回溯路径上查看_reg的使用情况,此时_debugFlag=__debugFlag-10 ,researchFlag =1。
**/
static func1arg(__funcName,_reg,_deepLen,__debugFlag,_aligStr)
{

	auto type,addr,addrX,funcAddr,_funcName,funcName,_debugFlag;
	auto n,tmp,tmpStr,tmpStr1,tmpStr2,tmpAddr,tmpReg,value;
	auto researchFlag;

	if(_deepLen <=0)
		return;
	

	if(__debugFlag > 10) //特殊调试情况,回溯分析某个寄存器使用情况。
	{
		researchFlag = 1;
		_debugFlag = __debugFlag - 10;
		tmpStr=GetFunctionName(__funcName);
		if(tmpStr== "")
			return;
		funcAddr=__funcName;
		if(GetMnem(funcAddr) == "call")
			_funcName=GetOpnd(funcAddr,0);
		else
			_funcName="";
		funcAddr=funcAddr+4;
	}
	else //通常分析全文对特定函数特定参数调用使用情况
	{
		researchFlag=0;
		_funcName=__funcName;
		_debugFlag = __debugFlag;
		funcAddr=LocByName(_funcName);
		if(funcAddr == BADADDR)
			return;
		if(_reg != "%r26" && _reg != "%r25" && _reg != "%r24" && _reg !="%r23")
			return;
	}

	n=0;
	addrX=RfirstB(funcAddr);
	while(addrX != BADADDR)
	{
		n ++;
		if(researchFlag == 0 ) //通常情况
		{
			type = XrefType(); 
			if(type != fl_CF && type !=fl_CN) //如果调用类型不是函数调用则忽略
			{
				addrX = RnextB(funcAddr,addrX);
				n--;
				continue;
			}
		}
		else //如果是特殊调试情况,则无需循环,退出
		{
			if(n == 2)
				break;
		}

		//追踪数据来源
		value = getDataResEx(addrX +4,_reg,_debugFlag);
		funcName = GetFunctionName(addrX);
		type = getDRType(value);

		tmpStr = getString(value);
		//如果不是调试模式,且串为已知则忽略
		if( tmpStr !="" && _debugFlag <=1) 
		{
			addrX = RnextB(funcAddr,addrX);
			n--;
			continue;
		}

		//处理相关显示级对函数调用再次回溯递归
		Message("%s%-2i %x\t %s:\t call %s() %s=",_aligStr,n,addrX,funcName,_funcName,_reg);

		if( isDRValue(value) )
		{
			Message("%x:\"%s\"\n",value,tmpStr);
		}
		else if(type == "ARG" )
		{
			Message("%s\n",getDRStr0_1(value));
			func1arg(funcName,getDRReg(value),_deepLen-1,_debugFlag,_aligStr+"  ");
		}
		else if(type == "RET" )
		{
			tmpStr = getDRFunName(value);
			if(tmpStr == "")
				Message("%s\n",getDRStr0_1(value));
			else
				Message("RET %s()\n",tmpStr);
		}
		else if(type == "STA" )
		{
			tmpStr = getDRStrFunName(value);
			if(tmpStr == "")
				Message("%s\n",getDRStr0_1(value));
			else
				Message("RET %s()\n",tmpStr);
		}
		else
		{
			if(_debugFlag >=1 )
				Message("%s\n",getDRStr0_1(value));
			else
				Message("没有找到\n");
		}

		addrX = RnextB(funcAddr,addrX);
	}
} //end of func1arg

/**
函数名:void func2arg(string,long,long,string)  
说明:  针对两个参数的函数分析主要是memcpy,stcat,strcpy . . .。企图分析全部对_funcName的调用时的情景。
**/
static func2arg(_funcName,_deepLen,_debugFlag,_aligStr)
{
	auto n,addr,addrX,typeX,typeSrc,typeDst,nowFunc,valueSrc,valueDst,strSrc,strDst;
	auto desSrc,desDst;

	if(_deepLen <= 0 )
		return;

	addr=LocByName(_funcName);
	if(addr == BADADDR)
		return;

	n=0;
	addrX=RfirstB(addr);
	while(addrX != BADADDR )
	{
		n++;

		typeX = XrefType(); 
		if(typeX != fl_CF && typeX !=fl_CN) //如果调用类型不是函数调用则忽略
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

		nowFunc = GetFunctionName(addrX);

		//获取数据源
		valueSrc = getDataResEx(addrX +4,"%r25",_debugFlag);
		typeSrc = getDRType(valueSrc);
		valueDst=getDataResEx(addrX+4,"%r26",_debugFlag);
		typeDst=getDRType(valueDst);

		//处理相关数据信息
		strSrc="";
		strDst="";

		if( isDRValue(valueSrc) )
			strSrc = getString(valueSrc);
		else if(typeSrc == "RET")
			desSrc= typeSrc +" " + getDRFunName(valueSrc) + "()";
		else if(typeSrc == "ARG")
			desSrc= getDRStr0_1(valueSrc);
		else
		{
			if(_debugFlag >=1)
				desSrc = getDRStr0_1(valueSrc);
			else
				desSrc=typeSrc;
		}

		if( isDRValue(valueDst) )
			strDst = getString(valueDst);
		else if(typeDst == "RET")
			desDst =typeDst + " " + getDRFunName(valueDst) + "()";
		else if(typeDst == "ARG")
			desDst= getDRStr0_1(valueDst);
		else
		{
			if(_debugFlag >=1)
				desDst = getDRStr0_1(valueDst);
			else
				desDst=typeDst;
		}

		//如果源已知,且非调试模式则忽略
		if( isDRValue(valueSrc) && strSrc !="" && _debugFlag <=1)
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}


		//开始打印相关信息

		Message("%s%-2i %x\t %s:\t call %s(",_aligStr,n,addrX,nowFunc,_funcName);

		if(isDRValue(valueDst) )
			Message("%x:\"%s\"," ,valueDst,strDst);
		else 
			Message("%s,",desDst);

		if(isDRValue(valueSrc) )
			Message("%x:\"%s\"" ,valueSrc,strSrc);
		else 
			Message("%s",desSrc);

		Message(")\n");

		if(typeDst== "ARG")
			func1arg(nowFunc,getDRReg(valueDst),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeSrc== "ARG")
			func1arg(nowFunc,getDRReg(valueSrc),_deepLen-1,_debugFlag,_aligStr+"  ");
		 
		addrX = RnextB(addr,addrX);

	}
	Message("\n");
} //end of func2arg



/**
函数名:void funcNarg(string,long,long,string)  
说明:  针对两个参数的函数分析主要是strncpy. . .。企图分析全部对_funcName的调用时的情景。
**/
static funcNarg(_funcName,_deepLen,_debugFlag,_aligStr)
{
	auto n,addr,addrX,typeX,typeSrc,typeDst,typeN,typeR23,nowFunc,valueSrc;
	auto valueDst,argNumber,tmpStr,index,frameSize;
	auto valueN,valueR23,strSrc,strDst,strN,strR23,desSrc,desDst,desN,desR23;

	if(_deepLen <= 0 )
		return;

	addr=LocByName(_funcName);
	if(addr == BADADDR)
		return;

	n=0;
	addrX=RfirstB(addr);
	while(addrX != BADADDR )
	{
		n++;

		typeX = XrefType(); 
		if(typeX != fl_CF && typeX !=fl_CN) //如果调用类型不是函数调用则忽略
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

		valueSrc =0;  valueDst=0;  valueN=0;
		argNumber=0;
		strSrc="";    strDst="";
		strN=""; 

		nowFunc = GetFunctionName(addrX);

		//追踪3个参数的数据来源
		valueSrc = getDataResEx(addrX +4,"%r25",_debugFlag);
		typeSrc = getDRType(valueSrc);
		valueDst=getDataResEx(addrX+4,"%r26",_debugFlag);
		typeDst=getDRType(valueDst);
		valueN = getDataResEx(addrX +4,"%r24",_debugFlag);
		typeN = getDRType(valueN);

		//如果目标为栈且已知拷贝最大长度N,且N<FrameSize且非调试模式则忽略
		frameSize = GetFrameSize(addrX);
		if( ( frameSize <=0 || valueN <=frameSize ) &&  typeDst == "STA" && isDRValue(valueN)  && _debugFlag <= 1 )
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

		//处理源串信息
		if( isDRValue(valueSrc) )
			strSrc = getString(valueSrc);
		else if(typeSrc == "RET")
			desSrc= typeSrc +" " + getDRFunName(valueSrc) + "()";
		else if(typeSrc == "ARG")
			desSrc= getDRStr0_1(valueSrc);
		else
		{
			if(_debugFlag >=1)
				desSrc = getDRStr0_1(valueSrc);
			else
				desSrc=typeSrc;
		}

		//如果源为已知,且非调试模式则忽略
		if( isDRValue(valueSrc) && strSrc !="" && _debugFlag <= 1 )
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

		//处理目标信息
		if( isDRValue(valueDst) )
			strDst = getString(valueDst);
		else if(typeDst == "RET")
			desDst =typeDst + " " + getDRFunName(valueDst) + "()";
		else if(typeDst == "ARG")
			desDst= getDRStr0_1(valueDst);
		else
		{
			if(_debugFlag >=1)
				desDst = getDRStr0_1(valueDst);
			else
				desDst=typeDst;
		}


		//处理N信息
		if( isDRValue(valueN) )
			strN = getString(valueN);
		else if(typeN == "RET")
			desN =typeN + " " + getDRFunName(valueN) + "()";
		else if(typeN == "ARG")
			desN= getDRStr0_1(valueN);
		else
		{
			if(_debugFlag >=1)
				desN = getDRStr0_1(valueN);
			else
				desN=typeN;
		}


		//显示相关信息
		Message("%s%-2i %x\t %s:\t call %s(",_aligStr,n,addrX,nowFunc,_funcName);

		if(isDRValue(valueDst) )
			Message("%x:\"%s\"," ,valueDst,strDst);
		else 
			Message("%s,",desDst);

		if(isDRValue(valueSrc) )
			Message("%x:\"%s\"," ,valueSrc,strSrc);
		else 
			Message("%s,",desSrc);

		if(isDRValue(valueN) )
			Message("%x" ,valueN);
		else 
			Message("%s",desN);

		if( _debugFlag >=2 && typeDst=="STA")
			Message(") 栈空间大小=%x\n",frameSize);
		else
			Message(")\n");


		if(typeDst== "ARG")
			func1arg(nowFunc,getDRReg(valueDst),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeSrc== "ARG")
			func1arg(nowFunc,getDRReg(valueSrc),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeN== "ARG")
			func1arg(nowFunc,getDRReg(valueN),_deepLen-1,_debugFlag,_aligStr+"  ");

		 
		addrX = RnextB(addr,addrX);

	}
	Message("\n");
} //end of funcNarg


/**
函数名:void funcMarg(string,long,long,string)  
说明:  针对两个参数的函数分析主要是sprintf . . .。企图分析全部对_funcName的调用时的情景。
**/
static funcMarg(_funcName,_deepLen,_debugFlag,_aligStr)
{
	auto n,addr,addrX,typeX,typeFmt,typeDst,typeR24,typeR23,nowFunc,valueFmt;
	auto valueDst,argNumber,tmpStr,index;
	auto valueR24,valueR23,strFmt,strDst,strR24,strR23,desFmt,desDst,desR24,desR23;

	if(_deepLen <= 0 )
		return;

	addr=LocByName(_funcName);
	if(addr == BADADDR)
		return;

	n=0;
	addrX=RfirstB(addr);
	while(addrX != BADADDR ) //循环处理所有对该函数的调用
	{
		n++;

		typeX = XrefType(); 
		if(typeX != fl_CF && typeX !=fl_CN) //如果调用类型不是函数调用则忽略
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

		valueFmt =0;  valueDst=0;  valueR24=0;  valueR23=0;
		argNumber=0;
		strFmt="";    strDst="";
		strR24="";    strR23="";

		nowFunc = GetFunctionName(addrX);

		//追踪目标地址、格式化串相关的数据来源
		valueFmt = getDataResEx(addrX +4,"%r25",_debugFlag);
		typeFmt = getDRType(valueFmt);
		valueDst=getDataResEx(addrX+4,"%r26",_debugFlag);
		typeDst=getDRType(valueDst);


		//处理格式串相关信息
		if( isDRValue(valueFmt) )
			strFmt = getString(valueFmt);
		else if(typeFmt == "RET")
			desFmt= typeFmt +" " + getDRFunName(valueFmt) + "()";
		else if(typeFmt == "ARG")
			desFmt= getDRStr0_1(valueFmt);
		else
		{
			if(_debugFlag >=1)
				desFmt = getDRStr0_1(valueFmt);
			else
				desFmt=typeFmt;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -