Loading... 全文以1层栈回溯为例,对Anti Call Stack Check 做个简要分析。 --- - **检测方式** Call Stack 就是某个函数被调用时的栈帧信息。Call Stack检测就是利用栈帧信息中的调用返回地址来确定发起调用的地址是否属于合法的地址区间。 其检测方式 伪代码如下: if(retaddr>gameModuleStartAddr && retaddr<gameModuleStartAddr+gameModuleSize) { //合法,处理正常事务 } else { //非法,执行非法处理流程 //比如exit()、jmp int3 等等 } 其中,区间(gameModuleStartAddr,gameModuleStartAddr+gameModuleSize)实际上应该为主模块代码地址空间。 --- - **对抗call stack 检测的一种简单办法** 因函数调用在intel x86/x64 下,汇编表现为 call functionAddress,其步骤等效于 pop funcionAddress , jmp functionAddress。 因此解决思路就是,在主模块代码地址空间,找个ret (0xc3 ),记录其地址(retaddr)。 pop retaddr // 将主模块空间合法返回地址压出堆栈 xxx //初始化(栈处理及参数赋值) jmp functionAddress 接下来将对 ret和retn的区别,做个深入分析和探讨(只是因为网上搜了下,没发现啥内容,翻了下《加密与解密》和《c++反汇编和逆向技术揭秘》,发现也没涉及)。 最后修改:2021 年 03 月 26 日 07 : 15 PM © 允许规范转载