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

📄 tiger.idc

📁 《网络渗透技术》一书所附源代码
💻 IDC
📖 第 1 页 / 共 2 页
字号:
		//处理目标地址相关信息
		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;
		}


		//查看有多少个%s以判断还有多少个参数需处理
		tmpStr=strFmt;
		index=strstr(tmpStr,"%s");
		while(index >=0)
		{
			argNumber ++;
			tmpStr=substr(tmpStr,index+2,-1);
			index=strstr(tmpStr,"%s");
		}

		//如果有1个以上%s则处理第二个参数
		if(argNumber >=1)
		{
			valueR24 = getDataResEx(addrX +4,"%r24",_debugFlag);
			typeR24 = getDRType(valueR24);

			if( isDRValue(valueR24) )
				strR24 = getString(valueR24);
			else if(typeR24 == "RET")
				desR24 =typeR24 + " " + getDRFunName(valueR24) + "()";
			else if(typeR24 == "ARG")
				desR24= getDRStr0_1(valueR24);
			else
			{
				if(_debugFlag >=1)
					desR24 = getDRStr0_1(valueR24);
				else
					desR24=typeR24;
			}
		}

		//如果有两个以上%s则处理第二个参数
		if(argNumber >=2)
		{
			valueR23 = getDataResEx(addrX +4,"%r23",_debugFlag);
			typeR23 = getDRType(valueR23);

			if( isDRValue(valueR23) )
				strR23 = getString(valueR23);
			else if(typeR23 == "RET")
				desR23 =typeR23 + " " + getDRFunName(valueR23) + "()";
			else if(typeR23 == "ARG")
				desR23= getDRStr0_1(valueR23);
			else
			{
				if(_debugFlag >=1)
					desR23 = getDRStr0_1(valueR23);
				else
					desR23=typeR23;
			}
		}

		
		//如果没有参数且格式串已知则忽略
		if( (argNumber == 0 && strFmt !="" && isDRValue(valueFmt) )  && _debugFlag <=1)
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}
		//如果有一个参数,而该参数是已知串,且不是调试模式则忽略
		if( (argNumber == 1 && strR24 !="" && isDRValue(valueR24) )  && _debugFlag <=1)
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}
		//如果有2个参数,且参数都是已知串,且不是调试模式则忽略
		if((argNumber ==2 && strR24 != "" && strR23 != ""&&isDRValue(valueR24)&&isDRValue(valueR23)) && _debugFlag <=1)
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}


		//开始打印相关信息
		if(_debugFlag < 2)
		{
		}

		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(valueFmt) )
			Message("%x:\"%s\"" ,valueFmt,strFmt);
		else 
			Message("%s",desFmt);

		if(argNumber >=1)
		{
			if(isDRValue(valueR24) )
				Message(",%x:\"%s\"," ,valueR24,strR24);
			else 
				Message(",%s,",desR24);
		}

		if(argNumber >=2)
		{
			if(isDRValue(valueR23) )
				Message("%x:\"%s\"," ,valueR23,strR23);
			else 
				Message("%s,",desR23);
		}

		if(argNumber >=3)
			Message(" . . . ");

		Message(")\n");


		if(typeDst== "ARG")
			func1arg(nowFunc,getDRReg(valueDst),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeFmt== "ARG")
			func1arg(nowFunc,getDRReg(valueFmt),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeR24== "ARG")
			func1arg(nowFunc,getDRReg(valueR24),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeR23== "ARG")
			func1arg(nowFunc,getDRReg(valueR23),_deepLen-1,_debugFlag,_aligStr+"  ");

		 
		addrX = RnextB(addr,addrX);

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

