beyond296089727 发表于 2015-11-10 22:59:56

编写基于xposed框架截取账号和密码的外挂和安全防护

如有需要源码和有什么不懂的联系我QQ2485171968 玩游戏的人一般都用过外挂,外挂看起来很神奇。其实他的原理就是HOOK,就是注入到目标进程了获取目标进程数据段的数据,然后修改达到目的,比如我们我开始开发游戏时,定义一个变量 intsore=0;记录游戏当前得分的,一般程序的变量编译后都是放到数据段里,运行时也映射到内存的相应数据段里,外挂要做的就是找到这个变量的在内存中的地址然后修改他的值。但是整个过程复杂难度很大,所以一般只有技术蛮高的人才能做。


      很幸运,在android中rovo98大神为我们提供一个相关开发框架和运行环坏境,就是有名的xposed框架,关于xposed框架的安装和介绍可以参考这里http://www.25pp.com/news/news_69599.html,自己也可以百度。关于他的插件开发流程可以参考官方的文章https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Mzz4hq0Btzzv3BZ5kXwmJNCJWc6MGXiYn5l..yslznI!/o/dNuCtnAWQQAA&bo=gAJyBNACAAUDAAY! ,而且官方也提供了DEMO叫RedClock,现在就用官方的DEMO做讲解第一步,建立一个android工程,第二步,导入官方的开发包xposedBradge-版本号.jar,可以到官方的github地址下载https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
第三步,如图配置AndroidManifest.xml,在Application标签添加<meta-data
            android:name="xposedmodule"
            android:value="true" />
      <meta-data
            android:name="xposeddescription"
            android:value="Easy example which makes the status bar clock red and adds a smiley" />
      <meta-data
            android:name="xposedminversion"
            android:value="30" />
属性,其中<meta-data
            android:name="xposedmodule"
            android:value="true" />是固定的,用于标识是xposed插件,这样安装后xposed installer就会识别并加载,<meta-data
            android:name="xposeddescription"
            android:value="Easy example which makes the status bar clock red and adds a smiley" />
      <meta-data是用于在xposed installer插件列表里显示的标题和描述信息的额,这个可以自定义, <meta-data
            android:name="xposedminversion"
            android:value="30" />
这个标识jar包的版本号,就是导入SDK 开发包的版本号,其他的就没什么要特别配置的了,
第四步,在工程的assets文件夹新建一个名为xposed-init的文件,内容是入口类的全路径类名(包名+类名),如图,类名是de.robv.android.xposed.examples.redclock.RedClock,标识是插件的入口类。第五步,编写入口类,其中入口类要实现IXposedHookLoadPackage接口,并重写handleLoadPackage方法,便表示每当有一个APP被加载时就回调这个接口,这里我们可以处理我们感兴趣的APP,是以包名为标识,比如DEMO里监听的是"com.android.systemui"包,对应的API就是系统应用SystenUi.apk专门显示系统UI的,比如状态栏,这是DEMO的代码
package de.robv.android.xposed.examples.redclock;


import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import android.graphics.Color;
import android.util.Log;
import android.widget.TextView;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;


public class RedClock implements IXposedHookLoadPackage {
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {

Log.v("packageName", lpparam.packageName);
if (!lpparam.packageName.equals("com.android.systemui"))
return;

findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
TextView tv = (TextView) param.thisObject;
String text = tv.getText().toString();
tv.setText(text + " :)");
tv.setTextColor(Color.RED);
Log.v("redcolock","redcolock");
}
});

//XposedHelpers.getObjectField(obj, "a");
}
}

http://img.blog.csdn.net/20150516105202181?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmV5b25kMjk2MDg5NzI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center 官方DEMO的效果(下图)就是修改状态栏的时间为红色并且加了:)。

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Qy1LvgKfgZp9oHFYCPyexDP4IRY65lzGmxH6i8H.R6k!/o/dFUfEHCGOwAA&bo=gAJyBNACAAUDAAY!

现在我们就来编写自己的插件HOOKQQ 密码,因为这里涉及QQ的安全所以这里就不直接拿QQ来讲解了,于是做了个DEMO模仿QQ的登陆的,代码和界面效果如下图


http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Go6b62N21BgLeZGDO7AjpvAZUOmXFRTrS5EnsIqtl9U!/o/dOvfrnAVQQAA&bo=ygOAAp4EDAMFAP0!

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/cjS6GMBJPalzCe5zWYwVabwsBfztzmtNKJIBpjcvC.o!/o/dDGUd2.kFwAA&bo=gAJyBNACAAUDAAY!
APP的包名为com.example.test
界面对应的Activity 全路径类名为 fager.qq.QQActivity
其中,public Button bt_QQlogin;对应登陆按钮的成员变量public EditText et_count;对应账号输入框的成员变量public EditText et_password;对应密码输入框的成员变量
public void onClick(View v)对应登陆按钮点击时间的回调函数

