吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 150115|回复: 212
收起左侧

[Android 原创] 【Android】跟着鬼哥学so修改

    [复制链接]
听鬼哥说故事 发表于 2014-12-19 09:38
本帖最后由 听鬼哥说故事 于 2014-12-23 13:14 编辑

跟着鬼哥学so修改,一,准备篇


图/文 听鬼哥说故事



文章是系列教程,大家可以直接关注这一个帖子即可,有新文章版主也会合并过来的,在2,3,4,5等楼层,请及时刷新。



最近看了一些博客,论坛,国外文章,大牛的文章作品,文笔,技术,思路都非常好,默默的点个赞。。

咱水平不高,仅供玩乐而已,基础知识不多说了,环境配置自行学习即可,有兴趣的请继续读下去,菜鸟出品,水平有限


截图看不清,可以直接下文档,文章最后有。



闲话少说,so的修改,重要性大家都知道,这里从头编写so文件,分析so文件,修改so文件,打算做一个系列的教程,当然,主要是看时间允许。


android的sdk配置以及ndk环境下载,请同学们自行google即可。


翻墙也不会,工具也不会用,搜索也懒得搞,请直接略过本文即可。


0x1:新建立一个安卓工程




1.png


0x2:编写调用so代码和方法定义

在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so


2.png



0x3:生成文件头.h文件

在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。

3.png


一切正常编译,那么现在我们回到工程根目录下:

4.png



然后在命令行切换到此目录:

5.png



现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg

6.png


不报错,并且成功编译出.h文件,才算成功的。

上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:



7.png

0x4:编写c代码


8.png


在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了


9.png

然后就是Android.mk文件的编写了


10.png


0x5:生成so文件


11.png


切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。


0x6:android调用代码


12.png


新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:


13.png












相关附件和文档:
http://pan.baidu.com/s/1pJ2Y047





点评

师傅威武。。一统江湖。  发表于 2014-12-19 11:35

免费评分

参与人数 35吾爱币 +2 热心值 +35 收起 理由
black90 + 1 + 1 我很赞同!
寒蝉鸣泣之时 + 1 + 1 谢谢@Thanks!
iceplumblossom + 1 用心讨论,共获提升!
Amanda小黑 + 1 我很赞同!
木天狼星 + 1 谢谢@Thanks!
wangxd + 1 我很赞同!
iamyrc + 1 鬼哥的教程通俗易懂~
暗夜∮孤星 + 1 热心回复!
zhuanshu721520 + 1 我很赞同!
k18556 + 1 已答复!
kidd_lee + 1 谢谢@Thanks!
caleb110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
970883246 + 1 不是视频真的看不懂
linghucun + 1 热心回复!
POI + 1 我很赞同!
BattleCall + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
0立华奏0 + 1 我很赞同!
liuning670 + 1 虽然看不懂!但是感觉太牛逼啦!!!
rockymax + 1 深入浅出,雷锋
zlx2030 + 1 我很赞同!
yuday + 1 我很赞同!
708822504 + 1 我很赞同!
adq_cq + 1 热心回复!
frozenyihan + 1 我很赞同!
XhyEax + 1 不明觉厉!
sndncel + 1 牛X人物,支持一下
Chinawlcc + 1 点赞
qtfreet00 + 1 谢谢@Thanks!
Godream + 1 怒赞
wbzzfljf168 + 1 我很赞同!
山顶的一棵草 + 1 不明觉厉露个脸
逍遥枷锁 + 1 我很赞同!
Monitor + 1 顶你!!出系列教程不?
飞儿line + 1 谢谢@Thanks!
鬼魅丶幽怨魂 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 听鬼哥说故事 发表于 2014-12-19 09:47

跟着鬼哥学so修改,二,进行篇

本帖最后由 听鬼哥说故事 于 2014-12-19 10:29 编辑

图/文  听鬼哥说故事

废话不多数了,继续看吧,基础差的,自行搜索文章教程,或者买书学习

继续上文的内容----------------------------------


0x1:测试文件的编写
经过上一篇文章的基础学习,现在我们开始进行是用的部分。
既然我们可以在so中定义String字符串了,那么我们当然也可以定义int类型的数据了,那么,我们在此定义一个getCoin方法,返回值为int类型。如下:
JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin
  (JNIEnv * env, jobject this)
{

int c=100;

return c;

}

同时编写java代码:

static public native int getCoin();

这两个方法的添加,可以继续在我们上一篇文章的基础上进行补充即可,当然,为了熟练创建ndk工程,也可以重新创建工程的。
然后我们在shell下切换到工程根目录:


1.png


这样成功生成so文件。
然后我们简单在xml定义下布局,简单的,直接在layout



