上一篇 《教我兄弟学Android逆向09 IDA动态破解登陆验证》我带你分析了黑宝宝.apk,并且用IDA动态调试破解了登陆验证 看上节课你学习的不错 这节课给你带来的是过反调试的教程
在进入本节课之前我先问你一个问题 
什么是反调试?
答:反调试技术是为了保护自己程序的代码。增加逆向分析的难度 防止程序被破解, 针对动态分析。
要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学!    --致选择
分析环境:JEB2.2.7+IDA7.0  测试手机:nexus
IDA7.0下载链接
链接:https://pan.baidu.com/s/1xEtjnTVZFuLiMpHKwMOY2Q 密码:g3v9
前言
测试一:首先拿到反调试挑战.apk 安装后直接运行,这里因为我没有动态调试程序,所以弹出框恭喜你,挑战成功!
测试二:用第9课讲的调试方法 先运行程序等程序弹框后再挂起IDA调试 发现IDA直接退出 猜测程序做了反调试。
一 用jeb反编译反调试挑战.apk
1打开Manifest查看android:debuggable="true" 说明此程序是可以被动态调试的。
2找到程序入口MainActivity 分析可知程序运行的时候调用了myJNI类中的Native函数checkport并弹框 所以checkport是弹框的内容 看函数名可知里面也有可能做了反调试
3分析代码可知程序弹框后说明checkport函数已经执行完了,但是IDA挂起来后程序还是退出,说明还是被反调试了 猜想有两种情况:
猜想一: checkport函数中开启了一个线程循环来做反调试 就算函数执行完 这个线程中的反调试还是运行的 (如果不开启线程 循环检测反调试程序主线程将会堵塞 )
猜想二: 我们知道init_array和JNI_OnLoad会在so加载的时候就开始执行,所以程序也有可能会在这里开启线程进行反调试。
4.带着上面的猜想 我们下面来分析下so
二 验证猜想一
IDA分析so
解压反调试挑战.apk进入lib文件夹下找到libsix.so并用ida打开  由于我手机支持v7所以这里我打开的是armeabi-v7a下的so
注意:这里一定要打开手机对应的so 如果手机是arm的就打开armeabi文件夹下的so,支持v7则打开armeabi-v7a下的so 同理x86的要打开x86文件夹下的so进行分析  这里很重要 不然会和动态调试的内存地址不对应
1.我们先来找到 checkport函数 看看代码里面到底有什么 按照以前教程中找Native函数的方法 我们打开函数导出表发现并没有checkport函数 在String窗口搜索恭喜你,挑战成功!也是搜索不到的说明此字符串被隐藏了  但是发现了JNI_OnLoad函数 说明函数checkport是动态注册的。

2 怎么在IDA里面找到动态注册的函数呢?Ctrl+s打开segment表  找到.data.rel.ro.local  这个段里面放的是动态注册的函数 点进去后就找到Checkport函数了 函数的定义在dword_1140中

3点进dword_1140发现这部分代码IDA没有解析好  这里需要手动解析一下 点住dword_1140右键Data转化成数据 然后鼠标放在__unwind按住P键就转换成函数了 这个函数就是checkport对应的函数
4.分析checkport函数 F5转换成C伪代码 导入Jni.h (不会导入的看前面的课程) 然后手动解析代码 提高代码可读性 解析完成后Esc返回到C代码 再按下F5刷新一下代码 解析的字符串就出来了
5 通过以上操作可以看到 恭喜你,挑战成功字符串已经被我们解析出来了 接下来分析这个函数 这个函数会 读取/proc/net/tcp,查找23946端口,也就是IDA动态调试的端口 如果查找到了说明程序正在被动态调试 然后退出程序 从而达到了反调试的目的。
但是这里我们看到这个函数的反调试并没有放到线程中做 说明只执行一次就结束了  而且测试一验证的时候这里的代码已经执行完了  所以其他地方一定还有反调试 并且只能在这个函数之前执行。

三 验证猜想二
init_array段
init_array段是在so加载的时候执行的 执行顺序要优先于 JNI_OnLoad  所以这里是最早被执行的函数 把反调试和so的解密放到这里是比较好的选择。
1 ctrl+s打开segment表找到.init_array段点进去 发现init_array段里面有一个thread_create函数 点进去F5转换成C伪代码 并分析函数
2.我们打开命令行窗口来验证一下 查看当前程序的status文件  ps命令用来列出系统中当前运行的那些进程
3.通过上面分析可知thread_create函数是创建线程循环读取当前程序的Tracepid的值 如果值大于0说明程序当前正在被动态调试并退出程序 那么现在就知道为什么在程序弹出恭喜你,挑战成功框后我们进行动态调试 程序还是会退出了 因为这里开启了一个线程进行循环反调试。
4.那么到这里程序的反调试是不是就找完了呢?刚刚我们也说了除了init_array还有一个地方JNI_OnLoad函数也会在so刚加载的时候运行 那么出于习惯 我们还是来看一下JNI_OnLoad函数
四 JNI_OnLoad函数
1.在函数窗口中搜索并找到JNI_OnLoad函数 F5反编译成C伪代码(有点时候导出表里面是没有JNI_OnLoad函数的 所以这里在函数窗口中搜索) 


