微信摇骰子和猜拳作弊器制作流程(一)

本文链接:

摇骰子和猜拳作弊器制作流程(一)

摇骰子和猜拳作弊器制作流程(二)

摇骰子和猜拳作弊器制作流程(终)

声明:

本文的开发原理和流程皆来自- 尼古拉斯_赵四 :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;
	}
}
再次操作: 同上,将你之前的模块卸载,将新模块和自定义软件安装到虚拟机,这个时候你只需要在软件里设定点数,然后切换到微信界面,你就完成了自定义点数和猜拳的任务了!
最后: 然后我又感觉来回切换实在是麻烦,所以决定将自定义软件做成悬浮窗形式,这样就是完美实现了,本人由于还没有实现出来,所以就停在这里了,希望同样感兴趣的同学可以一起交流,如果你有更好的办法可以联系我,咱们一起学习进步,最后非常感谢赵四大神能为我们写出这么好的一篇文章,藉此文章表达我这个小虾米的谢意。


你可能感兴趣的:(Android,开启新世界的大门,微信,Xposed,作弊器)