<TextView
        android:id="@+id/coin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />



添加一个TextView,设置idcoin,然后就可以在主类进行引用。




2.png

这样我们运行一下程序,查看一下效果。

3.png


0x2:任务明确
我们现在需要做一个任务,就是修改上文程序中的金币数量。
我们直接在工程的bin目录下拿出来未签名的apk,分析时可以先不管签名,我们把lib/armeabi下的so文件拿出来,拖进IDA进行分析。

0x3:挂起IDA,进行分析

(假设,当前我们的状态是不知道程序源码)
通过上文运行的截图,我们可以分析到,有关键字“Current Coin ,我们在对反编译后的程序分析搜索,发现只存在于so文件中,这样,我们就直接在IDA中搜索字符串去。
快捷键 Shift + F12


4.png

找到它的引用

5.png



这个没啥好解释的,加载字符串而已,没啥重要信息,发现不出来金币在哪里定义了,那么我们就看下引用。

6.png

发现在so文件中,并没有函数对此方法进行调用,那么我们就返回java中,看看java语句中是怎么对它进行的调用,其上下文都是什么东西。


7.png




经过查看printhello方法在JniGg.smali中是定义,在MainActivity是调用,我们详细看下代码:




8.png



贴上简单的说明,大家就可以看的清楚了。
我们在这里发现一个关键函数,getCoin方法,通过向上追寻,发现也是在so文件中的,那么现在我们再次回到IDA中:


9.png

Options打开General,也就是第一个选项,设置如下:


10.png

然后我们可以看到:

11.png

这个是Thumb的指令,那么我们修改,也要使用Thumb
一个字节来定义数值,我们只能用最大ff了,即255,那么在16进制编辑器打开,跳转到c04的位置,修改为FF 20,然后放回程序,签名,运行。


12.png


好了,说明我们的修改成功。

0x4:反思一下
既然我们是自己写的源码,那么我们就可以很好的来对比思考了,这个过程留给同学们自己来思考,请花上10分钟时间,对比一下代码里面编写的方法,与在so中反汇编的代码的联系,增强一下熟悉的感觉。
另:

上面的apk,还有其他破解方法,即我们找到java层的调用了,那么直接修改java层调用方法的返回值,效果也一样,可以修改为无限大的数值。











相关附件地址:


http://pan.baidu.com/s/1i3wzetf


 楼主| 听鬼哥说故事 发表于 2014-12-19 14:10
跟着鬼哥学so修改,三,作业篇

作业:
通过前面两篇文章的学习,请自行分析此应用,将当前用户类型修改为Gold Vip 用户。


图片1.png


有两种以上的方式可以修改的,有兴趣的同学请进行分析,写一下分析记录,可另起文章发布其过程与思路。


明天或者后天,再发布一下分析过程,以及原代码,大家再对比学习一下即可。


--------------------------------------------------------
下载地址:
http://pan.baidu.com/s/1jG22HMY



 楼主| 听鬼哥说故事 发表于 2014-12-22 09:51

跟着鬼哥学so修改,三,答案篇

在52发了,不过很少人回复,很少人去做第三题。
所以其他论坛转载的还是有几个人去对待这个题目而进行的分析,如下:

第三题链接:(3楼)
http://www.52pojie.cn/thread-313869-1-1.html

几篇分析好的文章:
http://www.pd521.com/thread-114-1-1.html     xxoo
http://www.pd521.com/thread-113-1-1.html    myoldid  (回复,1,2,3)


进行软件的分析,这个过程就不需要多说了,大家自己看就是了,下面是分析完毕后的思路进行。
细节方面不再叙述:


smali层关键点:


1.png


native层关键点:


2.png


0x1:
修改smali层,将传入参数v0设置为int数值 1。

0x2:
针对这个apk来说,搜索默认显示的Normal User


3.png


等长度修改字符串,多余的不用空格补齐:

4.png




0x3:
确定好传入的参数,主要是R2,所以将R2与几个数字进行比较,所以将这个比较干掉它,也就是修改指令 00 00去替换掉,然后程序必须要走下面Gold Vip的流程了。
这里也可以改BNE为BEQ,效果一样,不过推荐用上面那个方式。


5.png


0x4:
核心参数是传入的R2,根据下面的汇编代码也可以看到,R2=1是关键点。
所以,我们在push指令完毕后,将后面第一个CMP 和BEQ修改掉。
Mov R2,#1      ,Nop     .
因为直接修改的话,下面多个BEQ处理是无用的,所以直接Nop掉即可。
即 01 20 ,00 00

源码参考:
看完这个,再对比大家分析的so里面的显示效果,自然就明白了,可以简单总结下,so中遇到类似的情况,不是if else,就是switch。




