android-crackme-07
这次打算利用hook技术来实现破解效果,主要是相对其中的原理和模块编写流程进行以此记录。
首先还是链接
crackme:
链接:https://pan.baidu.com/s/1a4YDW54mKIXYv6d1pqX5YQ
提取码:kka5
针对这个crackme的hook程序:
链接:https://pan.baidu.com/s/16xBy5AC7PO-qpKeZ2olOpQ
提取码:py67
项目代码和hook代码
链接:https://pan.baidu.com/s/1Hp6ivJgIEEofczcnCpM3SQ
提取码:dcob
先介绍一下Xposed框架
Xposed 是一个 Android 平台上的动态劫持框架,通过替换手机上的孵化器 zygote 进程为 Xposed 自带的 zygote,使其在启动过程中加载 XposedBridge.jar,模块开发者可以通过 jar 提供的 API 来实现对所有的 Function(这里可以理解为方法) 的劫持,在原 Function 执行的前后加上自定义代码。
Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed理论上能够hook到系统任意一个Java进程,由于是从底层hook,所以需要root权限,并且每次更新都要重新启动,否则不生效 。
crackme
首先是crackme的部分
编写简单的登陆验证功能:
emmmm 这里就直接把代码贴上来吧
package com.android.crackme07;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.security.NoSuchAlgorithmException;
public class MainActivity extends AppCompatActivity {
private EditText edit_userName;
private EditText edit_passWord;
private Button button_register;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_userName = (EditText)findViewById(R.id.edit_username);
edit_passWord = (EditText)findViewById(R.id.edit_password);
button_register = (Button)findViewById(R.id.button_OK);
button_register.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(!checkSN(edit_userName.getText().toString().trim(),edit_passWord.getText().toString().trim())){
Toast.makeText(MainActivity.this, R.string.unsuccessed, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,R.string.successed, Toast.LENGTH_SHORT).show();
}
}
});
}
private boolean checkSN(String username, String password){
if((username == null) || (username.length() == 0))
return false;
if((password == null) || (password.length() == 0))
return false;
if("admin".equals(username)){
if("123456".equals(password))
return true;
}
return false;
}
}
可以看到,程序的功能就是把输入的username和password作为参数,使用checkSN()函数进行验证,而checkSN()函数的功能就是将这两个参数和特定值进行比较,从而进行身份验证。
模拟器下,运行结果示例(此处输入为:abc / 123):
Hook
很明显我们主要是需要修改checkSN()函数从而实现破解效果
基于Xposed框架,编写模块实现针对这个函数的Hook
Xposed框架的下载安装这里就不说了,主要是说模块编写的流程,以及可能遇到的问题
首先在app目录下新建文件夹lib,然后将XposedBridgeApi-54.jar添加到该目录下并右键选择“add as library”
这里我也是结合了许多其它文章中对这里的描述,可能的原因是:“如果将jar包放置到libs目录下,可能会产生错误,估计Xposed作者在其框架内部也引用了BrideApi,这样操作能避免重复”
然后在AndroidMainfest.xml中添加代码
<meta-data
android:name="xposedmodule"
android:value="true" />
<!--模块描述-->
<meta-data
android:name="xposeddescription"
android:value="a hook demo" />
<!--模块版本-->
<meta-data
android:name="xposedminversion"
android:value="30" />
1.xposedmodule属性设置为true,表示这是一个xposed模块
2.xposeddescription是指对这个模块的介绍
3.xposedminversion表示此模块支持的最低版本
接下来就是hook模块主要代码的编写了
创建类Hooks
在这里主要是实现包名的过滤
public class Hooks implements IXposedHookLoadPackage{
final String package_name = "com.android.crackme07";
@Override
public void handleLoadPackage(final XC_LoadPackage .LoadPackageParam lpparam) throws Throwable{
if(!lpparam.packageName.equals(package_name)){
return;
}
new CheckSNHook(lpparam.classLoader);
}
}
创建类CheckSNHook,这里就是我们实现hook功能的主要代码了
import android.util.Log;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
public class CheckSNHook {
static final String TAG="hooktemp";
public CheckSNHook(ClassLoader cl){
super();
XposedBridge.log("hooking checkSN");
try{
Class clz = (Class<?>) XposedHelpers.findClass("com.android.crackme07.MainActivity",cl);
XposedHelpers.findAndHookMethod(clz,"checkSN",String.class,String.class,new XC_MethodHook(){
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable{
XposedBridge.log("checkSN afterhooked.");
String s1 = (String) param.args[0];//username
String s2 = (String) param.args[1];//password
param.setResult(true);
super.afterHookedMethod(param);
}
});
}catch(Exception e){
e.printStackTrace();
}
XposedBridge.log("hook checkSN done.");
}
}
然后在src/main目录下创建assets,并在assets文件夹中添加文件xposed_init,在其中声明主入口类
xposed_init的文件内容为 包名.入口类名 此处为 com.android.hook07.Hooks
添加后截图示例:
编写完成后,记得检查一下jar的依赖选项
在project structure中查看依赖选项,使用compile only依赖,hook失败的话,有可能就是这里选择有问题
简单xposed模块编写流程大致如上,生成apk文件,安装后,在xposed模块中勾选后重启设备
再次运行crackme07程序,输入,查看弹窗结果
此处输入为 abc / 123
关于xposed模块编写的文章推荐: