来,让我们任性登录,替换掉它的登录验证
每次登录,注册输入账号密码是多么繁琐的事情,烦!就要破解它,如果能把app里面的登录验证函数换成我们的“无敌登录”那是多么吊炸天的事。如果可以“QQ,微信,支付宝(咳咳想多了)”,不过就这样想想是多么激动的事情。
无敌登录的意思是:把人家的验证程序换成“自己的无敌登录”==“不需要验证登录”。
当然这个过程也不是一帆风顺的,要不你真的可以随意破解app了,首先需要知道我们要攻击的app中登录验证的函数名,以及所带的参数,例如:
好!现在我们要开始了~~
===================================================================================
【制作一个将要遭受攻击的登录app】:
1.布局函数做一个登录界面:
大家刚开始做做的登录界面可能比较古板,下面的EditText是经过调试边框+颜色+圆角之类,不用纠结简单用即可
【主代码】然后编写我们的界面登录管理验证:
public class MainActivity extends Activity { EditText username; EditText passwd; Button logbut; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); username=(EditText)super.findViewById(R.id.username); passwd=(EditText)super.findViewById(R.id.passwd); logbut=(Button)super.findViewById(R.id.logbut); logbut.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String a=new String(username.getText().toString()); String b=new String(passwd.getText().toString()); if(checklogin(a, b)){ Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show(); } } }); } public boolean checklogin(String username,String passwd){ if(username.equals("张依依")&&passwd.equals("123456")){ return true; } return false; } }
验证函数就是我们这个:
public boolean checklogin(String username,String passwd){ if(username.equals("张依依")&&passwd.equals("123456")){ return true; } return false; }
我们运行一下看输入不是我们规定的账号密码会怎么样?
==================================================================================
针对 Hooking Android App 的 Hook 关键点实现 Hook 模块
1). 实现 IXposedHookLoadPackage 接口
2). 确定要 Hook 的 Android App 的包名
3). 判断要 Hook 的包名
4). 确定要 Hook 的 Android App 的方法
5). 具体实现 Android App 的函数 Hook,调用 XposedHelpers.findAndHookMethod(“包名+类名”,
lpparam.classLoader, “要 hook 的函数名称”, 第一个参数类型, 第二个参数类型….. , new
XC_MethodHook() {
protectedvoid beforeHookedMethod(MethodHookParam param) {
//函数执行之前要做的操作
}
protectedvoid afterHookedMethod(MethodHookParam param) {
//函数执行之后要做的操作
}
});
代码如下:
package com.example.xposehook; import android.util.Log; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodHook.MethodHookParam; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; public class Attacker implements IXposedHookLoadPackage{ @Override public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable { //查找包名,被Hook的函数所在的包 if(lpparam.packageName.equals("com.example.xposetest")){ XposedBridge.log("loaded App:"+lpparam.packageName); //开始对要Hook的函数进行操作 XposedHelpers.findAndHookMethod("com.example.xposetest.LogActivity", lpparam.classLoader, "checklogin",String.class,String.class, new XC_MethodHook(){ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { // Hook函数之前执行的代码 //传入参数1 XposedBridge.log("beforeHookedMethod userName:" + param.args[0]); //传入参数2 XposedBridge.log("beforeHookedMethod sn:" + param.args[1]); //函数返回值 XposedBridge.log("beforeHookedMethod result:" + param.getResult()); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { // Hook函数之后执行的代码 //通过对checkSN函数的分析发现,只要修改函数的返回值即可实现注册的破解 param.setResult(true); //传入参数1 XposedBridge.log("afterHookedMethod userName:" + param.args[0]); //传入参数2 XposedBridge.log("afterHookedMethod sn:" + param.args[1]); //函数返回值 XposedBridge.log("afterHookedMethod result:" + param.getResult()); } }); } } }
之后我们开始测试:
首选手机要root
在 Xposed 框架中安装刚才已经编写好的 Hook 模块 XposedDemo 如上图所示,然后重启手机或者模拟器,
我们编写的 XposedDemo 模块在手机或者模拟器重启以后就会生效的, 点击运行 crackme02.apk 应程序,
按照输入要求输入随意的用户名和注册码该程序就会验证通过,如下所示: