赞
踩
今天读一篇论文中提到“盗版应用可在未读取SO库实现源码的情况下,对其中的方法进行调用”,既然这样今天就小小的实现一发,不知道怎么取名?就索性暂时取名为“Android 逆向调用so(一)”,可能到后来脑洞一开实现一个进阶篇,这谁说的来呢是吧
原理篇:
前提:
先写一个简单的Demo,比如实现一个最简单针对IDA反附加的反调试,在移动端这一块反调试还算不是很多吧相对PC,我到后面肯定会专门写一个关于Android反调试的专题,我们知道IDA的动态调试在建立android_server的时候,是android_server这个进程ptrace调试进程,一旦附加上以后,在/proc/pid/status/TracerPid这个值就不是为0,如果我们一旦检测到它,说明进程正在被调试,这时候选择退出就OK,这里为了进行很好的说明,我们选择不退出,选择输出字符串显示被调试,额,似乎跑题了,又不是讲反调试,这里只是作为一个样例,后面会专门讲反调试。。。
目标:
我们假设上面那个拥有反调试的APK是我们逆向要分析的对象,再假设我们自己建立一个HelloWorld的工程,想拥有上面那个反调试的功能但是又不会自己用源码来实现,那么这里就进行逆向调用上面那个有反调试的.so文件中的执行反调试的函数,来使得这个简单的HelloWorld有这个反调试功能。
实现篇:
我自己实现了一个反调试,源码会放在后面附件中。因为这不是重点,重点在后面;
接下来进行逆向调用:
假设我们现在只拿到一个拥有以上反调试的一个APK,我们开始逆向分析它;用AK打开,核心函数在.so文件里面,我们接着用IDA分析它;
我们可以看到有两个核心函数,一个Java_com_example_zbb_jiagu02_Myndk_antidebugs();另一个Java_com_example_zbb_jiagu02_Myndk_Stringfromnative();我们从IDA分析或者APK的运行知道它是返回一个字符串;这里为了简单期间我们先实现在HelloWorld中显示这个字符串,然后再实现那个饭调试的功能。
首先显示字符串:
第一步:在工程的/app/src/main/下面建立一个/jniLibs/armeabi/的文件,把我们要调用的核心libptrace.so文件放在下面;
第二步:由于调用本地层,所以建立java层与本地层之间的联系,因此新建一个以被调用的.so工程中的包名为名字的包,把对应的调用建立java层与本地层之间的文件拷贝过来;
如下图所示:
里面按照以下这样的格式来,就可以。
- <span style="font-size:24px;">public class Myndk {
- static
- {
- System.loadLibrary("ptrace");
- }
- public static native String Stringfromnative();
- }</span>
第三步:在MainActivity.java中调用相应Stringfromnative(),函数来显示,
最后的运行结果就是:
调用反调试的功能:
第一步:与上面一样,在工程的/app/src/main/下面建立一个/jniLibs/armeabi/的文件,把我们要调用的核心libptrace.so文件放在下面;
第二步:与上面一样,步骤一样故省略;
第三步:在MainActivity.java中调用相应antidebugs函数来判断反调试;
接下来我们进行一发看看反调试是否起到作用:
OK,说明这种方法是可行的。
总结篇:
大家可能觉得这个不是特别有说服力,但是这里最重要的是提供了一个思路:就是我们可以逆向调用别人的.so文件里面的方法。
核心步骤:
第一步:在工程的/app/src/main/下面建立一个/jniLibs/armeabi/的文件,把我们要调用的核心libptrace.so文件放在下面;
第二步:新建一个以被调用的.so工程中的包名为名字的包,把对应的调用建立java层与本地层之间的文件拷贝过来;
第三步:在MainActivity.java中调用相应的功能函数;
*****************************************************
注意:
1.这个是建立在逆向的基础上,只有了解了你需要调用的函数的功能以及返回参数 ,才可以进行调用;
2.优点是:逆向开发,不需要知道中间的实现过程,效率高;
3.缺点是:对于保护过后的,需要逆向能力强,并且成本高,在下一篇中来进行进阶篇;
源码下载:点击打开链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。