-
Notifications
You must be signed in to change notification settings - Fork 93
Open
Description
使用 armHook 后,可以跳转到 onCallBack 的函数去,但是 onCallBack 参数收到的参数不正确。
使用方式是直接参考的 Demo 里的 bool InlineHook(void *pHookAddr, void (*onCallBack)(struct pt_regs *)), 只修改了 onCallBack,改成适合自己的格式。
// 头文件
typedef struct tagINLINEHOOKINFO{
void *pHookAddr;
void *pStubShellCodeAddr;
void*(*onCallBack)(void*, void*, void*); // onCallBack 改了下,和demo 里有点区别
void ** ppOldFuncAddr;
BYTE szbyBackupOpcodes[OPCODEMAXLEN];
int backUpLength;
int backUpFixLengthList[BACKUP_CODE_NUM_MAX];
uint32_t *pNewEntryForOldFunction;
} INLINE_HOOK_INFO;
// Hook 实现
bool TestHooker::Hook(const char* name, void* org, void*(*dest)(void*, void*, void*)) {
bool bRet = false;
if(org == NULL || dest == NULL)
{
return bRet;
}
INLINE_HOOK_INFO* pstInlineHook = new INLINE_HOOK_INFO();
pstInlineHook->pHookAddr = org;
pstInlineHook->onCallBack = dest;
if(TEST_BIT0((uint32_t)pstInlineHook->pHookAddr)) {
if(HookThumb(pstInlineHook) == false) {
delete pstInlineHook;
return bRet;
}
} else {
if(HookArm(pstInlineHook) == false) { // 使用的是 HookArm
delete pstInlineHook;
return bRet;
}
}
m_InlineHookInfoPVec.push_back(pstInlineHook);
Origin_getenv = *pstInlineHook->ppOldFuncAddr;
return true;
}
// OnCallback 函数
void* CalledFunc(void* param0, void* param1, void* param2){
std::string memStr = PrintBuffer(param0, 10);
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "** %s **", memStr.c_str()); // **被调用后,打印出 ”50 30 02 e4 00 00 00 00 00 00“,内容是不正确的。**
return ((void*(*)(void*, void*, void*))Origin_getenv)(param0, param1, param2);;
}
// 运行
Hook("test", orgAddr, CalledFunc); // orgAddr 是从一个第三方 so 中获取出的函数地址。
Hook 运行后正确执行到了 CalledFunc, Orgigin_getenv 调用也正确,但参数的数据都不对了。
有试过对同一个 so 的另一个只有一个参数的函数 hook过,运行是正常的。
测试机: Google Pixel2
刚接触 hook ,对 arm 和底层不大了解,哪位大佬能帮忙看下问题大概是出在哪里吗。
Metadata
Metadata
Assignees
Labels
No labels