知识屋:更实用的电脑技术知识网站
所在位置:首页 > 教育

信息安全想走逆向工程,想请教学习的顺序?

发表时间:2022-03-25来源:网络

学技术难的地方其实并不在于理论知识


而是在于动手实践


很多初学者搞不清楚重点,往往忽略了实战的重要性,导致学了很久,水平还是没法提升


比如,做安卓逆向分析,这个就得来结合具体情况分析问题


Java层分析

壳的入口是 MyWrapperProxyApplication,继承了父类 WrapperProxyApplication,并且实现了父类中的方法 initProxyApplication。



我们找到父类WrapperProxyApplication,首先找到最先执行的 attachBaseContext 方法。



可以看到首先获得了 basContext,这个 baseContext 变量会在后面 so 层中获取,进行 attach 新的 DelegateApplication。然后是给 shellApp 赋值,在调用 initProxyApplication,就是上面图中 MyWrapperProxyApplication 中实现的 initProxyApplication,可以看到

是为了获取 libshell-super.2019 的 so 文件路径进行 System.load 加载。到这里,我们Java层的分析就差不多了,下面进入SO层分析。


2.SO层分析

2.1 总叙

一般的话是先分析.init_array节区,再分析JNI_OnLoad。在这里我们先分析.init_array节区里的函数,如图所示:



从中我们可以看到有很多函数,那么我们就要考虑这些函数都做了什么事了。

同时我们可以看一下字符串有没有被处理,如果被处理的话,那么此部分极可能是做一些初始化工作和解密一些东西。

字符串窗口如图所示:



可以看出有一部分字符串是解密状态的,在这里我们可以用一下 elf-dump-fix 工具来dump出字符串被解密的so,然后分析。


如果你对安卓逆向感兴趣,并且想要深入学习这方面,就一定要坚持动手,这样你的水平才能够快速提高


我自己做了10年的逆向,感兴趣的小伙伴可以来找我交流





//获取所有赢法Gobang.prototype.computedWins = function(){/*直线赢法以15列为准*/for (var x = 0; x < this.col; x++) { //纵向所有赢法for (var y = 0; y < this.col-4; y ++) {this.winsCount ++;/*如:1.组成的第一种赢法[0,0][0,1][0,2][0,3][0,4]2.组成的第二种赢法[0,1][0,2][0,3][0,4][0,5]以此类推一列最多也就11种赢法, 所有纵向x有15列 每列最多11种, 所有纵向总共15 * 11种*///以下for循环给每种赢法的位置信息储存起来for (var k = 0; k < 5; k ++) {this.wins[x][y+k][this.winsCount] = true;/*位置信息第一种赢法的时候:this.wins = [[[1:true],[1:true],[1:true],[1:true],[1:true]],[......]]虽然这是一个三维数组, 我们把它拆分下就好理解了相当于 this.wins[0][0][1], this.wins[0][1][1], this.wins[0][2][1], this.wins[0][3][1], this.wins[0][4][1]因为对象可以这样取值:var obj = {a: 10,b: 'demo'}obj['a'] === obj.a所有也就相当于 this.wins[0][0].1, this.wins[0][1].1, this.wins[0][2].1, this.wins[0][3].1, this.wins[0][4].1虽然数组不能这么取值,可以这么理解所以 this.wins[0][0].1 就可以理解为 在 x=0, y=0, 上有第一种赢法this.wins[0][1].1 就可以理解为 在 x=0, y=1, 上有第一种赢法......以上this.wins[0][0],this.wins[0][1]...可以看作是 this.wins[x][y]所以第一种赢法的坐标就是: [0,0] [0,1] [0,2] [0,3] [0,4]*/}}}for (var y = 0; y < this.col; y++) { //横向所有赢法, 同纵向赢法一样,也是15 * 11种for (var x = 0; x < this.col-4; x ++) {this.winsCount ++;for (var k = 0; k < 5; k ++) {this.wins[x+k][y][this.winsCount] = true;}}}/*交叉赢法*/for (var x = 0; x < this.col-4; x++) { // 左 -> 右 开始的所有交叉赢法 总共11 * 11种for (var y = 0; y < this.col-4; y ++) {this.winsCount ++;/*如:1. [0,0][1,1][2,2][3,3][4,4]2. [0,1][1,2][2,3][3,4][4,5]3. [0,2][1,3][2,4][3,5][4,6]...[1,0][2,1][3,2][4,3][5,5]相当于从左至右 一列列计算过去*/for (var k = 0; k < 5; k ++) {this.wins[x+k][y+k][this.winsCount] = true;}}}for (var x = this.col-1; x >= 4; x --) { //右 -> 左 开始的所有交叉赢法 总共11 * 11种for (var y = 0; y < this.col-4; y ++) {this.winsCount ++;for (var k = 0; k < 5; k ++) {this.wins[x-k][y+k][this.winsCount] = true;}}}}//落子实现Gobang.prototype.dorpChess = function(){var that = this;this.canvas.addEventListener('click', function(e) {// 判断是否结束if (that.over) return;var x = Math.floor((e.offsetX)/30),y = Math.floor((e.offsetY)/30);//判断该棋子是否已存在if (that.allChesses[x][y]) return;// 检查落子情况that.checkChess(x, y)if (!that.over) {that.player = false;that.computerDropChess()}})}// 计算机落子Gobang.prototype.computerDropChess = function(){var myScore = [], //玩家比分computerScore = [], // 电脑比分maxScore = 0; //最大比分

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