[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
JNIEXPORT jstring JNICALL Java_com_ggndktest1_JniGg_VipLevel 
  (JNIEnv * env, jobject this,jint a) 
    int c=(int)a; 
   
    const char* vip = ""
   
    switch(c) { 
   
        case 1: 
            vip= "Gold Vip"
            break
   
        case 2: 
            vip="Silvery Vip"
            break
   
        case 3: 
            vip="Copper Vip"
            break
   
        default
            vip="Normal User"
            break
   
   
    
   
    return (*env)->NewStringUTF(env, vip); 
   
   
}





其他分析方法还有几个,不过很少人来去做,就简单介绍这几个方法了。。


不知道怎么合并到原帖子中,版主大人看着弄吧。。




免费评分

参与人数 2热心值 +2 收起 理由
傲世V雄哥720 + 1 我很赞同!
吉子 + 1 牛逼的鬼哥。收我为徒吧。

查看全部评分

 楼主| 听鬼哥说故事 发表于 2014-12-23 13:10

跟着鬼哥学so修改,四,实例第一篇

跟着鬼哥学so修改,四,实例第一篇



图/文  听鬼哥说故事


---------------------------------------------分割线--------------------------------------------




这篇文章是前段时间的文章,最近这个系列的so分析刚好可以做为一个实例教程,所以就补充拿回来了。
前三篇没看的,请继续关注论坛,看完前面三篇。


http://www.52pojie.cn/thread-313869-1-1.html




趁热打铁,加深对so的分析过程,于是就有了这篇文章的补充························

另,此文章需要对android反编译逆向有一定基础,简单了解so的作用,有任何疑惑,可去群里和论坛或自行google搜索解决。



文章受www.pd521.com 站长邀请,也首发在其论坛。



请大家自己动手去练习!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!




---------------------------------------------分割线--------------------------------------------




在博客发了下,一堆图片,上传老麻烦了,这里留下文档。



排版看的不舒服的,直接看文档即可,相关附件地址:


链接:http://pan.baidu.com/s/1eQILJkI 密码:7kyr


或者直接看在此论坛的文章链接--------》


http://www.52pojie.cn/forum.php?mod=viewthread&tid=265667






其实此游戏还有很多方式去破解的,这里只是介绍一两种而已,大家可以自行补充~


版主请再看看怎么合并到那个帖子里面吧······


yuusha 发表于 2014-12-21 00:15 来自手机
动态验证修改,支持!
抗么卑鄙讠 发表于 2014-12-19 18:41
收藏了  不错的
小帥 发表于 2014-12-19 10:56
不错,大手
tsstss123 发表于 2014-12-21 12:07
技术文章~
来长知识了
bg7758 发表于 2014-12-21 10:01
学PHP的表示完全看不懂
214515047 发表于 2014-12-21 00:33 来自手机
感谢分享 楼主辛苦了
暗之轮回 发表于 2014-12-20 23:58
威武。支持一下。正需要。希望继续更新后面的。强烈支持!
含蕊 发表于 2014-12-20 12:09
谢谢分享,支持一下
Night_Stalker 发表于 2014-12-20 10:58
教程很详细。值得学习
羅少 发表于 2014-12-19 09:52
前排来学习~   出售瓜子矿泉水~
蚯蚓翔龙 发表于 2014-12-19 09:57
前排围观
21882068 发表于 2014-12-19 10:01
围观一下!
Arlenhy 发表于 2014-12-19 10:02

前排围观
黑龍 发表于 2014-12-19 10:03
我去!卖瓜子了!跟着龟哥的脚步走!!!
Hmily 发表于 2014-12-19 10:04
鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的问题吗?我去后台看看能不能设置。

免费评分

参与人数 1热心值 +1 收起 理由
skfxzxc + 1 我很赞同!

查看全部评分

我有一只连营鹿 发表于 2014-12-19 10:10
自带小板凳来学姿势
 楼主| 听鬼哥说故事 发表于 2014-12-19 10:17
Hmily 发表于 2014-12-19 10:04
鬼哥,上次那个crackme给发下啊。
另外我把帖子合并一起了,这个图怎么这么小,好不清晰,是上传论坛后的 ...

待会儿我不忙的时候,再重写把word的文档整理一下发过来吧。
crackme好早了,就别发了。。。

点评

赛后交流啊,那个安卓的就没被搞定,你现在出手给大家学习下吧!  详情 回复 发表于 2014-12-19 10:30

免费评分

参与人数 2热心值 +2 收起 理由
妖妖大人 + 1 我很赞同!
skfxzxc + 1 我很赞同!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-17 19:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表