一、前言
腾讯作为一家知名的互联网公司,其游戏安全岗位备受关注。本文将结合多位求职者的面经,详细分析腾讯 IEG 游戏安全面试的过程、问题及应对策略,希望能为广大求职者提供有价值的参考。
二、面试过程及问题解析
(一)第一位求职者面经
- 5.8 一面:50min- 拷打项目: - 答案:详细介绍自己参与的项目,包括项目的背景、目标、技术架构、实现过程以及遇到的问题和解决方案。- 如何解决内核中结构体的在不同版本下特定成员偏移不同的问题?- 答案:可以通过动态解析结构体的方式来解决。在运行时,根据实际的内核版本信息,动态地确定结构体成员的偏移量。可以使用一些内核调试工具或者通过读取特定的内核数据结构来获取版本信息,然后根据版本进行相应的偏移计算。- 内核异常处理流程: - 答案:内核异常处理流程通常包括以下步骤:异常发生时,内核首先捕获异常;然后进行异常类型的判断,确定是哪种类型的异常(如内存访问错误、除零错误等);根据异常类型,采取相应的处理措施,可能包括记录日志、发送信号给相关进程、进行错误恢复等;如果无法处理异常,可能会导致系统崩溃或进入内核调试模式。- 手撕:CrackMe 写注册机,限时两天: - 答案:分析 CrackMe 程序的加密算法和验证机制,通过逆向工程找到注册码的生成逻辑,然后编写注册机程序。这需要对汇编语言、反汇编工具以及加密算法有一定的了解。- 交上去 CrackMe 后就是约二面
- 5.10 二面:40min(压力面)- 四个面试官轮番拷打。问项目、个人学习: - 答案:与一面类似,详细介绍项目经验和个人学习过程,突出自己的技术能力和解决问题的能力。- 如何有效打击外挂产业?(这个问得很紧我是没想到的)- 答案:可以从多个方面回答,如加强游戏的安全防护机制,包括加密通信、反调试、反作弊检测等;与执法部门合作,打击外挂制作和销售团队;提高玩家的安全意识,教育玩家不要使用外挂;持续更新游戏,修复可能被利用的漏洞等。- 游戏进程内有哪些有用的 hook 方式?- 答案:游戏进程内的 hook 方式有很多种,如 inline hook、IAT hook、ETW hook 等。Inline hook 是通过修改目标函数的前几条指令为跳转指令,跳转到自己的 hook 函数;IAT hook 是通过修改导入地址表中的函数地址实现 hook;ETW hook 是利用 Windows 事件跟踪机制进行 hook。- inline hook 详细原理: - 答案:Inline hook 是一种在运行时修改函数调用的技术。它通过将目标函数的前几条指令替换为跳转指令,跳转到自己的 hook 函数,从而实现对目标函数的拦截和控制。具体实现过程包括找到目标函数的地址,保存目标函数的前几条指令,将跳转指令写入目标函数的开头,然后在 hook 函数中执行自己的逻辑,最后根据需要调用原始的目标函数。- x64 下 call 时堆栈需要 16 字节对齐的原因: - 答案:在 x64 架构下,函数调用时堆栈需要 16 字节对齐是为了提高性能和保证系统的稳定性。一些处理器指令和优化技术要求堆栈对齐,否则可能会导致性能下降或错误。此外,对齐的堆栈也有助于防止缓冲区溢出等安全问题。- 印象最深的逆向题: - 答案:选择一个自己印象深刻的逆向题目,介绍题目背景、难点以及自己的解决思路和方法。- r3 进程下有哪些游戏保护措施: - 答案:在 r3 进程下,游戏可以采取多种保护措施,如检测调试器、反作弊检测、加密关键数据、防止内存修改等。可以使用一些安全工具和技术,如反调试库、加密库、内存保护工具等。- 检测外挂进程的方法: - 答案:检测外挂进程的方法有很多种,如行为分析、特征检测、内存扫描等。行为分析可以通过监测游戏进程的行为是否异常来判断是否存在外挂;特征检测可以通过查找外挂程序的特定特征码来识别外挂;内存扫描可以通过扫描游戏进程的内存空间,查找可能被外挂修改的关键数据。
(二)第二位求职者面经
- 自我介绍:常规的自我介绍环节。:- 答案:简要介绍自己的教育背景、专业技能、项目经验和对游戏安全的兴趣。
- 软件安全相关问题:- 说一下 PE 文件的大致结构。: - 答案:PE(Portable Executable)文件结构包括 DOS 头、PE 头、节表等。DOS 头包含一些基本的信息,用于在 DOS 环境下运行;PE 头包含了文件的重要信息,如入口点、节表数量等;节表描述了文件中的各个节,如代码节、数据节等。每个节包含了实际的代码或数据。- 恶意代码是如何注入进程的?: - 答案:恶意代码可以通过多种方式注入进程,如 DLL 注入、代码注入、远程线程注入等。DLL 注入是将恶意的 DLL 文件加载到目标进程中;代码注入是将恶意代码直接写入目标进程的内存空间;远程线程注入是在目标进程中创建一个远程线程,执行恶意代码。- 如何检查注入,发现后怎么办?: - 答案:检查注入可以通过多种方式,如监测进程的模块列表、检查进程的内存空间、检测异常的系统调用等。如果发现注入,可以采取一些措施,如终止恶意进程、删除恶意文件、修复被修改的系统设置等。
- Ollydbg 相关问题:- 反调试和混淆技术。: - 答案:Ollydbg 中的反调试技术包括检测调试器的存在、修改内存或寄存器的值以干扰调试、使用加密或混淆技术等。混淆技术可以通过重命名变量和函数、插入无效代码、控制流平坦化等方式来增加代码的分析难度。- 硬件和软件断点的实现。: - 答案:硬件断点是通过设置处理器的调试寄存器来实现的,当程序执行到特定的地址时,处理器会产生中断。软件断点是通过修改内存中的指令为断点指令来实现的,当程序执行到断点指令时,会产生中断。- 如何实现自己的断点?: - 答案:可以通过修改内存中的指令为特定的指令序列,当程序执行到这个指令序列时,产生中断或执行自己的逻辑。也可以使用 Hook 技术,拦截特定的函数调用,实现断点的功能。- Ollydbg 如何实现调试?: - 答案:Ollydbg 通过控制目标进程的执行,获取其内存和寄存器状态,从而实现对程序的调试。它可以设置断点、单步执行、查看内存和寄存器等。- Ollydbg 的快捷键。: - 答案:Ollydbg 有很多常用的快捷键,如 F2(设置断点)、F8(单步执行)、F9(运行程序)等。可以根据自己的使用习惯记忆一些常用的快捷键。
- 杂项问题:- 是否了解 x86 架构?: - 答案:了解 x86 架构的特点、指令集、寄存器等。可以介绍一些 x86 架构的优势和应用场景。- 是否了解 C++?多态是如何实现的?: - 答案:了解 C++ 的基本语法和特性。多态是通过虚函数实现的,在基类中声明虚函数,在派生类中重写虚函数,通过基类指针或引用调用虚函数时,根据实际对象的类型决定调用哪个函数。- 虚函数在内存中的位置。: - 答案:虚函数通常存储在类的虚函数表中。每个包含虚函数的类都有一个虚函数表,其中存储了该类的虚函数地址。对象的首地址通常存储着一个指向虚函数表的指针。- 是否了解安卓逆向?: - 答案:如果了解安卓逆向,可以介绍一些安卓逆向的工具和技术,如反编译工具、Hook 技术、内存分析等。如果不了解,可以表达对安卓逆向的兴趣和学习的决心。- 是否了解 ARM 指令?: - 答案:了解 ARM 指令集的特点、指令格式、寄存器等。可以介绍一些 ARM 指令集的优势和应用场景。
- 从 Hook 到后门攻击:- 问及 Windows 系统的 Hook 技术,特别是除了 inline hook 之外的其他 Hook。: - 答案:除了 inline hook,Windows 系统还有 IAT hook、ETW hook、消息 Hook 等 Hook 技术。IAT hook 是通过修改导入地址表中的函数地址实现 hook;ETW hook 是利用 Windows 事件跟踪机制进行 hook;消息 Hook 是通过拦截 Windows 消息来实现 hook。- 我提到了后门攻击中的 Hook 机制,并成功将话题引导到 AI 安全。: - 答案:可以介绍后门攻击中的 Hook 机制,以及如何利用 Hook 技术进行后门攻击。同时,可以探讨 AI 安全中的相关问题,如对抗样本攻击、模型窃取等,以及如何防范这些攻击。
- 游戏外挂相关问题:- 平时是否玩游戏,比如射击游戏?: - 答案:如实回答自己是否玩游戏,以及玩过哪些游戏。- 如何对抗透视挂?: - 答案:可以从多个方面回答,如加强游戏的安全防护机制,包括加密通信、反作弊检测、防止内存修改等;使用反作弊引擎,检测和封禁使用透视挂的玩家;提高玩家的安全意识,教育玩家不要使用外挂。- 如何发现外挂?: - 答案:可以通过行为分析、特征检测、内存扫描等方式发现外挂。行为分析可以通过监测游戏进程的行为是否异常来判断是否存在外挂;特征检测可以通过查找外挂程序的特定特征码来识别外挂;内存扫描可以通过扫描游戏进程的内存空间,查找可能被外挂修改的关键数据。
- 爬虫相关问题:- 你做过爬虫吗?多少线程?使用什么语言?反爬机制是什么?: - 答案:如果做过爬虫,可以介绍自己做爬虫的经验,包括使用的语言、线程数量、遇到的反爬机制以及如何应对反爬机制。如果没有做过爬虫,可以表达对爬虫技术的兴趣和学习的决心。
- 反问环节:- 日常工作内容是什么?: - 答案:了解游戏安全岗位的日常工作内容,包括分析外挂、检测安全漏洞、加强游戏的安全防护机制等。- 对我的建议是什么?: - 答案:听取面试官的建议,如加强哪些方面的知识学习、提高哪些技能等。
(三)第三位求职者面经
- 问我的问题,我感觉一个都不会,问到后面面试官也不想问了,就草草结束了。
- 介绍项目: - 答案:详细介绍自己参与的项目,包括项目的背景、目标、技术架构、实现过程以及遇到的问题和解决方案。
- 项目部署过或者测试过吗: - 答案:如实回答项目是否部署过或测试过,如果没有,可以说明原因,并表达对项目部署和测试的兴趣和学习的决心。
- 除了锁还有别的方式来达到一人一单的效果吗: - 答案:可以考虑使用事务、乐观锁、版本号等方式来实现一人一单的效果。事务可以保证一组操作的原子性,避免多个用户同时修改同一数据;乐观锁可以通过版本号或时间戳等方式来检测数据是否被其他用户修改;版本号可以在更新数据时检查版本号是否一致,避免覆盖其他用户的修改。
- 多线程会有抢的问题,怎么让一个用户只在一个线程上: - 答案:可以使用线程局部存储(Thread Local Storage,TLS)来实现一个用户只在一个线程上。TLS 可以为每个线程提供独立的存储空间,每个线程可以在 TLS 中存储自己的用户信息,从而保证一个用户只在一个线程上。
- 路由算法,一致性哈希算法: - 答案:介绍路由算法的概念和作用,以及一致性哈希算法的原理和应用场景。一致性哈希算法是一种分布式哈希表算法,它可以将数据均匀地分布在多个节点上,并且在节点增加或减少时,只需要重新分配少量的数据。
- 在路由层面做到一个人只路由到同一个实例: - 答案:可以使用一致性哈希算法或者其他路由算法,根据用户的标识(如用户 ID)进行路由,确保一个用户始终路由到同一个实例。可以在路由表中记录用户的路由信息,以便在后续的请求中快速找到对应的实例。
- 如何把项目解耦拆分: - 答案:可以从多个方面进行项目解耦拆分,如分层架构、模块化设计、依赖注入等。分层架构可以将项目分为不同的层次,如表示层、业务逻辑层、数据访问层等,每个层次之间通过接口进行通信;模块化设计可以将项目拆分为多个独立的模块,每个模块负责特定的功能;依赖注入可以将模块之间的依赖关系通过配置文件或代码进行管理,提高模块的可维护性和可测试性。
- 服务发现: - 答案:介绍服务发现的概念和作用,以及常见的服务发现技术和工具。服务发现是一种在分布式系统中自动发现和管理服务的技术,它可以帮助客户端快速找到可用的服务实例。常见的服务发现技术包括 DNS 服务发现、Consul、Etcd 等。
- 分布式锁的实现:
- 答案:介绍分布式锁的概念和作用,以及常见的分布式锁实现技术和工具。分布式锁是一种在分布式系统中实现互斥访问的技术,它可以保证在同一时间只有一个客户端能够访问共享资源。常见的分布式锁实现技术包括基于数据库的分布式锁、基于 Redis 的分布式锁、基于 Zookeeper 的分布式锁等。
- 分布式锁的原理:
- 答案:介绍分布式锁的原理,包括如何实现互斥访问、如何避免死锁、如何保证锁的可靠性等。分布式锁通常通过在共享资源上设置一个标志位来实现互斥访问,客户端在获取锁时需要检查标志位是否为空闲状态,如果是,则设置标志位为占用状态,并获取锁;在释放锁时,需要将标志位设置为空闲状态。为了避免死锁,可以设置锁的超时时间,当客户端在一定时间内没有释放锁时,自动释放锁。为了保证锁的可靠性,可以使用分布式事务或者共识算法来保证多个客户端对锁的操作的一致性。
- redis 实现分布式锁有什么问题:
- 答案:Redis 实现分布式锁可能存在一些问题,如单点故障、锁过期时间设置不当、Redis 命令执行失败等。单点故障可以通过使用 Redis 集群或者主从复制来解决;锁过期时间设置不当可能导致锁提前释放或者无法释放,可以根据实际情况合理设置锁的过期时间;Redis 命令执行失败可能导致锁的状态不一致,可以使用 Lua 脚本或者事务来保证 Redis 命令的原子性。
- 怎么知道锁多久释放或者说用户会用多久呢:
- 答案:可以通过设置锁的过期时间来控制锁的释放时间。在获取锁时,可以设置一个合理的过期时间,当锁在一定时间内没有被释放时,自动释放锁。同时,可以在客户端记录获取锁的时间和使用锁的时间,以便在需要时进行统计和分析。
- redis 里的 timelocklock?(我也不知道问的是啥):
- 答案:不太清楚具体问题,可以询问面试官问题的具体含义,然后根据问题进行回答。可能是关于 Redis 中的定时锁或者其他与时间相关的锁机制。
- zset 底层结构:
- 答案:Redis 的 zset(有序集合)底层结构是一个跳跃表(skiplist)和一个字典(dict)。跳跃表用于实现有序集合的快速插入、删除和查找操作,字典用于存储元素的值和分数。跳跃表是一种随机化的数据结构,它可以在 O (log n) 的时间复杂度内进行插入、删除和查找操作。
- tcp 为啥三次握手,四次挥手:
- 答案:TCP 三次握手是为了建立可靠的连接。第一次握手是客户端向服务器发送一个 SYN 报文,表示客户端想要建立连接;第二次握手是服务器收到 SYN 报文后,向客户端发送一个 SYN+ACK 报文,表示服务器同意建立连接,并向客户端确认;第三次握手是客户端收到 SYN+ACK 报文后,向服务器发送一个 ACK 报文,表示客户端确认建立连接。TCP 四次挥手是为了关闭连接。第一次挥手是客户端向服务器发送一个 FIN 报文,表示客户端想要关闭连接;第二次挥手是服务器收到 FIN 报文后,向客户端发送一个 ACK 报文,表示服务器确认收到关闭请求;第三次挥手是服务器向客户端发送一个 FIN 报文,表示服务器也想要关闭连接;第四次挥手是客户端收到 FIN 报文后,向服务器发送一个
本文转载自: https://blog.csdn.net/m0_57836225/article/details/142237294
版权归原作者 阿贾克斯的黎明 所有, 如有侵权,请联系我们删除。
版权归原作者 阿贾克斯的黎明 所有, 如有侵权,请联系我们删除。