【原创源码】教你如何给APP添加IEME权限校验
本帖最后由 刺蝴蝶De箫启灵 于 2017-12-27 11:54 编辑为了避免非零基础人群感到身体不适、头晕恶心、易怒及粗口,请不要查看以下内容
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑请不要无视黄色提示
此贴教你如何给APP加上IEME权限,原创APP,破解APP,都可以添加,网络权限,增删可控,无需重装APP。
本帖教程分两个
一是原创app的IEME权限的添加。我会提供源码
二是别人的app,通过smali注入给它加上权限限制。 我会提供相应的smali文件 (X宝加一次权限收费90...我把我自己的代码发出来给你们用)
下面看效果图:
==================【原创APP,加IEME校验方法,基于网络】==================
原理:加个不可关闭的ProgressDialog,然后请求一下你的权限列表,如果有权限你就把ProgressDialog关掉,没权限你就提示没权限就行了。
下面以我的代码为准,你们可以随意发挥,比如走其他协议,或者加密什么的。
首先要有个请求类,自己随意封装,也可以用AsyncHttp框架什么的,用于请求网络连接,获取IEME权限列表的类
public class Xqlasynhttp {
public void get(final String url,final Xqlhanld my) {
new Thread() {
@Override
public void run() {
try {
HttpClient hc = new DefaultHttpClient();
HttpGet hg = new HttpGet(url);
HttpResponse response = hc.execute(hg);
if (response.getStatusLine().getStatusCode() == 200) {
Message ms = new Message();
ms.what = 0;
InputStream in = response.getEntity().getContent();
ms.obj = inputStream2String(in);
my.sendMessage(ms);
} else {
Message ms = new Message();
ms.what = 1;
InputStream in = response.getEntity().getContent();
ms.obj = inputStream2String(in);
my.sendMessage(ms);
}
} catch (Exception e) {
e.printStackTrace();
}
super.run();
}
}.start();
}
public static String inputStream2String(InputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte;
int n;
while ((n = in.read(b)) != -1) {
out.append(new String(b, 0, n));
}
return out.toString();
}
}
自定义hanld。
public class Xqlhanld extends Handler {
public void sussc(String msg) {
}
public void error(String msg) {
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
sussc(msg.obj.toString());
break;
case 1:
error(msg.obj.toString());
break;
default:
break;
}
super.handleMessage(msg);
}
}
Dialog类的代码,弄个不可关闭的Dialog,然后判断是否有权限。(是不是很简单? 就是这么简单。)
//这个http的txt是保存了一些有权限的IEME,这个方法也是循环判断本机IEME是否跟服务器传过来的IEME有没有在里面
你只需要在服务器上面放一个txt文件就行了,每一行代表一个IEME权限,有权限的更新时,只需要更新文本就行了。
public class XqlDialog {
public static void Dialog(Context context,final String DEVICE_ID){
final ProgressDialog xqlDialog=new ProgressDialog(context);
//实例化
xqlDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
xqlDialog.setTitle("权限校验");
xqlDialog.setMessage("权限校验中...");
xqlDialog.setIndeterminate(false);
xqlDialog.setCancelable(false);
xqlDialog.show();
Xqlasynhttp http=new Xqlasynhttp();
http.get("http://sq.51zuosi.com/qx.txt", new Xqlhanld() { //这个http的txt是保存了一些有权限的IEME,这个方法也是循环判断本机IEME是否跟服务器传过来的IEME有没有在里面
@Override
public void sussc(String qx) {
String[] qxs=qx.split("\n");
boolean q=true;
for (int i = 0; i < qxs.length; i++) {
if(DEVICE_ID.equals(qxs)){
xqlDialog.setMessage("授权成功!");
xqlDialog.dismiss();
q=false;
break;
}
}
if(q)
xqlDialog.setMessage("本机未授权,请联系箫启灵购买权限\r\n本机ID:"+DEVICE_ID);
}
});
}
}
调用方法(在你想控制的activity的onCreate方法中调用对应方法就行):
获取本机的IEME,传到我的那个类里面就OK了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.index);
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
final String DEVICE_ID = tm.getDeviceId();
XqlDialog.Dialog(this, DEVICE_ID);
}
注意:清单文件中需要加入两个权限,一个是访问网络的,一个是读取本机IEME的
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
下面提供demo跟源码
demo:
链接: http://pan.baidu.com/s/1mixVitE 密码: ei38
源码:
**** Hidden Message *****
================他人APP,smali注入加IEME校验方法,基于网络=============
以下文字只用于技术研究跟探讨。
这个效果跟上面的效果是一样的。需要准备一个带请求的TXT连接,存入的IEME值,一行代表一个权限。
步骤
1、使用反编译工具打开apk,我这里用的是apk改之理。
2、导入相应smali文件
第二步,清单文件加入权限
<uses-permission android:name="android.permission.INTERNET" /> //如果有这个权限了,就不用重复添加了
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
第三步,根据配置文件,找到主activity的smali 把一下代码放入oncreate方法中即可,第一行,或者return语句前面。
invoke-static {p0}, Lcom/xiaoqiling/XqlDialog;->Dialog(Landroid/content/Context;)V
第四步,我放入的smali文件都是自己的包名,所以你们要修改成你的那个工程文件下的包名路径。使用全局更改,可以一次改完。
在XqlDialog$1.smali跟XqlDialog.smali配置了标题,提示信息,以及txt请求连接,这些你们自己改成自己想要的。
.class public Lcom/xiaoqiling/XqlDialog;
.super Ljava/lang/Object;
.source "XqlDialog.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 11
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static Dialog(Landroid/content/Context;)V
.locals 6
.param p0, "context" # Landroid/content/Context;
.prologue
const/4 v5, 0x0
.line 14
const-string v4, "phone"
invoke-virtual {p0, v4}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
move-result-object v2
check-cast v2, Landroid/telephony/TelephonyManager;
.line 15
.local v2, "tm":Landroid/telephony/TelephonyManager;
invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
move-result-object v0
.line 16
.local v0, "DEVICE_ID":Ljava/lang/String;
new-instance v3, Landroid/app/ProgressDialog;
invoke-direct {v3, p0}, Landroid/app/ProgressDialog;-><init>(Landroid/content/Context;)V
.line 18
.local v3, "xqlDialog":Landroid/app/ProgressDialog;
invoke-virtual {v3, v5}, Landroid/app/ProgressDialog;->setProgressStyle(I)V
.line 19
const-string v4, "\u6743\u9650\u6821\u9a8c"
invoke-virtual {v3, v4}, Landroid/app/ProgressDialog;->setTitle(Ljava/lang/CharSequence;)V
.line 20
const-string v4, "\u6743\u9650\u6821\u9a8c\u4e2d..."
invoke-virtual {v3, v4}, Landroid/app/ProgressDialog;->setMessage(Ljava/lang/CharSequence;)V
.line 21
invoke-virtual {v3, v5}, Landroid/app/ProgressDialog;->setIndeterminate(Z)V
.line 22
invoke-virtual {v3, v5}, Landroid/app/ProgressDialog;->setCancelable(Z)V
.line 23
invoke-virtual {v3}, Landroid/app/ProgressDialog;->show()V
.line 24
new-instance v1, Lcom/xiaoqiling/Xqlasynhttp;
invoke-direct {v1}, Lcom/xiaoqiling/Xqlasynhttp;-><init>()V
.line 25
.local v1, "http":Lcom/xiaoqiling/Xqlasynhttp;
const-string v4, "http://sq.51zuosi.com/qx.txt"
new-instance v5, Lcom/xiaoqiling/XqlDialog$1;
invoke-direct {v5, v0, v3}, Lcom/xiaoqiling/XqlDialog$1;-><init>(Ljava/lang/String;Landroid/app/ProgressDialog;)V
invoke-virtual {v1, v4, v5}, Lcom/xiaoqiling/Xqlasynhttp;->get(Ljava/lang/String;Lcom/xiaoqiling/Xqlhanld;)V
.line 43
return-void
.end method
.class Lcom/xiaoqiling/XqlDialog$1;
.super Lcom/xiaoqiling/Xqlhanld;
.source "XqlDialog.java"
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/xiaoqiling/XqlDialog;->Dialog(Landroid/content/Context;)V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation
# instance fields
.field private final synthetic val$DEVICE_ID:Ljava/lang/String;
.field private final synthetic val$xqlDialog:Landroid/app/ProgressDialog;
# direct methods
.method constructor <init>(Ljava/lang/String;Landroid/app/ProgressDialog;)V
.locals 0
.prologue
.line 1
iput-object p1, p0, Lcom/xiaoqiling/XqlDialog$1;->val$DEVICE_ID:Ljava/lang/String;
iput-object p2, p0, Lcom/xiaoqiling/XqlDialog$1;->val$xqlDialog:Landroid/app/ProgressDialog;
.line 25
invoke-direct {p0}, Lcom/xiaoqiling/Xqlhanld;-><init>()V
return-void
.end method
# virtual methods
.method public sussc(Ljava/lang/String;)V
.locals 6
.param p1, "qx" # Ljava/lang/String;
.prologue
.line 28
const-string v3, "\n"
invoke-virtual {p1, v3}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;
move-result-object v2
.line 29
.local v2, "qxs":[Ljava/lang/String;
const/4 v1, 0x1
.line 30
.local v1, "q":Z
const/4 v0, 0x0
.local v0, "i":I
:goto_0
array-length v3, v2
if-lt v0, v3, :cond_1
.line 39
:goto_1
if-eqz v1, :cond_0
.line 40
iget-object v3, p0, Lcom/xiaoqiling/XqlDialog$1;->val$xqlDialog:Landroid/app/ProgressDialog;
new-instance v4, Ljava/lang/StringBuilder;
const-string v5, "\u672c\u673a\u672a\u6388\u6743\uff0c\u8bf7\u8054\u7cfb\u7bab\u542f\u7075\u8d2d\u4e70\u6743\u9650\uff0c\r\n\u672c\u673aID:"
invoke-direct {v4, v5}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
iget-object v5, p0, Lcom/xiaoqiling/XqlDialog$1;->val$DEVICE_ID:Ljava/lang/String;
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v4
invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v4
invoke-virtual {v3, v4}, Landroid/app/ProgressDialog;->setMessage(Ljava/lang/CharSequence;)V
.line 41
:cond_0
return-void
.line 31
:cond_1
iget-object v3, p0, Lcom/xiaoqiling/XqlDialog$1;->val$DEVICE_ID:Ljava/lang/String;
aget-object v4, v2, v0
invoke-virtual {v3, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
if-eqz v3, :cond_2
.line 32
iget-object v3, p0, Lcom/xiaoqiling/XqlDialog$1;->val$xqlDialog:Landroid/app/ProgressDialog;
const-string v4, "\u6388\u6743\u6210\u529f!"
invoke-virtual {v3, v4}, Landroid/app/ProgressDialog;->setMessage(Ljava/lang/CharSequence;)V
.line 33
iget-object v3, p0, Lcom/xiaoqiling/XqlDialog$1;->val$xqlDialog:Landroid/app/ProgressDialog;
invoke-virtual {v3}, Landroid/app/ProgressDialog;->dismiss()V
.line 34
const/4 v1, 0x0
.line 35
const/4 v3, 0x0
sput-boolean v3, Lutil/Author;->qx:Z
goto :goto_1
.line 30
:cond_2
add-int/lit8 v0, v0, 0x1
goto :goto_0
.end method
smali文件下载:
**** Hidden Message *****
http://attach.52pojie.cn/forum/201412/04/205658mk2ewbuzlgu3aeew.jpg
少年梦她暖半夏 发表于 2016-5-18 18:20
第一图是我在模拟器上安装时的安卓日志输出。界面看到的就是已停止运行
修改了一点,你用这几个文件试试
链接: http://pan.baidu.com/s/1ge5r29d 密码: qtek mgsjh 发表于 2016-5-21 10:26
萧大大给做个视频吗。第二种给现有的app加验证
{:1_926:}木有视频 沙发.... 难得前排 不错,可以加个权限,不知道大文件会不会有影响,下载来看看源码 这个估计很多人都期待已久了 前排
感谢分享 {:1_918:}这个吊这个吊.but我是java不会安卓 很不错看看看 像加个IEME权限校验挺不错的,可以用于某些APP上。注意!注意!注意!请不要非法使用 萧大侠又出精品了