首页
社区
课程
招聘
[原创]逆向Android SO,以《遇见》App为例
发表于: 2015-4-14 14:21 35706

[原创]逆向Android SO,以《遇见》App为例

2015-4-14 14:21
35706

工具:IDA6.6,不会发图,只能用文字描述了。
研究过《遇见》登录的同学可能都知道,只要修改过APK,在登录时都会提示软件盗版。
经研究登录时safecode字段有问题,可能是验证了签名。在libiaroundnet.so中Java_net_iaround_utils_NativeLibUtil_aaa实现。

步骤1:下载  http://gdown.baidu.com/data/wisegame/01172eb9b2b25ed8/yujian_570.apk
将yujian_570.apk改名为yujian_570.zip,将lib目录下的lib\armeabi\libiaroundnet.so提取出来拖入IDA中。

步骤2:
    拖进来后发现SHA1Input,SHA1Output这样带有SHA1的函数,断定SO中用到了SHA1加密算法。

步骤3:
    查看Java_net_iaround_utils_NativeLibUtil_aaa函数按F5出来C的伪代码,此时代码还不易读懂,不如像“v9 = (*(int (**)(void))(v8 + 124))()”,这样的代码。但是看到这个我们是不是应该想到C++里面的内存的寻址?,成员变量的首地址=对象的首地址+成员变量在类中的偏移.
假如
Struct node
{
      int,x,y;
};
node a;如果A的首地址是0x00000000,那么a.x的地址是0x00000000,a.y的地址是0x00000004;
由C伪代码我们不难得出:v8是JNIEnv *类型,查看jni.h并计算我们不难发现v8 + 124是GetObjectClass函数指针,同理我们可以计算出其他类似的调用。

步骤4:
     有了步骤三的基础,我们可以想到一个简便的方法就是导入jni.h,从而确定JNIEnv类的结构,借助IDA直接识别函数。下载jni.h(虫大大书上修改JNI.H的方法貌似不好使,我自己改了个):http://pan.baidu.com/s/1sj3EaTn,然后File->Load File->parse C header file... 选择下载好的jni.h确定。然后在structures页面里按下insert键
->add standard structure->滑到最下方选择"JNIEnv_",然后确定。

步骤5:
    返回伪代码界面,鼠标点击Java_net_iaround_utils_NativeLibUtil_aaa的第一个参数,右键->convert to struct*->选择jnienv_*,这时,伪代码中不明函数的调用已经出来。
刚刚的(*(int (**)(void))(v8 + 124))()已经变成 ((int (*)(void))v8->GetObjectClass)();
这时只要仔细阅读伪代码就知道该函数做了啥,逆向的C代码为:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (23)
雪    币: 2679
活跃值: (2106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
在哪删帖,我要删帖!!!!!!!!!!!!!!!!!!!!!
2015-4-14 19:59
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
点一下编辑就行了 哈哈 被警告了吧
2015-4-14 20:41
0
雪    币: 2679
活跃值: (2106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
那倒是没有,感觉这个我技术太水了。。想技术好点以后再出来发贴
2015-4-15 11:56
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我觉得你写的挺好的
2015-4-15 13:02
0
雪    币: 30
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
写的很不错啊。、
2015-4-18 09:21
0
雪    币: 2679
活跃值: (2106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
你要导入JNI.h,识别JNIENV的数据结构,然后自己阅读代码,才能理解,上面是我根据我的理解重新写的。

PS:我KX不够,不能和你悄悄话
2015-4-18 09:47
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
MARK
2015-4-18 10:10
0
雪    币: 10968
活跃值: (17387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这么好的技术文章,就不要删除了
2015-4-18 10:49
0
雪    币: 639
活跃值: (4066)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
学习了  感谢分享!!
2015-4-18 17:19
0
雪    币: 4459
活跃值: (2086)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不错哦 继续加油
2015-4-18 22:02
0
雪    币: 119
活跃值: (1635)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
赞一个    长知识了~
2015-4-18 22:10
0
雪    币: 147
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个也就是通过c++部分再回调java的
2015-4-30 09:28
0
雪    币: 54
活跃值: (705)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
貌似IDA6.6 自动导入了jni.h这个文件了
2015-5-13 16:51
0
雪    币: 2679
活跃值: (2106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
这个我不知道,反正我的IDA没有看不到相关的数据结构
2015-5-14 17:18
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
这么好的入门贴,先赞了
2015-5-14 17:22
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
真的是好难哦。。JNI完全不懂啊。。
2015-7-7 14:22
0
雪    币: 723
活跃值: (1296)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
18
大哥,我想问下 jni.h  那个连接失效了,你能不能给我发一下。。。谢谢
2015-8-28 12:26
0
雪    币: 284
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
http://pan.baidu.com/s/1sj3EaTn   这个链接是无效地址啊
2015-11-20 10:29
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
直接Y键改参数类型就行了吧
2015-11-20 17:58
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
jni.h 这个的连接失效了能重写共享下吗
2016-1-9 15:23
0
雪    币: 2679
活跃值: (2106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
http://pan.baidu.com/s/1bjR9Qe
2016-1-9 18:59
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
多谢高手
2016-1-10 16:30
0
雪    币: 198
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这个我不知道,反正我的IDA没有看不到相关的数据结构
2016-1-19 00:02
0
游客
登录 | 注册 方可回帖
返回
//