本文链接:
摇骰子和猜拳作弊器制作流程(一)
摇骰子和猜拳作弊器制作流程(二)
摇骰子和猜拳作弊器制作流程(终)
声明:
本文的开发原理和流程皆来自- 尼古拉斯_赵四 :http://blog.csdn.net/jiangwei0910410003/article/details/52892330的这篇文章,所有技术要点和精华皆为原作者的辛苦创作所得,本人只是在其基础进行二次开发。闲言碎语:
闲来无事看到了大神的这篇文章,自己就按流程走了一遍突然发现简直6到不行,Xposed的软件也是很好用,赵四大神也完成了所需工作的99%,所以我就将我的流程写出来以供大家参考。而且在最后实现此篇文章之后我发现点数自定义非常难,只能一次一次改代码,非常的麻烦(达不到动态效果,骗人很难,都是六点你懂得...猜拳就不用说了),所以我私信了作者,等了很长时间原作者都没有给我回信,所以我就自己搞了搞,现在我把我的流程PO出来,希望大家少走弯路。
必要了解的东西和涉及到的知识点:
1.Xposed基础模块开发(这东西很简单,直接上百度下一个最基础的模块,然后了解原理,瞬间就可以打到拦截的效果)
2.破解APP寻找HOOK点(这个原作者已经讲的非常细致了,所以我说原作者已经完成了任务的99%)
3.Android的基础开发(主要是File文件操作类的知识,其他的都是基础)
现在开始:
前期准备:安卓模拟器(本人用的夜神模拟器)、Xposed软件、微信6.3.9、android-IDE(eclipse)
Xposed模块实现:看了原作的前言里面的教程,去百度下载一个最简单的模块,然后将原作第六步的代码写进去,这样最初版的一个模块就做好了
初版模块实现:之后的步骤完全取决于你第一步走的稳不稳,不要着急慢慢来实现出效果。第一步就是在你的安卓模拟器上安装好Xposed,然后安装好微信6.3.9,安装好初版模块,然后有如下画面
打开Xposed,点击激活应用模块,勾选中你刚才安装的初版模块,重启,然后打开微信你就会发现,程序已经实现出你想要的结果了。
再次开发(思路):下面就要实现自定义点数的问题了,由于本人也是第一次接触Xposed的模块开发,所以走了不少弯路,最后历尽千辛万苦搞定了自定义,也不知道做法是不是正确的,但是好在实现出效果了,刚开始本人的思路是IO类读写文件,自己写一个安卓软件写,然后在模块代码里去读,但是搞了好久也没研究明白为什么Xposed里面的IO报错问题,因为模块没法调试,看软件自带的日志也找不到原因,用try/catch测试了很多次,所以没有办法只好另辟蹊径,因为在IO之前我曾做过文件的exists()判断,所以你们懂的,我选择以判断文件的形式。
自定义软件的开发:为了不跑题特地找了个骰子做图标,哈哈,废话不多说直接上代码了,并没有太复杂的东西,大家应该都看得懂。
package com.example.chose;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
String[] name = {"1Point","2Point","3Point","4Point","5Point","6Point","shiTou","jianDao","Bu"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取TextView
//final TextView Ev1 = (TextView) findViewById(R.id.textView1);
// final TextView Ev2 = (TextView) findViewById(R.id.textView2);
//1点 点击事件
Button button1 = (Button)findViewById(R.id.button1);//获取按钮资源
button1.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(0);
}
});
//2点 点击事件
Button button2 = (Button)findViewById(R.id.button2);//获取按钮资源
button2.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(1);
}
});
//3点 点击事件
Button button3 = (Button)findViewById(R.id.button3);//获取按钮资源
button3.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(2);
}
});
//4点 点击事件
Button button4 = (Button)findViewById(R.id.button4);//获取按钮资源
button4.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(3);
}
});
//5点 点击事件
Button button5 = (Button)findViewById(R.id.button5);//获取按钮资源
button5.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(4);
}
});
//6点 点击事件
Button button6 = (Button)findViewById(R.id.button6);//获取按钮资源
button6.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(5);
}
});
//石头 点击事件
Button button7 = (Button)findViewById(R.id.button7);//获取按钮资源
button7.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(6);
}
});
//剪刀 点击事件
Button button8 = (Button)findViewById(R.id.button8);//获取按钮资源
button8.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(7);
}
});
//布 点击事件
Button button9 = (Button)findViewById(R.id.button9);//获取按钮资源
button9.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
create(8);
}
});
}
// 创建自定义文件类
public void create(int position) {
if(position <= 5){
deleteAll("ShaiZi");
}else{
deleteAll("CaiQuan");
}
String FileName = name[position];
File configure = new File(getCacheDir(), FileName);
if (!configure.exists()) {
try {
configure.createNewFile();
} catch (IOException e) {
Toast.makeText(MainActivity.this, "新建文件失败!", Toast.LENGTH_SHORT)
.show();
}
}
}
// 清空文件类
public void deleteAll(String type) {
if (type.equals("ShaiZi")) {
for (int count = 0; count <= 5; count++) {
File configure = new File(getCacheDir(), name[count]);
if (configure.exists()) {
configure.delete();
}
}
} else {
for (int count = 6; count <= 8; count++) {
File configure = new File(getCacheDir(), name[count]);
if (configure.exists()) {
configure.delete();
}
}
}
}
}
模块的二次开发:
package cn.wjdiankong.xposedhook;
import java.io.File;
import java.io.IOException;
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 Main implements IXposedHookLoadPackage {
String[] name = {"1Point","2Point","3Point","4Point","5Point","6Point","shiTou","jianDao","Bu"};
@Override
public void handleLoadPackage(final LoadPackageParam lpp) throws Throwable {
XposedHelpers.findAndHookMethod("com.tencent.mm.sdk.platformtools.bb", lpp.classLoader, "pu", Integer.TYPE, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws InterruptedException, IOException {
int intValue = ((Integer) param.args[0]).intValue();
switch (intValue) {
case 2: // 猜拳
switch (getCaiQuan()) {
case 7: // 0---剪刀
param.setResult(0);
return;
case 6: // 1---石头
param.setResult(1);
return;
case 8: // 2---布
param.setResult(2);
return;
default: // 没有配置
param.setResult(2);
return;
}
case 5: // 摇骰子
switch(getShaiZi()){
case 0: // 1点
param.setResult(0);
return;
case 1: // 2点
param.setResult(1);
return;
case 2: // 3点
param.setResult(2);
return;
case 3: // 4点
param.setResult(3);
return;
case 4: // 5点
param.setResult(4);
return;
case 5: // 6点
param.setResult(5);
return;
default: // 没有配置
param.setResult(5);
return;
}
default:
return;
}
}
});
}
public int getShaiZi() {
for (int count = 0; count < 6; count++) {
String fileName = "/data/data/com.example.chose/cache/"+ name[count];
File configure = new File(fileName);
if (configure.exists()) {
return count;
}
}
return 99;
}
public int getCaiQuan() {
for (int count = 6; count < 9; count++) {
String fileName = "/data/data/com.example.chose/cache/"+ name[count];
File configure = new File(fileName);
if (configure.exists()) {
return count;
}
}
return 99;
}
}
再次操作:
同上,将你之前的模块卸载,将新模块和自定义软件安装到虚拟机,这个时候你只需要在软件里设定点数,然后切换到微信界面,你就完成了自定义点数和猜拳的任务了!