看流星社区

 找回密码
 注册账号
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 187|回复: 2

防破解call栈帧检测技术分享

[复制链接]
发表于 2019-9-10 14:57:05 | 显示全部楼层 |阅读模式
call栈帧检测,检测目标函数的返回地址,防止目标函数被hook,可用于软件防破解

全程伪代码讲解

知识点1 函数的返回地址所在范围
----------
通常,call一个函数会形成一个栈帧,
例如:
void msg()//无参call
{
    信息框("我是信息框")
}
void msg1(整数型 句柄,文本型 标题,文本型 内容,整数型 类型)//有参call
{
    信息框(句柄,标题,内容,类型)
}


不管有参还是无参,都会形成栈帧,msg栈有4个字节集,msg2有5*4个字节集
返回地址所在范围可以确定:肯定在exe本身范围之内,大于进程的基址,小于进程的基址加上大小

以下将msg()作为目标函数
知识点2:嵌套调用的栈帧情况
----------
void msg()
{
   信息框("我是信息框")
}


void function1()
{
    function2()
}
void function2()
{
    function3()
}

void function3()
{
    function4()
}

void function4()
{
    msg()
}

当调用function1()函数时,栈是什么样子呢?

此时,栈中有5个栈帧,按照调用顺序排列,msg()返回地址在function4()内,一次类推

这就形成了一个确定的栈帧结构

于是,我们可以在
void function4()
{
   msg()
}
中,插入我们的检测函数,
int check()
{
    //置入代码({,,,,,,})
}
void function4()
{
    check()//检测函数
    msg()
}

知识点3:获取函数的上层栈帧和返回地址
获取检测函数的上层栈帧的返回地址
mov eax,[ebp]
mov eax,[eax]
mov eax,[eax+4]
leave
retn
嵌套调用的话,汇编中写个循环就可以了,写循环不难吧?
发表于 2019-9-22 03:10:57 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!
发表于 2019-10-21 15:31:31 | 显示全部楼层
优秀,666666666666666666
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2019-11-12 06:43

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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