Mobile6.1 API Hook问题

本文探讨了一个关于HookOneAPI函数的问题,在尝试钩住特定API时出现异常。文章详细记录了作者遇到的具体错误,并展示了相关代码片段。作者希望通过调整内存权限解决访问受限的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

void  HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
 RETAILMSG(1,(TEXT("--HookOneAPI------1----/n")));

 pDosHeader = (PIMAGE_DOS_HEADER)hModCallerModule;
 RETAILMSG(1,(TEXT("--HookOneAPI------1--1--/n")));

    pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hModCallerModule + pDosHeader->e_lfanew);
 RETAILMSG(1,(TEXT("--HookOneAPI------1--2--/n")));
    pOptHeader = (PIMAGE_OPTIONAL_HEADER)&(pNTHeaders->OptionalHeader);

 RETAILMSG(1,(TEXT("--HookOneAPI------1--3--/n")));
    pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hModCallerModule + pOptHeader->DataDirectory[1].VirtualAddress);
 
 RETAILMSG(1,(TEXT("--HookOneAPI------2----/n")));

 while(pImportDescriptor->FirstThunk)
 {
  char * dllname = (char *)((BYTE *)hModCallerModule + pImportDescriptor->Name);

  pThunkData = (PIMAGE_THUNK_DATA)((BYTE *)hModCallerModule + pImportDescriptor->OriginalFirstThunk);

  RETAILMSG(1,(TEXT("--HookOneAPI------3----/n")));

  int no = 1;
  while(pThunkData->u1.Function)
  {
   char * funname = (char *)((BYTE *)hModCallerModule + (DWORD)pThunkData->u1.AddressOfData + 2);
   PDWORD lpAddr = (DWORD *)((BYTE *)hModCallerModule + (DWORD)pImportDescriptor->FirstThunk) +(no-1);
    
   //修改内存的部分
   if((*lpAddr) == (int)pfnOriginApiAddress)
   {
    RETAILMSG(1,(TEXT("--HookOneAPI------4----/n")));

    //修改内存页的属性
    DWORD dwOLD;
    MEMORY_BASIC_INFORMATION  mbi;
    VirtualQuery(lpAddr,&mbi,sizeof(mbi));
    VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOLD);
            
    WriteProcessMemory(GetCurrentProcess(),
      lpAddr, &pfnDummyFuncAddress, sizeof(pfnDummyFuncAddress), NULL);
    //恢复内存页的属性
    VirtualProtect(lpAddr,sizeof(DWORD),dwOLD,0);

    return;
   }
   //---------
   no++;
   pThunkData++;
  }

  pImportDescriptor++;
 }
}
DWORD GetProcessAddress(LPCTSTR pName)
{
 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (INVALID_HANDLE_VALUE == hSnapshot)
 {
  return 0;
 }
 PROCESSENTRY32 pe = { sizeof(pe) };
 BOOL fOk;
 for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
 {
  if (0 == wcscmp(pe.szExeFile, pName))
  {
   CloseHandle(hSnapshot);
   return pe.th32MemoryBase;
  }
 }
 CloseHandle(hSnapshot);
 return 0;
}


BOOL InstallHook(BOOL IsHook)
{
 modeStatus = SetKMode(TRUE);
 dwPerm = SetProcPermissions(GetCurrentPermissions());
 
 DWORD currHandle = GetProcessAddress(TEXT("cmdcore.exe"));
 

 HookOneAPI(L"coredll.dll",GetProcAddress(GetModuleHandle(TEXT("coredll.dll")),L"DispatchMessageW"),(PROC)&H_DispatchMessageW,(HMODULE)currHandle/*GetModuleHandle(TEXT("console.dll"))*/);

 
 return TRUE;
}

 

 

现在代码执行到

    RETAILMSG(1,(TEXT("--HookOneAPI------1--1--/n")));

    pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hModCallerModule + pDosHeader->e_lfanew);

会出现异常。

 

我得到的hModCallerModule值是0x24000000,好像是地址访问受限,我通过SetKMode 和 SetProcPermissions 也没有任何改善。

 

希望大家能给些建议。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值