symbols.c

来自「一个类似与Windows环境下的softice的源代码」· C语言 代码 · 共 1,948 行 · 第 1/5 页

C
1,948
字号
	LPSTR pElfStr;	Elf32_Shdr* pElfShdr;    PICE_SYMBOLFILE_HEADER* pSymbols;#ifndef ACTIVATE_SYMBOL_LOOKUP	return FALSE;#endif // ACTIVATE_SYMBOL_LOOKUP	ENTER_FUNC();#if 0    if(ulValue < TASK_SIZE)    {    	LEAVE_FUNC();        return FALSE;    }#endif // 0    pSymbols = FindSymbolTableForModule(ulValue);	if(pSymbols && pmodule_list)	{        struct module* pModTemp;		DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "looking up symbols\n");        pMod = pmodule_list;        do        {            if(!pMod->size)                pModTemp = &fake_kernel_module;            else                pModTemp = pMod;			if(ulValue>=((ULONG)pModTemp+sizeof(struct module)) && ulValue<((ULONG)pModTemp+pModTemp->size-sizeof(struct module)))			{				if(PICE_strcmpi((LPSTR)pModTemp->name,pSymbols->name) == 0)				{					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "found symbols for module %s @ %p\n", pModTemp->name, pSymbols);					pElfSym = (Elf32_Sym*)((ULONG)pSymbols+pSymbols->ulOffsetToGlobals);					pElfStr = (LPSTR)((ULONG)pSymbols+pSymbols->ulOffsetToGlobalsStrings);					pElfShdr = (Elf32_Shdr*)((ULONG)pSymbols+pSymbols->ulOffsetToHeaders);					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfSym = %p\n", pElfSym);					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfStr = %p\n", pElfStr);					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfShdr = %p\n", pElfShdr);					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "%s has %u symbols\n", pSymbols->name,pSymbols->ulSizeOfGlobals/sizeof(Elf32_Sym));					for(i=0;i<(pSymbols->ulSizeOfGlobals/sizeof(Elf32_Sym));i++)					{						if((ELF32_ST_BIND(pElfSym->st_info)==STB_GLOBAL || ELF32_ST_BIND(pElfSym->st_info)==STB_LOCAL || ELF32_ST_BIND(pElfSym->st_info)==STB_WEAK)  &&						   (ELF32_ST_TYPE(pElfSym->st_info)==STT_OBJECT || ELF32_ST_TYPE(pElfSym->st_info)==STT_FUNC) && 						   (pElfSym->st_shndx<SHN_LORESERVE || pElfSym->st_shndx==SHN_ABS || pElfSym->st_shndx==SHN_COMMON))						{							LPSTR pName = &pElfStr[pElfSym->st_name];							ULONG start,end;							DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pName = %x\n", (ULONG)pName);							if(!IsAddressValid((ULONG)pName) )							{								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pName is not a valid pointer\n");								return FALSE;							}							DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pName = %s\n", pName);							if(!IsRangeValid((ULONG)pElfSym,sizeof(Elf32_Sym) ) )							{								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfSym = %x is not a valid pointer\n", (ULONG)pElfSym);								return FALSE;							}							DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pModTemp = %x\n", (ULONG)pModTemp);                            if(pModTemp != &fake_kernel_module)                            {								Elf32_Shdr* pElfShdrThis = (Elf32_Shdr*)pElfShdr + pElfSym->st_shndx;								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "module is not kernel\n");								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfShdr[%x] = %x\n", pElfSym->st_shndx,(ULONG)pElfShdrThis);								if(!IsRangeValid((ULONG)pElfShdrThis,sizeof(Elf32_Shdr)) )								{									DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfShdr[%x] = %p is not a valid pointer\n", pElfSym->st_shndx, pElfShdrThis);									return FALSE;								}							    start = ((ULONG)pModTemp+pElfShdrThis->sh_offset);								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [1] = %x\n", start);							    start = (start+pElfShdrThis->sh_addralign)&~(pElfShdrThis->sh_addralign-1);								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [2] = %x\n", start);							    start += pElfSym->st_value;								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [3] = %x\n", start);                            }                            else                            {								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "module is kernel\n");                                start = pElfSym->st_value;								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [1] = %x\n", start);                            }							end = start+pElfSym->st_size;							DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "end = %x\n", end);							if(ulValue>=start && ulValue<end)							{							    DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "[%u] %.8X %.8X %.8X %.8X %.8X %.8X %.8X\n", 										pElfSym->st_shndx,										((ULONG)pModTemp+pElfShdr[pElfSym->st_shndx].sh_offset),										pElfShdr[pElfSym->st_shndx].sh_addr,										pElfShdr[pElfSym->st_shndx].sh_offset,										pElfShdr[pElfSym->st_shndx].sh_size,										pElfShdr[pElfSym->st_shndx].sh_type,										pElfShdr[pElfSym->st_shndx].sh_link,										pElfShdr[pElfSym->st_shndx].sh_addralign);								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "in section [%u] %8x value = %x module struct %x (%x)\n", pElfSym->st_shndx,pElfShdr[pElfSym->st_shndx].sh_offset,ulValue,sizeof(struct module),((sizeof(struct module)+0x10)&~0x0F));								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "[%u] %32s %.8X %.8X %.8X %.8X %.8X %.8X\n", i,pName,pElfSym->st_name,pElfSym->st_value,pElfSym->st_info,pElfSym->st_other,pElfSym->st_size,pElfSym->st_shndx);								DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start %x end %x\n", start,end);								*pFind = temp3;								if(ulValue-start)									PICE_sprintf(temp3, "%s!%s+%x", pModTemp->name,pName,ulValue-start);								else									PICE_sprintf(temp3, "%s!%s", pModTemp->name,pName);								return TRUE;							}						}						pElfSym++;					}				}			}        }while((pMod = pMod->next));	}	else	{	    pSymbols = FindSymbolTableForProcess(ulValue);		if(pSymbols)		{			pElfSym = (Elf32_Sym*)((ULONG)pSymbols+pSymbols->ulOffsetToGlobals);			pElfStr = (LPSTR)((ULONG)pSymbols+pSymbols->ulOffsetToGlobalsStrings);			pElfShdr = (Elf32_Shdr*)((ULONG)pSymbols+pSymbols->ulOffsetToHeaders);			DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfSym = %p\n", pElfSym);			DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfStr = %p\n", pElfStr);			DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfShdr = %p\n", pElfShdr);			DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "%s has %u symbols\n", pSymbols->name, pSymbols->ulSizeOfGlobals/sizeof(Elf32_Sym));			for(i=0;i<(pSymbols->ulSizeOfGlobals/sizeof(Elf32_Sym));i++)			{				if((ELF32_ST_BIND(pElfSym->st_info)==STB_GLOBAL || ELF32_ST_BIND(pElfSym->st_info)==STB_LOCAL || ELF32_ST_BIND(pElfSym->st_info)==STB_WEAK)  &&				   (ELF32_ST_TYPE(pElfSym->st_info)==STT_OBJECT || ELF32_ST_TYPE(pElfSym->st_info)==STT_FUNC) && 				   (pElfSym->st_shndx<SHN_LORESERVE || pElfSym->st_shndx==SHN_ABS || pElfSym->st_shndx==SHN_COMMON))				{					LPSTR pName = &pElfStr[pElfSym->st_name];					ULONG start,end;					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pName = %x\n", (ULONG)pName);					if(!IsAddressValid((ULONG)pName) )					{						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pName is not a valid pointer\n");						return FALSE;					}					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pName = %s\n", pName);					if(!IsRangeValid((ULONG)pElfSym,sizeof(Elf32_Sym) ) )					{						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfSym = %x is not a valid pointer\n", (ULONG)pElfSym);						return FALSE;					}                    {						Elf32_Shdr* pElfShdrThis = (Elf32_Shdr*)pElfShdr + pElfSym->st_shndx;						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "module is not kernel\n");						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfShdr[%x] = %x\n", pElfSym->st_shndx,(ULONG)pElfShdrThis);						if(!IsRangeValid((ULONG)pElfShdrThis,sizeof(Elf32_Shdr)) )						{							DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "pElfShdr[%x] = %p is not a valid pointer\n", pElfSym->st_shndx, pElfShdrThis);							return FALSE;						}						start = ((ULONG)pElfShdrThis->sh_offset);						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [1] = %x\n", start);						start = (start+pElfShdrThis->sh_addralign)&~(pElfShdrThis->sh_addralign-1);						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [2] = %x\n", start);						start += pElfSym->st_value;						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start [3] = %x\n", start);                    }					end = TASK_SIZE;					DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "end = %x\n", end);					if(ulValue>=start && ulValue<end)					{						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "[%u] %.8X %.8X %.8X %.8X %.8X %.8X %.8X\n", 								pElfSym->st_shndx,								((ULONG)pElfShdr[pElfSym->st_shndx].sh_offset),								pElfShdr[pElfSym->st_shndx].sh_addr,								pElfShdr[pElfSym->st_shndx].sh_offset,								pElfShdr[pElfSym->st_shndx].sh_size,								pElfShdr[pElfSym->st_shndx].sh_type,								pElfShdr[pElfSym->st_shndx].sh_link,								pElfShdr[pElfSym->st_shndx].sh_addralign);						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "in section [%u] %8x value = %x module struct %x (%x)\n", pElfSym->st_shndx,pElfShdr[pElfSym->st_shndx].sh_offset,ulValue,sizeof(struct module),((sizeof(struct module)+0x10)&~0x0F));						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "[%u] %32s %.8X %.8X %.8X %.8X %.8X %.8X\n", i,pName,pElfSym->st_name,pElfSym->st_value,pElfSym->st_info,pElfSym->st_other,pElfSym->st_size,pElfSym->st_shndx);						DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "start %x end %x\n", start,end);						*pFind = temp3;						if(ulValue-start)							PICE_sprintf(temp3, "%s!%s+%x", current->comm,pName,ulValue-start);						else							PICE_sprintf(temp3, "%s!%s", current->comm,pName);						return TRUE;					}				}				pElfSym++;			}		}	}    if(pSystemMap && ulValue >= TASK_SIZE && ulValue < kernel_end)    {        p = pSystemMap;        // while we bound in System.map        while(p<((LPSTR)pSystemMap+ulSystemMapSize))        {            // make a temp ptr to the line we can change            pStartOfLine = p;            // will read the hex value and return a pointer to the symbol name            if(ScanExportLine(p,&ulCurrentValue,&pStartOfLine))            {                if(ulValue>=ulCurrentValue && (ulValue-ulCurrentValue)<ulMinValue)                {                    // save away our info for later                    ulMinValue = ulValue-ulCurrentValue;                    pSymbolName = pStartOfLine;                    bResult = TRUE;                    *pFind = temp3;					if(ulMinValue==0)						break;                }            }            // increment pointer to next line            p = pStartOfLine;            while(*p!=0 && *p!=0x0a)p++;                p++;        }        if(bResult)        {            // copy symbol name to temp string            for(i=0;pSymbolName[i]!=0 && pSymbolName[i]!=0x0a;i++)                temp[i] = pSymbolName[i];            temp[i] = 0;            // decide if we need to append an offset            if(ulMinValue)                PICE_sprintf(temp3, "vmlinux!%s+%.8X", temp,ulMinValue);            else                PICE_sprintf(temp3, "vmlinux!%s", temp);        }    }    if(pmodule_list && ulMinValue!=0)    {        pMod = pmodule_list;        do        {			if(ulValue>=((ULONG)pMod+sizeof(struct module)) && ulValue<((ULONG)pMod+pMod->size-sizeof(struct module)))            {			    if(pMod->syms)			    {				    for(i=0;i<pMod->nsyms;i++)				    {					    ulCurrentValue = pMod->syms[i].value;					    if(ulValue>=ulCurrentValue && (LONG)(ulValue-ulCurrentValue)<ulMinValue)					    {						    ulMinValue = ulValue-ulCurrentValue;						    if(ulValue-ulCurrentValue)							    PICE_sprintf(temp3, "%s!%s+%.8X", pMod->name,pMod->syms[i].name,ulValue-ulCurrentValue);						    else							    PICE_sprintf(temp3, "%s!%s", pMod->name,pMod->syms[i].name);						    bResult = TRUE;						    *pFind = temp3;						    if(ulMinValue == 0)							    break;					    }				    }			    }			    // this could be near entry and cleanup of a module			    ulCurrentValue = (ULONG)pMod->init;                if(ulCurrentValue)                {			        if(ulValue>=ulCurrentValue && (LONG)(ulValue-ulCurrentValue)<ulMinValue)			        {				        ulMinValue = ulValue-ulCurrentValue;				        if(ulValue-ulCurrentValue)					        PICE_sprintf(temp3, "%s!init_module+%.8X", pMod->name,ulValue-ulCurrentValue);				        else					        PICE_sprintf(temp3, "%s!init_module", pMod->name);				        bResult = TRUE;				        *pFind = temp3;				        if(ulMinValue == 0)					        break;			        }                }                ulCurrentValue = (ULONG)pMod->cleanup;                if(ulCurrentValue)                {			        if(ulValue>=ulCurrentValue && (LONG)(ulValue-ulCurrentValue)<ulMinValue)			        {				        ulMinValue = ulValue-ulCurrentValue;				        if(ulValue-ulCurrentValue)					        PICE_sprintf(temp3, "%s!cleanup_module+%.8X", pMod->name,ulValue-ulCurrentValue);				        else					        PICE_sprintf(temp3, "%s!cleanup_module", pMod->name);				        bResult = TRUE;				        *pFind = temp3;				        if(ulMinValue == 0)					        break;			        }                }            }        }while((pMod = pMod->next));    }	LEAVE_FUNC();	return bResult;}//************************************************************************* // FindFunctionByAddress() // //************************************************************************* LPSTR FindFunctionByAddress(ULONG ulValue, PULONG pulstart, PULONG pulend){	Elf32_Sym *pElfSym;	LPSTR pElfStr;	Elf32_Shdr *pElfShdr;	struct module *pMod;	struct module *pModTemp;	int i;    PICE_SYMBOLFILE_HEADER* pSymbols;    ULONG start_mod, end_mod;    ENTER_FUNC();#ifndef ACTIVATE_SYMBOL_LOOKUP	return NULL;#endif // !ACTIVATE_SYMBOL_LOOKUP    pSymbols = FindSymbolTableForModule(ulValue);    DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "symbols @ %x\n", (ULONG)pSymbols);	if(pSymbols && pmodule_list)	{		DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "looking up symbol\n");        pMod = pmodule_list;        do        {			if(pMod->size)            {                pModTemp = pMod;                start_mod = (ULONG)pModTemp+sizeof(struct module);                end_mod = (ULONG)pModTemp+pModTemp->size;            }            else            {                pModTemp = &fake_kernel_module;                start_mod = (ULONG)KERNEL_START+sizeof(struct module);                end_mod = (ULONG)KERNEL_START+pModTemp->size;            }            DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "is it %s for %08uX\n", pModTemp->name, ulValue);			if(ulValue>=start_mod && ulValue<end_mod)			{                DPRINT(PICE_DEBUG, DBT_SYMBOLS, DBL_INFO, "address matches %s\n", pModTemp->name);

⌨️ 快捷键说明

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