IDA来Patch android的so文件
在上文中,我们通过分析定位到sub_130C()这个函数有很大可能性是用来做反调试检测的,并且作者开了一个新的线程,并且用了一个while来不断执行sub_130C()这个函数,所以说我们每次手动的修改TracerPid实在是不现实。

既然如此我们何不把sub_130C()这个函数给nop掉呢?为了防止nop出错,我们先在”F5”界面选择所有代码,然后用”Copy to assembly”功能,就可以把c语言代码注释到汇编代码里。


在这里我们看到如果想要注释掉sub_130C()函数,只需要注释掉000016B8这个位置上的代码即可,如果我们想要注释掉dword_62B0(3)这个函数,我们则需要注释掉000016BC-000016C4这三个位置上的代码。接下来我们选中000016B8这一行,然后再点击HexView。HexView会帮我们自动定位到000016B8这个位置。

因为ARM是没有单独的NOP指令的。于是我们采用movs r0,r0作为NOP。对应的机器码为”00 00 A0 E1”。所以我们把”13 FF FF EB”这段内容修改为”00 00 A0 E1”。

我们再回”F5”界面,就会发现sub_130C()函数已经没有了。

最后我们点击”Edit->Plugins->modifyfile”,然后就可以保存新的so文件了。我们将这个so文件覆盖原apk中的so文件,然后再重新签名。

这次我们先运行程序,再用ida加载,app并没有闪退,说明我们patch成功了。于是我们先在”Java_com_yaotong_crackme_MainActivity_securityCheck”处下断点。然后在app随便输入一个密码,点击app上的”输入密码”按钮。

程序就会暂停在”Java_com_yaotong_crackme_MainActivity_securityCheck”处。我们先按”P”再按”F5”,就可以看到反汇编的c语言了。而这里的unk_4005228C就是保存了密码字符串指针的指针。

因为是指针的指针,所以我们先双击进入这个地址。

然后在这个地址上按三下”D”,将这里的数据格式从字符转化为指针形式。

然后我们再双击进入这个地址,就可以看到最后的flag了。答案是”aiyou,bucuoo”。

这道题里我们只是用到了很简单的patch so技巧,在实战中我们不光可以NOP,我们还可以改变条件判断语句,比如将”BNE”变为” BEQ”。我们甚至可以修改跳转地址,比如直接让程序B到某个地址去执行,这样的话就不需要挨个的NOP很多语句了。要注意的是,ARM中的跳转指令是根据相对地址计算的,所以你要根据当前指令地址和目标地址来计算出相对跳转的值。
比如说00001BCC: BEQ loc_1C28对应的汇编代码为”15 00 00 0A”。


0x0A代表BEQ,”15 00 00”代表跳转的相对地址,因为在arm中pc的值是当前指令的下两条(下一条的下一条)指令的地址,所以我们需要将0x15再加上2。随后就可以计算出最后跳转到的地址: (0x15 + 0x2)*4 + 0x1BCC = 0x1C28。Ida反汇编后的结果也验证了结果是BEQ loc_1C28。
接下来我们想修改汇编代码为00001BCC: BNE loc_1C2C。只需要将”0A”变成”1A”,将”15”变成”16”即可。


