资讯动态

网易移动安全工程师笔试复盘:逆向、汇编与密码学考点全解析

发布时间:2026/8/29 17:28:24 来源:尧图企业网站定制
前阵子整理简历和面试题素材翻到了网易2020校招移动安全工程师提前批的笔试记录。说实话当年这道笔试题给我的第一感觉是杂而不浅四十分钟做完考的全是基本功没有一道送分题。现在回头看这套题其实把那几年移动安全岗位最核心的能力模型画得很清楚Android逆向、ARM汇编、密码学常识、系统机制理解外加一点开放性的对抗思路。如果你正在准备移动安全方向的校招或者刚入行想系统梳理自己的技能树这篇内容应该能帮你少走不少弯路。先说结论移动安全工程师的笔试本质不是在考你会不会用某个工具而是在考察你有没有一套完整的分析思维框架。工具可以现学框架不行。1. 岗位画像与笔试整体定位1.1 移动安全工程师到底在做什么很多同学对移动安全岗位的理解停留在脱壳和破解App上这个认知偏差会直接导致笔试准备方向的错误。网易移动安全工程师的日常工作大致可以分成四块应用安全SDK安全、代码防护、反调试、系统安全ROM安全、设备指纹、风控对抗、数据安全加密方案设计、密钥管理、以及安全体系建设漏洞挖掘、应急响应、安全测试。笔试题目会围绕这四块展开但不会直接问你如何做应用安全而是用具体的题目来测你的底层能力。比如给你一小段ARM汇编让你还原逻辑比如让你分析一个密码学方案的缺陷再比如给你一个业务场景让你设计防护策略。这些题目背后对应的是我上面说的那几个能力维度。这里就引出一个关键认知移动安全这个岗位不像后端开发那样主要考框架和API熟练度它更看重的是你对底层机制的理解深度。所以备考时与其刷各种工具的使用教程不如先把操作系统原理、汇编基础、密码学基础这三块地基打牢。1.2 网易这套笔试题的模块划分尽管每一年题目都有变化但网易移动安全工程师笔试的模块结构相对稳定大致分为四个部分模块考察方向典型题型难度系数二进制逆向ARM汇编基础、反调试识别、算法还原汇编阅读题、小段代码反推逻辑高Android系统机制组件安全、Binder通信、权限模型场景判断题、漏洞成因分析中高密码学应用加密算法选型、常见误区、协议设计方案分析题、算法计算题中开放性对抗防护体系设计、攻防思路设计题、防御方案优劣对比中从分值占比来看二进制逆向和系统机制大约占了六成是绝对的核心。密码学虽然占比不算最高但属于性价比极高的拿分项因为密码学考点相对固定准备好就能稳定得分。开放性对抗题则完全看平时的积累和思维习惯临时抱佛脚很难有质的提升。结合我自己的经验以及后来带新人的观察笔试分数高低和是否为科班出身关系不大更关键的是有没有在真实项目中做过分析。哪怕你在实验室里自己逆向过几个App面试官从你答题的细节里就能看出差别。2. 二进制逆向与ARM汇编基础2.1 为什么逆向是移动安全的基本功这一块是移动安全笔试的重头戏也是筛人最狠的地方。很多同学会问现在工具这么发达了有Ghidra有IDA有各种自动化分析框架为什么还要手撕汇编原因有两个。第一笔试现场没有条件让你慢慢拖IDA看反编译结果时间很紧你必须能快速读懂关键代码片段第二很多混淆和加固手段会让反编译结果失真但汇编指令是真实的真正分析对抗样本时最终还是要落到汇编层面去解决问题。我记得笔试题里有一道ARM汇编阅读题给了一段简单的函数汇编代码大概长这样MOV R0, #0 MOV R1, #0 MOV R2, #0 loop: LDRB R3, [R1, R0] CMP R3, #0 BEQ end ADD R0, R0, #1 ADD R2, R2, R3 B loop end: MOV R0, R2 BX LR这段代码的逻辑其实很简单循环遍历一个字符串把每个字符的ASCII码累加到R2里遇到0字符串结束符就退出最后把累加结果放到R0返回。也就是说这个函数实现的是一个字符串的逐字节累加和。这种题目本身不难但它背后考查的是几个基础点ARM的寄存器用法、LDRB这类访存指令的语义、CMP和条件跳转的组合逻辑、以及函数调用时返回值通过R0传递的约定。任何一个点没掌握可能都会在这道题上卡住。2.2 笔试里最常见的三类逆向题型根据我的经验网易笔试的逆向题大致有三类每一类需要不同的准备策略。第一类是汇编阅读题就是上面这种给一段汇编让你还原成高级语言逻辑。这种题目准备起来相对容易把ARM常用指令过一次特别是LDR/STR、LDRB/LDRH、CMP/B、PUSH/POP、BL/BX这几种再配合一两个例子练一下就够用了。第二类是反调试与混淆识别题。它不会真的给你一个加固样本让你脱壳而是给出一些代码特征让你识别这段代码在做什么。比如让你分析一个进程为什么会退出核心逻辑是什么。这需要你了解常见的反调试手段ptrace反调试、时间检测、文件特征检测、调试器端口检测等。笔试题目会把这些手段隐藏在一段描述或代码片段里你要能识别出来。第三类是算法还原题。这类最贴近实际工作通常会把一个App的核心加密算法比如MD5、AES、异或运算等做了一些变形或魔改然后让你还原算法逻辑或者反推某个输入。我记得有一道题是用一个自定义的异或算法对字符串加密让你根据加密后的结果反推出原始内容。这种题型的关键是理解加密流程找到操作的规律而不是死记硬背某个加密库的API。2.3 常用工具链的准备虽然笔试现场主要靠脑子但工具链的熟练度会影响你的日常训练效率。我建议校招的同学至少把下面这几个工具摸熟IDA Pro老牌王者F5反编译功能在分析混淆样本时会给你很大帮助但要记住核心逻辑判断仍需要回到汇编层面确认。Ghidra开源免费反编译能力不输IDA适合日常练习毕竟IDA正版价格不是学生党能轻松承受的。JEBAndroid逆向神器处理Dalvik字节码和APK结构非常方便尤其适合分析Java层逻辑。Frida动态插桩框架笔试虽然不直接考但面试大概率会问而且实际分析中Hook大法能省掉大量静态分析时间。objection基于Frida的运行时探索工具可以快速实现绕过root检测、SSL Pinning等操作。工具不在多在于用熟。每次分析样本时我都会给自己定一个流程先静态看一遍整体结构再用动态手段验证关键点最后回到关键代码处还原逻辑。这套流程练熟了笔试和面试都会很受益。3. Android系统安全机制与密码学考点3.1 四大组件安全与权限模型Android系统安全这一块笔试不会直接问Activity生命周期是什么而是把这些知识和安全结合起来考。最常考的是四大组件安全尤其是组件的导出问题。这里有一个核心概念Android组件默认情况下是不导出的只有显式声明了android:exportedtrue或者声明了intent-filter后系统会自动认定可导出。一个导出的组件如果处理外部输入时没有做权限校验或参数校验就可能被恶意App利用。笔试题常见的问法是给出一个AndroidManifest.xml片段让你分析这个应用存在什么安全风险。这类题目的标准分析路径是先看组件是否导出如果导出看是否有权限保护看导出组件是否处理了外部输入是否存在Intent数据注入看是否有敏感操作的触发点比如读取通讯录、发送短信、加载外部Dex等。除了组件安全权限模型也是高频考点。特别是Android 6.0之后的运行时权限机制和旧的安装时授权机制的区别以及Android 11上的一次性权限、自动重置权限等新特性都属于潜在的考点。但笔试通常不会问最新特性反而更关注基础原理权限是安装时授予还是运行时授予、不同权限级别的保护方式、普通权限和危险权限的划分标准等。3.2 密码学基础不只是记住算法还要会算密码学在移动安全笔试中的重要性经常被低估。很多同学觉得我会用AES加密就行但实际上笔试会考得很细甚至会让你做一些简单的计算推导。一个典型的考点是为什么ECB模式不安全这个知识点几乎每年都会出现。ECB模式最大的问题是同样的明文会产生同样的密文当明文存在规律性时密文会泄露明文的统计特征。比如加密一张图片如果使用ECB模式加密后的图片轮廓仍然清晰可见。这就是经典的ECB模式泄露企鹅图案问题。另一个高频考点是加密算法的组合使用。一个成熟的设计方案应该做到数据加密用对称加密如AES-GCM密钥传输用非对称加密如RSA或ECDH完整性校验用MAC或数字签名。笔试可能会给一个方案问你其中存在的问题比如密钥硬编码、使用弱随机数、加密模式选择不当、未对密文做完整性校验等等。再就是一些基础计算题。比如给你一个RSA例子让你计算公钥和私钥的关系或者给你一个Diffie-Hellman密钥交换的流程让你推导出共享密钥。这类题目的计算量不大但需要你把核心算法流程记清楚。3.3 真题视角一道典型的密码学思路题当时笔试有一道让我印象很深的题大致是一个App使用自定义的加密算法对用户输入的密码进行处理后存储算法逻辑是把密码每个字符的ASCII码加上一个固定偏移量再与一个固定的key做异或操作。问这个方案存在什么问题如何改进这题的考点其实很清楚自定义加密算法、固定偏移量、固定key三重致命伤。固定偏移量和固定key意味着任何人拿到一个样本就能提取出规律自定义算法意味着没有经过公开的密码学分析和安全性验证本质上只是混淆不是加密。改进方案也有标准答案使用标准加密算法如AES-GCM或ChaCha20-Poly1305做数据加密使用BCrypt、scrypt这类带盐的慢哈希算法做口令存储加盐值要随机且每个用户不同密钥不能硬编码在代码里要放到安全环境中比如Android Keystore或服务端。这类题考察的不只是密码学知识还有工程化思维你不仅要懂原理还要知道在实际项目中怎么做才是合理的。3.4 加密实践中的常见坑把密码学知识从理论搬到实践有几个坑是面试官特别爱问的硬编码密钥密钥写在Java代码里反编译一秒就能提取。正确的做法是使用NDK把密钥放到native层但这也仅仅是增加难度真正高安全需求要使用硬件级的Keystore或白盒密码方案。弱随机数使用Math.random()或未正确初始化的SecureRandom生成IV或盐值。IV重复使用会让AES-CBC等模式的安全性直接崩塌。不校验完整性只加密不认证导致攻击者篡改密文后无法被发现。AES-GCM将加密与MAC合二为一是推荐的默认选择。自定义哈希把MD5、SHA-1加盐循环几万次就当作安全哈希。实际上应该使用PBKDF2、bcrypt或scrypt这类专为口令存储设计的算法。这些坑在笔试里出现频率极高因为它们是真实业务中最常见的错误。面试官不指望你写一个密码学论文出来而是希望你能识别出这些问题并且知道正确做法。4. 安全防护与对抗思路题4.1 加固、混淆与反调试笔试怎么考移动安全工程师的笔试里通常会有一两道关于防护对抗的题目考察的是你对攻防双方思路的理解。这类题型不要求你现场逆向一个加固壳而是通过场景描述来考查你是否具备体系化的对抗思维。先说加固。加固的本质是让攻击者分析你的代码变得更困难常见的手段包括Dex整体加固后运行时脱壳加载、Dex拆分与动态加载、VMP类虚拟化保护等。笔试的常见问法是从一个App的发布流程出发让你指出哪些环节可能被攻击并提出防护建议。再说混淆。很多同学理解的混淆只是类名和方法名变成a、b、c但真正的混淆有三个层次名称混淆让语义信息丢失、控制流混淆让代码逻辑变乱、数据混淆对常量字符串、数字进行编码隐藏。笔试中经常会把一段混淆前后的代码给你做对比让你说明混淆的效果和不足。最后是反调试。这里的考点包括ptrace自身附加导致调试器无法附加、检测TracerPid、检测调试端口、时间检测、检测系统调试属性等。笔试可能会问为什么App启动时会崩溃而正常启动不会核心就在于环境检测。4.2 开放性对抗题的答法这类题目往往没有标准答案但面试官心里有一个期望的答题框架。我记得网易笔试有一道题是问支付类App如何防止交易数据被篡改你可以从以下几个角度展开回答请求层面使用HTTPS证书固定防止中间人攻击对关键参数做签名服务端验签确保参数未被篡改。客户端代码层面核心加密算法放在native层使用OLLVM混淆增加逆向难度对关键函数动态调试验证反调试对抗。风控层面采集设备指纹信息识别异常环境比如root/越狱设备、模拟器、Xposed/Frida框架等。服务端层面敏感操作二次校验对金额、商户号等关键字段做服务端比对不信任客户端上传的所有数据。密钥管理层面密钥放入安全环境如手机厂商的TEE/SE环境服务端动态下发防止客户端硬编码导致的大规模密钥泄露。答题的关键在于不能只讲防护手段还要说明每一层防护的绕过方式以及对应的对抗手段。你把它当成一个攻防博弈的过程来回答给面试官展示你的思路是立体的不是死记硬背的安全策略清单。4.3 从笔试到面试一道场景设计题的完整分析笔试里的设计题到面试环节通常会变成追问。比如题目问如何给一个App增加防调试能力笔试只需要答出思路面试则会连环追问那如果攻击者使用内存Patch绕过你的检测呢你如何对抗Frida的Hook你的方案会不会误杀正常用户我建议你在准备这类题时采用一种攻击树思维以攻击目标为根节点不断发散可能的攻击路径然后针对每条路径都思考防御手段。比如获取客户端密钥这个目标攻击路径可能包括逆向Java层代码、逆向native层代码、内存dump、Hook关键函数、hook系统调用、动态调试、动态注入、篡改APK重打包等等。每一条路径都有对应的防御手段比如Java层混淆、native层混淆、字符串加密、反调试、反Hook检测、签名校验等。这种思维模式需要平时积累临场很难想出完整的攻击树。所以平时分析App时建议多养成一个习惯每看到一个App的安全策略都主动想一下它的绕过方法。时间长了你的对抗思维会非常自然笔试和面试都能应对自如。5. 实操演练一道综合性逆向题的完整解题过程5.1 题目描述与初始分析这一节我拿一道当年笔试中的综合性题目完整走一遍解题流程。题目背景如下某App对外提供查询服务请求时需要携带一个加密参数加密算法为自定义的XOR Base64混合方式。现在已知加密后的参数值要求逆推出原始参数内容并说明整个分析过程。拿到这种题第一步不是急着看汇编或代码而是先理清楚流程密文是怎么产生的加密逻辑的输入、输出是什么题目给了哪些条件要求推导什么我当时会在草稿纸上把这几个要素列出来避免解题过程中走偏。5.2 静态分析定位核心算法第二步是静态分析。假设题目提供了一个完整的APK或者是一个native层的so文件需要在代码里定位加密函数。如果加密逻辑在Java层可以直接用JADX或JEB打开APK搜索关键字符串比如encrypt、base64、xor等快速定位到加密方法。然后阅读代码逻辑通常就是一个输入字符串经过某个循环做异或再经过Base64编码输出。如果加密逻辑在native层会稍微复杂一些。因为native层函数名一般会经过混淆或者用JNI动态注册直接搜索函数名可能会一无所获。这时候要从Java层的调用点入手找到native方法的声明再去so文件里搜索对应的导出函数或动态注册表。以这道题为例静态分析后发现加密逻辑在Java层核心代码大致如下public static String encrypt(String input) { byte[] bytes input.getBytes(); byte[] result new byte[bytes.length]; for (int i 0; i bytes.length; i) { result[i] (byte) (bytes[i] ^ 0x7F); } return Base64.encodeToString(result); }核心逻辑就是每个字节和0x7F做异或然后Base64编码。分析到这里这道题的加密逻辑就已经很清晰了。5.3 动态Hook验证静态分析出来的逻辑最好用动态手段验证一下特别是当你面对的是混淆比较严重的真实样本时。用Frida可以很方便地Hook加密函数实时打印输入和输出Java.perform(function() { var clazz Java.use(com.example.security.CryptoUtil); clazz.encrypt.implementation function(input) { var result this.encrypt(input); console.log(encrypt input: input); console.log(encrypt output: result); return result; }; });如果Hook后打印的输入输出和静态分析预期一致那么说明我们对加密逻辑的判断是对的。如果不一致就需要回到静态分析重新检查是否存在其他调用路径或混淆控制流。笔试时虽然没有环境让你直接运行Frida但在平时练习中必须养成静态动态结合分析的习惯这在面试环节会非常加分。面试官问到分析流程时你能答出静态定位动态验证这个组合拳就已经超过大部分候选人了。5.4 写出解题脚本完成逆向推导既然知道了加密逻辑逆推原始参数就很简单了。先Base64解码再把每个字节和0x7F异或一遍异或操作的自反性确保了同一操作可以用于解密。import base64 def decrypt(encoded): decoded base64.b64decode(encoded) result bytes([b ^ 0x7F for b in decoded]) return result.decode(utf-8) # 假设密文为 ciphertext cGljdGZ7eG9yX2lzX2Z1bl8xMDBfYmFzZTY0fQ plaintext decrypt(ciphertext) print(plaintext)这段代码跑出来的结果就是一个字符串。整个过程并不复杂但完整覆盖了一个移动安全工程师分析加密算法时的标准路径识别输入输出、定位算法、还原逻辑、编写脚本。5.5 笔试时间分配与解题顺序网易的笔试题量通常不大但每道题都需要一定的时间投入。我建议的答题顺序是先做会做的、先拿稳拿的分。密码学和系统机制这类比较确定的题目先做再花时间啃逆向题最后留时间给开放性设计题。逆向题如果卡住了别死磕。第一遍先把能判断的选项写上去比如这题的加密类型是异或、编码是Base64先把结论写上再慢慢补充推导过程。阅卷时不是只看最终结果分析思路和关键步骤同样给分。当年我考试时有一些很偏的汇编指令细节也拿不准但整体思路写到卷面上最后成绩也不差。6. 笔试常被忽略的丢分点与避坑指南6.1 计算题最好写出推导过程网易移动安全笔试中有少量计算类题目比如RSA参数计算、AES模式分析等。我身边有不少同学在笔试时直接写答案省略了过程最后分数并不理想。技术类笔试的阅卷逻辑通常是答案对是对但过程分很关键。如果答案错了而你的推导过程是正确思路还能拿到大部分分数。反过来只写一个最终答案就算对了也可能丢失过程分。所以建议所有计算题都把关键计算步骤写清楚不要觉得啰嗦。另外计算题特别注意单位和小数精度。比如计算带宽、时间等场景题结果要记得带单位、保留合理精度这能体现工程师的基本素养。6.2 逆向题不一定只有唯一解有些逆向题的最终答案可能不是固定的特别是涉及到简化或优化逻辑的题目。比如给你一段代码问这段逻辑还可以怎么写这种题就没有唯一答案。我的建议是把你认为正确的结果写出来的同时附带上你的推导逻辑。能够把自己的分析路径清晰表达出来本身就是一种能力。面试官从中看到的不只是题目答案而是你遇到未知代码时的分析思路这个比答案本身更重要。6.3 开放性设计题不要只写思路要给出可落地的方案开放性设计题是很多同学的失分重灾区。常见的问题有两种一种是只写思路比如使用HTTPS加密、使用签名机制但完全没有具体方案细节另一种是堆砌安全术语什么防DDoS、WAF、态势感知但没有和题目场景结合起来。正确的答法应该是先理解业务场景识别核心威胁面然后按照攻击路径逐层设计防御措施每一层都落实到具体技术实现。比如答防数据篡改时不要只说做签名要说清楚签名字段有哪些、签名算法是什么、密钥怎么管理、服务端如何验证、验证失败如何处理。这样的答案才显得专业、有实操深度。6.4 笔试题答完之后的复盘思路不管笔试成绩如何复盘都是很重要的一环。我在整理网易这套题的时候发现很多题目之间存在隐性联系。比如逆向题里考的XOR加密在系统机制题里可能以硬编码密钥风险的形式出现在开放性设计题里又以如何设计安全的加密协议的形式出现。复习时建议你画一张自己的能力自查表把每道题背后对应的知识点写出来再标注自己掌握的程度。然后针对掌握不足的部分做专项训练。我当年用这个方式整理了差不多四十道真题最后上考场的时候心里特别有底因为所有题目背后的知识点都在我自己梳理过的能力模型里出现过。7. 写在最后笔试之后的路校招笔试只是移动安全这条路上的一个节点过了笔试后面还有面试、项目深挖、甚至实习期的实战考验。从我的经验来看能在这条路上走远的往往不是那些懂得最多工具的人而是懂得如何分析和思考问题的人。如果你正在准备移动安全方向的校招建议从现在开始每天抽出一点时间做三件事阅读汇编片段并还原逻辑、分析一个真实App的安全机制、把一个密码学方案的安全问题写清楚。这三件事对应了笔试的大部分考点也对应了实际工作中的基本能力要求。笔试不是终点真正的挑战是入职后面对的真实对抗。但好的开始是成功的一半把这些基本功打扎实后续的路会顺畅很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价