Пример #1
0
/*******************************************************************************
*
*  函 数 名 : GetFunctionEnd
*  功能描述 : 取得函数的结束地址
*  参数列表 : uAddr       --     起始地址
*  说    明 : 并对没有对uAddr值做检查,如果他处于一个指令中间的话...
*  返回结果 : 成功返回函数结尾地址,否则返回0
*
*******************************************************************************/
ulong GetFunctionEnd(ulong uAddr)
{
    char szSrcDec[1024] = {0};
    char szLine[1024] = {0};
    t_disasm disasm = {0};
    ulong uIndex = uAddr ;
    ulong uSize = 0 ;
    ulong uInstructSize = 0 ;
    ulong uFunctionEnd = uAddr + MAXFUNSIZE ;


    for (; uIndex < uFunctionEnd; uIndex += uInstructSize)
    {
        uSize = Readcommand(uIndex, szLine) ;
        // 再判断是不是call
        // 反汇编二进制指令
        uInstructSize = Disasm((uchar *)szLine, uSize, uIndex, (uchar *)szSrcDec, &disasm, DISASM_ALL, 0);
        if (StrStrI(disasm.result, "ret"))
        {
            return uIndex + uInstructSize ;
        }
    }
    return 0 ;

}
Пример #2
0
//*******************************************************************************
//
//  函 数 名 : SetCallBreakPoint
//  功能描述 : 在地址范围内下断点
//  参数列表 : pRunData       --     RunData指针
//             uFunctionStart --     函数起始地址
//             uFunctionEnd   --     函数结束地址
//  说    明 : 并没有对函数的正确性做检查
//  返回结果 : 成功返回TRUE,失败返回FALSE
//
//******************************************************************************
BOOL  SetCallBreakPoint(PRunData pRunData,
                        ulong uFunctionStart,
                        ulong uFunctionEnd)
{
    char szSrcDec[1024] = {0};
    char szLine[1024] = {0};
    char szName[TEXTLEN] = {0} ;
    t_disasm disasm = {0};
    ulong uIndex = uFunctionStart ;
    ulong uSize = 0 ;
    ulong uInstructSize = 0 ;

    InitTreeHead(pRunData) ;

    // 保留函数起始地址
    pRunData->pCurrentNode->dwFuncStart = uFunctionStart ;
    // 保留函数结束地址
    pRunData->pCurrentNode->dwFuncEnd = uFunctionEnd ;

    for (; uIndex < uFunctionEnd; uIndex += uInstructSize)
    {
        uSize = Readcommand(uIndex, szLine) ;
        // 再判断是不是call
        // 反汇编二进制指令
        uInstructSize = Disasm((uchar *)szLine, uSize, uIndex, (uchar *)szSrcDec, &disasm, DISASM_ALL, 0);
        if (StrStrI(disasm.result, "CALL")
            || StrStrI(disasm.result, "ret"))
        {
            // 是call直接下断点,方便日后api记录
            if(0 == Setbreakpointext(uIndex,TY_ACTIVE,0,0))
            {
                // 先判断断点是否存在,不存在的话丢进链表中去
                if(FALSE == ListExist(&pRunData->BreakPointList, uIndex))
                {
                    pRunData->BreakPointList.push_back(uIndex) ;
                }
            }
        }
    }

    // 判断当前设的断点是不是在显示屏幕中,是的话刷新
    ulong uBase = 0 ;
    Getdisassemblerrange(&uBase, &uSize) ;
    if (uFunctionStart >= uBase && uFunctionStart <= (uBase + uSize))
    {
        Redrawdisassembler() ;
    }
    return TRUE ;
}
Пример #3
0
BOOL XXX(LPVOID pItem,char *pSubString)
{
	
	
	T_X86Instruction      tX86Instruction;
	
	t_dump                *pX86Dasm=NULL;
    ulong                  Address;
	ulong                  SOffest,EOffset;
	ulong                  i;
	unsigned char         InstStr[MAXCMDSIZE];
	ulong                 InstLength;
    t_disasm              da;
    unsigned char         *pdecode=NULL; 

	t_dump *pDasmWnd=(t_dump*)Plugingetvalue(VAL_CPUDASM);
	
	
	pX86Dasm=(	t_dump *)pItem;
	Address=pX86Dasm->base;
	

	char                 cPattern[0x100]={0};
	if (Gettext("Search for pattern ...",cPattern,0,0,Plugingetvalue(VAL_WINDOWFONT))==-1){


		return FALSE;
	}
	
	
	
	
	while(Address=Findnextproc(Address)){
		
	  Getproclimits(Address,&SOffest,&EOffset);
		
		
		
		for (i=SOffest; i<EOffset; ){
			
			if (!Readcommand(i,(char*)InstStr)) break;
			
			
		
			InstLength=Disasm(InstStr,MAXCMDSIZE,i,pdecode,&da,DISASM_CODE,0); 
			
			
			
			tX86Instruction.Addresss=i;
			memcpy(tX86Instruction.Command,da.result,256);
			tX86Instruction.OpCodeLength=InstLength;
			
			if (strstr((char*)tX86Instruction.Command,cPattern) ) {
				
				if (pSubString){ 
					if (strstr((char*)tX86Instruction.Command,pSubString)){
						
						
						DbgMsg("0x%08X %d %s ",
							tX86Instruction.Addresss,
							tX86Instruction.OpCodeLength,
							tX86Instruction.Command);
						
							
						
						Setbreakpoint(tX86Instruction.Addresss,TY_ACTIVE|TY_KEEPCODE,0);
					}
						i+=InstLength;
						continue;
				}
					DbgMsg("0x%08X %d %s ",
							tX86Instruction.Addresss,
							tX86Instruction.OpCodeLength,
							tX86Instruction.Command);
							Setbreakpoint(tX86Instruction.Addresss,TY_ACTIVE|TY_KEEPCODE,0);
				

			}
				
				
			i+=InstLength;
			
		}
		
		
		
		
		
		
	}
	
	
	
	
	return TRUE;
	



}