距离上一篇博文有一个月之久,距离上次编写代码也有一周之久,由于疫情封控全面放开,加上福建省教育厅通知的提前返乡,反而让我感到有些不适。往常这个时间点我忙于期末考试,会把代码的事情放一边,等到彻底放假后,开始闭关潜心学习。然而剩余的半个月变成了线上形式,课还是要上,考试还是要考,虽说身在家乡,但心不在焉的。
12 月已过半,也是时候该写年终总结了。迄今为止,我已学习了 3 年半的编程(还好不是两年半)。当下的技术不再是当初只会易语言的小伙了。只是当下已没有当初如此强烈的热情与精力了,我称之为老了。
今年主要总结我为何从逆向转 Web 开发,并明确我未来所要走的方向,也是本文的主题。仅作为个人感悟,不作为建议参考。
为什么要写年终总结?
我从高中开始,每年都会记录这一年所发生的比较有印象的事情并写下自己的感悟。所以写年终算是个人习惯,并且我希望能够一直坚持下去,写到不能写为止。
写年终总结是个非常好的自我总结与反思的方式,总结这一年自身的变化,有哪些精彩与满足,有哪些遗憾和不足。同时定制明年的规划,以该目标不断前行,而不是漫无目的地活着,就失去了很多人生的意义。
同时也算是自我评价与建议,很多时候我们会收到很多别人有关自己的评价与建议,可人总会对他人有莫名的排斥感,就难以虚心听从他人的建议,从而犯错许多(说的是我就对了)。年终总结还有个作用就是弥补自己对某件事情未来可能要发生的情况,要如何做到不犯错,预先有个明确的预防意识。
即便可能要花数天的周期去回顾与总结,我也很愿意去总结,我常说回顾过去,就是在仰望未来。写年终所做的也就是这个过程。
写年终总结也算是种分享,分享自己的开发经历,当他人阅读时或许有所启发。
过去的,就过去了,别将当下的遗憾留到未来,这就是年终的最大意义。
为什么是 Web 开发?而不是逆向
今年大部分的开发时间都花在 Web 开发上,在此期间也接触到许多技术,并通过博客笔记的方式记录下来。
我很庆幸我的 Web 开发从一个 Beginner 到 Intermediate,现在回忆整个学习路程,一路学得都很野很随意,从未系统学习过,总是学到一半,就自认为已经掌握了,便开始进行实战项目,可以说很多知识都是在实战探索中了解的。
虽然很多人都直称我为大佬,但我离 Advanced 还有一大段的路途要走,而这段路途是无比的艰难与漫长。不过好在路不歪,只要肯走终会到达终点。
而带我入门的逆向技术,在今年没有丝毫的长进,说得过分点,就是弃坑了。也正如标题所说,至于缘由,细看下文。
逆向
熟悉我的人应该知道我之前是做爬虫与逆向分析,但是为何今年的技术栈彻底转型到 Web 开发上。
我常常和别人说起我的技术栈转型(从逆向转到开发),不过比较多的都会比较好奇我为什么不继续深造下去。
在此我也回顾了我从逆向转变到 Web 开发的过程,顺带也回答这个问题。不过在这里先说说我个人对逆向的看法:
逆向需要的技术知识面比较广。
就我接触逆向的过程来说,接触了易语言,JavaScript,Python,Java,Php 等等编程语言。
使用过了一堆的逆向工具,如 Frida、IDA、JEB、jadx 等等(我目前能想到比较有名的)。此外还有一堆知识,包括但不限于以下技术:自动化脚本、TCP/HTTP 协议、抓包、爬虫、加密学、图像识别(验证码、滑块位置)、汇编、反编译、AST 反混淆。
**要我说我在逆向中学到的不是如何使用这些工具或掌握某个技能,而是锻炼出一定的阅读与分析代码能力。**工具与技能总是瞬息万变,但阅读与分析代码能力却是实实在在,一成不变的,也是逆向中最值得学习的。
有接触过 CTF 想必再熟悉不过逆向工程的技术面广了。
越来越多的网站或应用程序不断加强安全防护,未来只会越来越难逆向。
逆向分析,说白话就是去看别人的代码,进行一些修改手段,达到自己想要的目的。比如修改某个软件的标题或作者信息、将别人的代码“偷”过来用、爬取某些网站或软件的数据。
但是随着现在越来越多潜在的安全问题,很多框架底层,服务厂商,都会对一些可能有安全问题的代码进行警告或者底层处理。比如使用 ORM 框架能够有效防止 SQL 注入,前端框架中涉及 XSS 攻击也会有相应的错误提示与处理,再如浏览器跨域以及跨站点 cookie 不共享,都是为了用户的安全而去考虑的。这样的例子有太多了。
简单说说安卓逆向的过程:拿到一个 Apk,发现有加壳(给代码加固让逆向者不易于看到源代码),这时候就需要通过脱壳才能查看到源代码;此时就算脱完了壳,接下来可能将面对经过混淆过的代码,这份代码难以用人眼去阅读,不调试运行,单靠静态分析很难分析出东西,这时候可能就要借助 AST 对代码进行还原;还原完了配合动静分析将代码给扣出来,而在分析的时候可能又有各种检测,比如抓包,反调试以阻碍逆向进度;最后就算逆向工作都做完了,代码也扣下来了,还要尝试运行扣完的代码,这时候极大可能还不一定能运行,然后又要回头看看到底那一步做错了。
可以说逆向的工作就是不断地调试,不断分析,最终拿到想要的结果。整个过程可以说非常耗时且折磨人,心智如果不够强大,真的容易劝退(我当下耐心也早不如当初了)。但是得到最终的目的,将非常爽,成就感爆棚,相当于一个解了几小时的题,最终被攻克的感觉。
前阵子在逆向圈中,看到过一张图,大致也把我的逆向学习流程也表达了出来,最终我的逆向学习也确实止步在 Flutter 上。
上面所说到的逆向技术中,例如加壳,代码混淆,反调试,风控等等,都是阻碍逆向手段。同样对于爬虫而已,通常会采取反爬措施,包括但不限于封 IP、封账号、JS 参数加密、代码混淆、浏览器指纹、TLS 指纹、验证等。而且防护手段可以说是越来越多,逆向的难度也就越来越大。并且在服务开发那边只需要修改一点东西,逆向可能就需要从头再来一遍。
未来逆向的难度只增不减,但薪资可不一定保证这趋势。
风险
从上面也不难看出逆向常常与安全挂钩,如果一个网站或软件不是那么好被逆向,那么间接说明安全性是比较高的。可一旦涉及到安全,同时又是互联网,就免不了网络安全与法律相关的风险。
在大多数逆向的对象(网站,软件)中,多数都是他人的劳动产物,当你未经他人允许的情况下,去爬取他人的数据,或是修改一些版权信息再次发布出来,就属于非法行为。本质和未经他人允许,偷人家的东西性质是一个样的。并且在有防护措施的情况下,绕过网站防护措施获取数据属于违背权利人意愿读取、收集数据,将有较大可能被认定为对计算机信息系统的 “侵入”。
要知道在逆向的行业中,有很多都是擦边灰产,至少我所在的逆向圈是这样的,抱着【仅供学习为参考,请勿用于非法用途】的想法做逆向工程。路子极易走歪,很少能够正常去走安全岗位的。相信你应该能看到许多类似的案件,如【某某程序员因非法侵入 xx 网站,获刑 x 年】。这不是危言耸听,目前国家对网络安全以及非法数据获取的打击力度,也将决定了这些案件将会越来越多,爬虫逆向也将会越来越邢。
自身因素
简单介绍完我认为爬虫和逆向的看法后,再来说说自身因素。
更想写代码,而不是看代码
我是很享受写代码的过程,一份高质量的代码会让人赏心悦目。我为此特意学习下设计模式、重构技巧以及 TDD 测试。这些在逆向中基本难以涉及,但是这些对开发的体验和代码的健壮性都是非常重要的,也是让我个人觉得技术有所提升的技能点。
在逆向分析中,大部分时间都不是在写代码而是在看(分析)代码,而反编译出来的代码,很有可能是带有混淆过的代码,而你想要分析这一块代码的作用,只能去一步步调试,将代码啃下来,从而推断运行时某变量的值,或是某个函数的作用。
虽然说开发岗位中,有很多情况下也是在看代码的日子中度过的,但相比反编译阅读代码而言,至少不至于那么晦涩难懂。
更想碰新技术,而不是旧技术
其次,在逆向分析中,遇到的网站或软件所用的技术一般都是较为稳定成熟的技术,而这些技术往往不是很新,因此需要去了解很多旧的技术,但这些旧技术仅仅只对逆向分析有用,甚至过段时间很有可能就会遗忘。并且要了解的旧技术还不少,学得将会特别杂。
而我又是一个喜新厌旧的人,对任何新鲜事物都抱有好奇尝试的态度。我终将认为旧的技术被淘汰是迟早的问题,新技术的出现肯定不是无缘无故的出现,必然是为了解决某些问题而诞生的,如性能,开发体验,安全等等。
这里有篇我对新技术的看法,推荐阅读一番。
更想开源,而不是闭源
在逆向开发,不,是在灰产开发中,有很多代码是别指望开源出来的,这背后会涉及到商业利益或是版权等问题。一旦代码放出来,将意味着你的代码将有很大的可能被别人利用做坏事,最终甚至祸及到自己。所以大多数情况下,你多半只能将自己的应用发布出去,而不是将源码开源,通常也就带有商业化的性质。
我想任何开发者肯定是希望自己的代码走的更远,走的正规,而不是被拿来做违背自身意愿的事情。
开源不仅能为自己提升一些技术知名度,展现自身技术的一面,同 时代码被他人使用与认可,这番成就感就足够继续坚持开源下去。因为我有很多技术都是通过开源项目中学到的,所以我能感受到开源带来的魅力,也是对于前人的崇拜,想走开源的原因。
因为淋过雨,所以很想为别人撑把伞
小结
其实在今年出头我还特意复习了一波安卓逆向,为了更深入了解了更底层的知识与工具(当然现在忘得也差不多了),因一些特殊原因我的电子设备不在了,别问,问就是坏了到现在还没修好。就导致我的编程语言环境,逆向工具,虚拟机配置,代码等数据直接灰飞烟灭,也让我停滞了 1 个月的学习。
我想这才是我从逆向转 Web 开发的最重要的理由了。
逆向的学习对我开发有很大的帮助。例如开发中的安全问题,我在开发中都会时刻考虑去考虑该问题。如加壳、SQL 注入、代码混淆、接口限流、接口幂等性(Fiddle R 包)等等安全性问题。
我庆幸我学过逆向,让我学到很多在开发中比较难学到的技能,如调试,阅读源码,而这些也是绝大多数 Web 开发者都欠缺的能力。
逆向应该就暂以告终,未来会有很长的一段时间,甚至以后不再接触深入专研逆向。
每当回想,【当时那么难的加密算法都能搞得定,开发一个功能还能有多难】,保持着这种心态,也让我保持着开发。
也是逆向激起我对编程的兴趣,可以说没有接触逆向开发,我也不太可能会接触到 Web 开发。