距离上一篇博文有一个月之久了,距离上次编写代码也有一周之久了,由于疫情的全面放开,加上福建省教育厅通知的提前返乡,反而让我感到有些不适。往常这个时间点我忙于期末考试,会把代码的事情放一边,等到彻底放假后,开始闭关潜心学习。然而剩余的半个月变成了线上形式,课还是要上,考试还是要考,虽说身在家乡,但心不在焉的 😂。
12 月已过半,也是时候该写年终总结了。迄今为止,我已学习了 3 年半的编程。(还好不是两年半),当下的技术不再是当初只会易语言的小伙了。只是当下已没有当初如此强烈的热情与精力了,我称之为老了。
现在回头回顾学习编程时间,用一个成语对自己做个评价——差强人意。在这些时间段,我其实荒废过一段时间,厌倦过,贪玩过,荒废过,从我的 Github 热力图 中其实就能看得出来。就导致欠下技术的,都需要后续花时间去弥补。
要让自己保持每天都处于学习状态真的太难了 😩,生活总有源源不断的琐事打扰着你。在忙碌的时候总是感觉时间不够用,哪怕有时一天花费了数十个小时,也总感觉做的事情太少了;哪怕每天计划都规划得好好的,但总是有一半还未完成。生活中大量的碎片化时间,而编程学习最不需要的就是这些碎片化时间。
回顾整个编程生涯有太多可感慨的,整个旅途几乎是一个人走完的,期间遇到的坎坷就 只得依靠搜索引擎来解决,搜索引擎是我再生父母都不为过。没有人给我指引明确的道路,只依靠心中对技术的憧憬不断前行。走过低谷,登过山峰,而如今站稳身子就足矣。
感叹的话语也就是说到这。今年主要总结我为何从逆向转 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 年】。这不是危言耸听,目前国家对网络安全以及非法数据获取的打击力度,也将决定了这些案件将会越来越多,爬虫逆向也将会越来越邢。