12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 275|回复: 0

InfinityHook 事件逆向

[复制链接]
发表于 2021-7-18 17:47:16 | 显示全部楼层 |阅读模式
0x0 前言

看本文之前发起先看一下《剖析InfinityHook原理 掀起一场更激烈的攻与防恶战》这篇文章。
相识一下InfinityHook的根本原理。
0xI InfinityHook探求指针方式解析

我们先来看看原作者是如何探求的,在源码的IfhpInternalGetCpuClock函数内
    PVOID* StackMax = (PVOID*)__readgsqword(OFFSET_KPCR_RSP_BASE);    PVOID* StackFrame = (PVOID*)_AddressOfReturnAddress();StackFrame为栈顶,StackMax为栈底,
获取两个值是为了确定范围,要在这两个值范围之间探求在堆栈中那个要替换的指针。
for (PVOID* StackCurrent = StackMax;        StackCurrent > StackFrame;        --StackCurrent)    {        //         // This is intentionally being read as 4-byte magic on an 8        // byte aligned boundary.        //        PULONG AsUlong = (PULONG)StackCurrent;        if (*AsUlong != INFINITYHOOK_MAGIC_1)        {            continue;        }        //         // If the first magic is set, check for the second magic.        //        --StackCurrent;        PUSHORT AsShort = (PUSHORT)StackCurrent;        if (*AsShort != INFINITYHOOK_MAGIC_2)        {            continue;        }将StackMax栈底给StackCurrent再给AsUlong,用AsUlong地点里的值与INFINITYHOOK_MAGIC_1相比较,
不相等就回到for循环减一,相等就减1继续与INFINITYHOOK_MAGIC_2比较,不相等就回到for减一循环,
直到找到两个值,也就是说,从栈底往上一个个的比对值是否为INFINITYHOOK_MAGIC,直到找到两个值才继续。这两个值分别为 0x501802 和0xF33,这里记下两个值背面有提及。
for (;StackCurrent < StackMax;++StackCurrent)        {            PULONGLONG AsUlonglong = (PULONGLONG)StackCurrent;            if (!(PAGE_ALIGN(*AsUlonglong) >= SystemCallEntryPage &&                PAGE_ALIGN(*AsUlonglong) < (PVOID)((uintptr_t)SystemCallEntryPage + (PAGE_SIZE * 2))))            {                continue;            }            void** SystemCallFunction = &StackCurrent[9];                       if (IfhpCallback)            {                IfhpCallback(SystemCallIndex, SystemCallFunction);            }            break;        }找到两个值的位置后,再从这个位置向下,探求系统调用,找到后,以这个系统调用的位置为基准,
以后找9个,每个8字节,也就是偏移72的位置的值,如许这个函数指针就找到了。
0x2逆向HOOK系统调用变乱

是不是看的一脸懵逼,没错我也是,为什么是那两个特定值,那两个值是怎么来的。
那篇文章没写 ,源码的注释也没说,那换个其他变乱这个探求方式还能用吗?
不能,我试过了。
这里就要理一理思路了,这两个值既然在堆栈中,那么不是当前函数搞进去的,就是前一个函数,

或者前前的函数.........., 那么这个函数就应该在调用栈上,那我们就下个断点,在windbg中看一下调用栈。
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 14:18 , Processed in 0.062500 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表