2.经过上面分析知道 JNI_OnLoad函数中调用SearchObjProcess函数进行反调试  这个函数通过ps列出当前手机的所有进程 然后如果进程名中包含android_server,gdbserver,gdb等名称 则认为程序当前被动态调试 退出程序
五 小结
1.首先我们通过JEB工具静态分析了反调试挑战.apk 发现在MainActivity类中调用了Native函数checkprot 因为这个函数是动态注册的 所以我们在data.rel.ro.local段中找到了这个函数 分析知道这个函数会读取/proc/net/tcp,查找23946端口 如果找到则认为程序当前被动态调试 退出程序
2 在init_array段里面发现了thread_create函数 这个函数创建了一个线程循环来读取/proc/pid/status文件下的TracePid的值 如果大于0说明程序正在被调试 退出程序
3.JNI_OnLoad函数中发现了SearchObjProcess函数通过搜索指定进程名来判断程序有没有被调试
六 解决方案一
1.对于checkprot我们可以通过-p将IDA调试端口改为23947或者其他端口 注意端口转发和IDA调试的端口号都要改成23947

2.对于thread_create函数我们可以刷机改内核让TracePid的值永远为0 
参考文章  逆向修改内核,绕过TracerPID反调试 
3.对抗SearchObjProcess函数可以将android_server改成其他名字然后运行 比如zs ls ww(张三,李四,王5)
参考文章《教我兄弟学Android逆向番外03 Android逆向必会命令 
七 解决方案二 
1.也可以通过exit函数定位到反调试位置并patch掉当前函数 这里以thread_create函数为例子 因为此函数在init_array段里面 所以是没有调用的地方的 这里直接把第二条指令改成pop直接出栈   改Hex指令这里我就不为你演示了 前面教程都有教过

2.对于SearchObjProcess函数 直接找到调用此函数的位置 然后nop掉 或者进函数里面把exit给nop掉都行  最后一处反调试这里也不演示了 方法相同
八 另一种patch方法 
以前我们都是用IDA插件modifyfile.plw来patch 其实还有一种patch的方法 直接用IDA Patch Program插件来Patch也是可以的 点菜单Edit->Patch Program

最后将patch后的so替换原包的so 重打包签名 运行 即可过反调试 
九总结
本节课我带你用JEB+IDA工具静态分析了反调试APK 通过本节课的学习 你了解了init_array段和JNI_OnLoad函数的执行顺序和这三处反调试的找寻方法  对于反调试 当然也可以通过搜寻特征的方式定位位置 比如TracePid反调试可以在字符串窗口搜索/proc/%d/status 检测进程名可以搜索android_server  检测端口号搜索5D8A 然后我又带你重温了一遍函数Patch的方法 以及第二种保存修改so的方法 通过本节课我想你对反调试技术已经有了初步的了解 教程附件里面前人总结出来的反调试大全 你可以看一看并且学习一下。学习完之后 下节课我将会对你讲解怎么动态调试这个apk。
十 课后作业
1.按照本节课教程把附件里面的反调试.apk so里面的反调试函数给patch掉 并重打包。
2.了解并熟悉附件里面常见的反调试 

附件下载链接:https://www.52pojie.cn/thread-749955-1-1.html

《教我兄弟学Android逆向10 静态分析反调试apk》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. vue html引入资源dev下404,webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)...
  2. Python Number(数字)
  3. 回头再学Asp.net系列--基础篇(六)
  4. crawler_爬虫开发的曲线图
  5. mysql如何和qt连接使用_Qt5学习:连接MySQL数据库
  6. 安卓BLE开发教程(一) BLE基础
  7. Response.Redirect 产生的“正在中止线程”错误
  8. Win + Appium + Android/IOS + Python环境搭建
  9. C#之xml配置文件读写
  10. 机器学习基础算法32-隐马尔科夫模型HMM
  11. pyqt5 实现右键自定义_Python界面(GUI)编程PyQt5事件和信号
  12. 可视化_数据可视化—地图可视化
  13. Zotero——论文管理神器
  14. 谷歌浏览器屏蔽广告插件
  15. MySQL定时任务,清理表数据
  16. C语言实现英文句子单词提取并分离
  17. 笔记本电脑换新硬盘重装系统经验
  18. [转]Cortex-a8 arm11 arm9 xscale powerpc 嵌入式处理器实测性能
  19. HTML,CSS,JS
  20. 小程序中image标签的mode属性,防止图片调整宽高而导致拉伸的问题

热门文章

  1. android seetaface6_中科视拓宣布开源SeetaFace6人脸识别算法(附相关课程)
  2. Linux 性能优化之 IO 子系统
  3. 拼多多电商服务销售催单话术大全
  4. 免费天气api 高速稳定的天气API接口 2019年4月测试稳定OK
  5. python检测微信好友是否删除_基于Python+adb实现微信是否好友检测
  6. 混合云是实现业务敏捷性的关键
  7. GAMS与MATLAB的数据交互
  8. java实现汉字转拼音
  9. png批量转换为jpg,一键快速处理
  10. 学生资质领取阿里云7个月免费服务器,飞天加速3.0-高校计划