接下来编写插件HOOK QQ 密码,工程如图
http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Xufo1ebVw5pxgpLcvgLVhp6CcVICGM7DrK34i6Pwzd0!/o/dKVlSW5CCAAA&bo=XQSAAnQFIAMDAKw! 这里HOOK的是onClick(View V)函数,也就是说点击登陆按钮后,插件就HOOK住他,然后获取密码控件EditTextet_password,然后获取他的内容,然后修改

效果如下

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/xImPi.P9iDaWgqg83DCz42dOTzlQtgBJETiYZr9jeO0!/o/dMbbPnd9QQAA&bo=gAJyBNACAAUDAAY!

其实QQ里的登陆代码架构也是这样,用同样的原理能轻松HOOK到QQ密码,效果如图


http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Th9da0.ODmPkEBH5FXpEJ7HQ2TRovkNRTrXfoUGq4Z4!/o/dJ*EgG.fFwAA&bo=gAJyBNACAAUDAAY!

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Br5KhS9.TeKZg9qfQ4x7fr4gY38ph9lDvD*hLYM1rDs!/o/dCTYrnAVQQAA&bo=gAJyBNACAAUDAAY!

其实360这些杀毒软件的的动态防御功能就是用这样的原理,比如权限管理功能,如果我们对某个APP进行相应权限设置为“提醒”的
比如发短信,当APP发短信时就会弹框提醒用户,如图


http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/IOO2Rb2d58koqenayMN2TdTPxlOqu2T4iT5kKqZswwM!/o/dAF6tnAUQQAA&bo=gAJyBNACAAUDAAY!

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/Pm3NF5oyB.XXd7qvDGinzE096jJRF2igf1j0DnACFAE!/o/dMJdGXCHOwAA&bo=gAJyBNACAAUDAAY!
又比如APP获取设备信息(IMEI) 是通过代码
TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);   String IMEI= tm.getDeviceId();获取的,360首先HOOK住TelephonyManager类的方法getDeviceId(),如果用户拒绝的,
360就返回getDeviceId()的结果是“00000000000000” 这样无效的IMEI
如图

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/PWlXjiT31Trr08TrdWEzldpDUSa9n5OkOdBt0Mm8Dak!/o/dGgxE3B.OwAA&bo=gAJyBNACAAUDAAY!

http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/stUIF.Xnw10g9GfvRFezOju9b.cA.Wrdr.MKn9vzxiI!/o/dDCc426gFwAA&bo=gAJyBNACAAUDAAY!


如果允许的就返回真正的IMEI,如图
http://r.photo.store.qq.com/psb?/V12w3TNq4MQ46a/g1Ihp0mZawGvKCzZHS0.v4piYwkzKhpexGVoB6eAWhQ!/o/dD297G6hFwAA&bo=gAJyBNACAAUDAAY!

正对HOOK技术, 原理上支付宝,网银APP等其他要输入密码的都容易HOOK住密码,所以安全性不容忽视去。针对样情况,
要对坑这样的技术提高用户安全性,方法很对,最重要的是ROOT,如果没有ROOT就无法安装xposed框架,自然就没有下文了,
没有ROOT,连360的功能都大打折扣,想动态防御功能是无法是实现,酒量流量防火墙也不能用,所以谷歌官方可手机厂商都建议用户不ROOT就是因为这原因了。
第二,针对密码这样重要的数据输入,对应的控件最好自己用C语言实现的,不要用户SDK里的API。

sndncel 发表于 2015-11-11 05:50:41

这个还真是详细呀。。。。。。。谢谢分享呀。

pxhb 发表于 2015-11-11 09:47:13

大神,分享下源码呗{:4_86:}

ai枫 发表于 2015-11-11 10:09:11

真的很详细,学习一下

ai枫 发表于 2015-11-13 09:06:40

试了一下,颜色没有修改了,代码是拷过去的,不知道什么原因

蝌蚪它大爷 发表于 2015-11-15 17:37:09

不错很好的文章~谢谢分享~期待下一篇

huluxia 发表于 2015-11-16 11:31:01

学习了。。。。
页: [1]
查看完整版本: 编写基于xposed框架截取账号和密码的外挂和安全防护