/**
函数名:void funcSnprintf(string,long,long,string)  
说明:  分析snprintf . . .。企图分析全部对_funcName的调用时的情景。
**/
static funcSnprintf(_funcName,_deepLen,_debugFlag,_aligStr)
{
	auto n,addr,addrX,typeX,typeFmt,typeDst,typeN,typeR23,nowFunc,valueFmt;
	auto valueDst,argNumber,tmpStr,index,frameSize;
	auto valueN,valueR23,strFmt,strDst,strN,strR23,desFmt,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;
		}

		valueFmt =0;  valueDst=0;  valueN=0;  valueR23=0;
		argNumber=0;
		strFmt="";    strDst="";
		strN="";    strR23="";

		nowFunc = GetFunctionName(addrX);


		//追踪目标地址、拷贝最大数据N、格式串数据来源
		valueFmt = getDataResEx(addrX +4,"%r24",_debugFlag);
		typeFmt = getDRType(valueFmt);
		valueDst=getDataResEx(addrX+4,"%r26",_debugFlag);
		typeDst=getDRType(valueDst);
		valueN = getDataResEx(addrX +4,"%r25",_debugFlag);
		typeN = getDRType(valueN);

		frameSize = GetFrameSize(addrX); //求堆栈大小


		//处理格式串相关信息
		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;
		}

		//处理目标地址相关信息
		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;
		}

		//求参数个数
		tmpStr=strFmt;
		index=strstr(tmpStr,"%s");
		while(index >=0)
		{
			argNumber ++;
			tmpStr=substr(tmpStr,index+2,-1);
			index=strstr(tmpStr,"%s");
		}


		//如果目标是栈、且N<栈帧大小,并且非调试模式,且格式串为已知则忽略
		if((frameSize <=0 || valueN <=frameSize ) && isDRValue(valueN) && typeDst=="STA" && strFmt!="" && _debugFlag <=2 )
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

		//处理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;
		}

		//如果有1个以上%s则处理第1个参数
		if(argNumber >=1)
		{
			valueR23 = getDataResEx(addrX +4,"%r23",_debugFlag);
			typeR23 = getDRType(valueR23);

			if( isDRValue(valueR23) )
				strR23 = getString(valueR23);
			else if(typeR23 == "RET")
				desR23 =typeR23 + " " + getDRFunName(valueR23) + "()";
			else if(typeR23 == "ARG")
				desR23= getDRStr0_1(valueR23);
			else
			{
				if(_debugFlag >=1)
					desR23 = getDRStr0_1(valueR23);

				else
					desR23=typeR23;
			}
		}


		//如果没有参数且格式串已知则忽略
		if( (argNumber == 0 && strFmt !="" && isDRValue(valueFmt) )  && _debugFlag <=1)
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}
		//如果有一个参数,而该参数是已知串,且不是调试模式则忽略
		if( (argNumber == 1 && strR23 !="" && isDRValue(valueR23) )  && _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(valueN) )
			Message("%x," ,valueN);
		else 
			Message("%s,",desN);

		if(isDRValue(valueFmt) )
			Message("%x:\"%s\"" ,valueFmt,strFmt);
		else 
			Message("%s",desFmt);

		if(argNumber >=1)
		{
			if(isDRValue(valueR23) )
				Message(",%x:\"%s\"" ,valueR23,strR23);
			else 
				Message(",%s",desR23);
		}

		if(argNumber >=2)
			Message(" . . . ");

		Message(")\n");


		//如果需要回溯寻找相应调用参数则继续回溯相应参数
		if(typeDst== "ARG")
			func1arg(nowFunc,getDRReg(valueDst),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeN== "ARG")
			func1arg(nowFunc,getDRReg(valueN),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeFmt== "ARG")
			func1arg(nowFunc,getDRReg(valueFmt),_deepLen-1,_debugFlag,_aligStr+"  ");
		if(typeR23== "ARG")
			func1arg(nowFunc,getDRReg(valueR23),_deepLen-1,_debugFlag,_aligStr+"  ");

		 
		addrX = RnextB(addr,addrX);

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


/**
函数名:void funcFmt(string,long,long,string)  
说明:  分析xxprintf格式串问题 . . .。企图分析全部对_funcName的调用时的情景。
**/
static funcFmt(_funcName,_deepLen,_debugFlag,_aligStr)
{
	auto n,addr,addrX,typeX,typeFmt,nowFunc,valueFmt;
	auto strFmt,desFmt,regFmt;

	if(_deepLen <= 0 )
		return;

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

	if( _funcName =="vsnprintf" || _funcName == "snprintf")
		regFmt="%r24";
	else if(_funcName =="fprintf" || _funcName=="vfprintf" ||_funcName=="sprintf")
		regFmt="%r25";
	else //printf  vprintf
		regFmt="%r26";

	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;  
		strFmt="";
		desFmt="";

		nowFunc = GetFunctionName(addrX);

		//追踪格式串数据来源
		valueFmt = getDataResEx(addrX +4,regFmt,_debugFlag);
		typeFmt = getDRType(valueFmt);


		//处理格式串相关信息
		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;
		}

		//如果格式串已知,且不是调试模式则忽略
		if( strFmt !="" && isDRValue(valueFmt)  && _debugFlag <=1)
		{
			addrX = RnextB(addr,addrX);
			n--;
			continue;
		}

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

		if(isDRValue(valueFmt) )
			Message("%x:\"%s\"" ,valueFmt,strFmt);
		else 
			Message("%s",desFmt);

		Message(" )\n");


		//如果需要回溯寻找相应调用参数则继续回溯相应参数
		if(typeFmt== "ARG")
			func1arg(nowFunc,getDRReg(valueFmt),_deepLen-1,_debugFlag,_aligStr+"  ");
		 
		addrX = RnextB(addr,addrX);

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


⌨️ 快捷键说明

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