重定向API就是修改EXE文件的PE结构中的IAT,将自己的函数地址替换原来的函数。
// 实现重定向API
// 参数pDllName:目标API所在的DLL名称
// 参数pFunName:目标API名称
// 参数dwNewProc:自定义的函数地址
BOOL WINAPI RedirectApi ( PCHAR pDllName, PCHAR pFunName, DWORD dwNewProc)
{
// 检查参数是否合法
if ( pDllName == NULL || pFunName == NULL || !dwNewProc || !pItem )
return FALSE ;
// 获取自身应用程序文件基址dwBaseImage
char szTempDllName[256] = {0} ;
DWORD dwBaseImage = (DWORD)GetModuleHandle(NULL) ;
if ( dwBaseImage == 0 )
return FALSE ;
// pDosHeader指向DOS头结构
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)dwBaseImage ;
//pNtHeader指向PE文件头结构
PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(dwBaseImage + (pDosHeader->e_lfanew)) ;
//pOptionalHeader指向可选头结构
PIMAGE_OPTIONAL_HEADER32 pOptionalHeader = &(pNtHeader->OptionalHeader) ;
//pSectionHeader指向第一个段头部结构
PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)
((DWORD)pNtHeader + 0x18 +
pNtHeader->FileHeader.SizeOfOptionalHeader ) ;
// 遍历导入表
PIMAGE_THUNK_DATA pThunk, pIAT ;
//pIID指向第一个导入DLL目录结构
PIMAGE_IMPORT_DESCRIPTOR pIID = (PIMAGE_IMPORT_DESCRIPTOR)(dwBaseImage+pOptionalHeader->DataDirectory[1].VirtualAddress ) ;
while ( pIID->FirstThunk )
{
// 找到指定的DLL导入目录
if ( strcmp ( (PCHAR)(dwBaseImage+pIID->Name), pDllName ) )
{
pIID++ ;
continue ;
}
//pIAT指向该导入DLL的IAT表
pIAT = (PIMAGE_THUNK_DATA)( dwBaseImage +
pIID- >FirstThunk ) ;
//pThunk指向原始的IAT表,说实话我真不清楚什么叫原始IAT表
if ( pIID->OriginalFirstThunk )
pThunk = (PIMAGE_THUNK_DATA)( dwBaseImage +
pIID->OriginalFirstThunk ) ;
else
pThunk = pIAT ;
// 遍历IAT
DWORD dwThunkValue = 0 ;
//dwThunkValue存放原始的IAT表中函数的虚拟地址
while ( ( dwThunkValue = *((DWORD*)pThunk) ) != 0 )
{
if ( ( dwThunkValue & IMAGE_ORDINAL_FLAG32 ) == 0 )
{
// 寻找指定的函数在IAT表中的项
if ( strcmp ( (PCHAR) (dwBaseImage+dwThunkValue+2),
pFunName ) == 0 )
{
// 修改IAT项
DWORD dwOldProtect = 0 ;
VirtualProtect ( pIAT, 4, PAGE_READWRITE,
&dwOldProtect ) ;
*((DWORD*)pIAT) = dwNewProc ;
VirtualProtect ( pIAT, 4, PAGE_READWRITE,
&dwOldProtect ) ;
return TRUE ;
}
}
pThunk ++ ;
pIAT ++ ;
}
pIID ++ ;
}
return FALSE ;
}
总结:该函数就是修改了,当前可执行文件的PE结构中的IAT表,然后这个应用程序调用特定的函数,就调用自己定义的函数了
[课程]Android-CTF解题方法汇总!