0x0A代表BEQ,”15 00 00”代表跳转的相对地址,因为在arm中pc的值是当前指令的下两条(下一条的下一条)指令的地址,所以我们需要将0x15再加上2。随后就可以计算出最后跳转到的地址: (0x15 + 0x2)*4 + 0x1BCC = 0x1C28。Ida反汇编后的结果也验证了结果是BEQ loc_1C28。
接下来我们想修改汇编代码为00001BCC: BNE loc_1C2C。只需要将”0A”变成”1A”,将”15”变成”16”即可。
IDA来Patch android的so文件的更多相关文章
- IDA动态调试Android的DEX文件
Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...
- Android so库文件的区节section修复代码分析
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78818917 一.Android so库文件的节表secion修复方案整理 1.简 ...
- 为什么 Android Studio 工程文件夹占用空间这么大?我们来给它减减肥
偶然中发现Android Studio的工程文件夹比ADT Bundle的大很多.用Android Studio新建一个空工程,工程文件夹大小为30M,运行一次后大小为40M.同样用ADT Bundl ...
- android 打开各种文件(setDataAndType)转:
android 打开各种文件(setDataAndType) 博客分类: android-->非界面 android 打开各种文件 setDataAndType action动作 转自:htt ...
- 如何查看Android的Keystore文件的SHA1值
像使用百度地图api时候,一般需要获取keystore的SHA1值,这里就手把手教大家如何查看Android的keystore文件中的SHA1值. 第一步: 打开cmd,切换到keystore所在的文 ...
- Android 项目中文件夹的说明与作用(转)
(转自:http://blog.csdn.net/goodshot/article/details/11529731) Android 项目中文件夹的作用 1. src:存放所有的*.java源程序. ...
- Android数据存储-文件操作
一.预备知识 1.Android中的MVC设计模式 MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型可以对于多种视图模型,比如一批统计 ...
- 34.Android之资源文件res里drawable学习
我们经常看到android工程资源文件res下drawable如ldpi.mdpi.hdpi.xhdpi.xxhdpi文件,今天我们学习了解下. (1)drawable-hdpi里面存放高分辨率的图片 ...
- android上传文件到服务器
package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...
随机推荐
- 如何用Ajax加载服务器的图片
用Ajax请求服务器的图片,并显示在浏览器中 前言 一直在数据库里面存的都是图片在服务器的地址,然后再到浏览器中显示,但是发现两个问题 第一:为了安全起见,js是无法读取本地的图片的,不然你写一个js ...
- jQuery对象和DOM对象的相关知识
所谓的DOM就是Document Object Model(文档对象模型)的缩写,或许是我水平低的缘故,感觉就是HTML的标记元素嘛,所以作者画了下面的图: 像这样的元素,就是所谓的DOM对象,获取值 ...
- C# 3DES加密
最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用. 这是对方(java)的加密算法,和网上流传的代码也差不多( ...
- webAPI 数组参数
今天终于解决了一个坑的问题. 写了一个接口,调试了好几天都没成功. 一直以为是我的错误,直到我们部门的大牛来告诉我不是我的错误,是前端传参数有问题. 应该是参数是数组参数的问题,可能不好拼接,才导致接 ...
- 使用NuGet打包并发布至ProGet过程 (打包再次详解)【下篇】
一.前言 上篇[1]主要介绍了利用csproj文件使用NuGet打包至ProGet的过程,并附上了用于在Jenkins上运行的python脚本.本篇的主要内容分为以下几点: 1. Nuspec与Nup ...
- Mssql中一些常用数据类型的说明和区别
Mssql中一些常用数据类型的说明和区别 1.bigint 占用8个字节的存储空间,取值范围在-2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,37 ...
- webstorage[html5的本地数据处理]
1.webStorage是什么? webStorage是html5中用于本地化存储的一种方式,而在之前呢我们是用cookie的存储方式处理; 2.那它们之间的区别是什么? Ⅰ.cookie存在的问题: ...
- 基于吉日嘎底层架构的通用权限管理Web端UI更新:参考DTcms后台界面
经一周的研究学习,看了国内的H+.HUI等,国外的PaperDashboardPro.Make.Metronic BootStrap等,最终选定用一个轻量的,适合中国人的,来自DTcms的后台管理UI ...
- Oracle 数据库基础学习 (四) group by的使用
group by分组查询 示例:要求查询出每个部门的编号,人数,以及最高和最低工资 select deptno, count(empno), max(sal), min(sal) from em ...
- javascript之八——BOM
8.1 window对象 BOM的核心对象是window--表示浏览器的一个实例.window有双重角色: 是通过javascript访问浏览器窗口的一个接口: 是ECMAScript规定的Globa ...