刺蝴蝶De箫启灵 发表于 2016-5-3 15:19

【原创源码】教你如何给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

刺蝴蝶De箫启灵 发表于 2016-5-18 18:37

少年梦她暖半夏 发表于 2016-5-18 18:20
第一图是我在模拟器上安装时的安卓日志输出。界面看到的就是已停止运行

修改了一点,你用这几个文件试试
链接: http://pan.baidu.com/s/1ge5r29d 密码: qtek

刺蝴蝶De箫启灵 发表于 2016-5-21 11:28

mgsjh 发表于 2016-5-21 10:26
萧大大给做个视频吗。第二种给现有的app加验证

{:1_926:}木有视频

第二梦 发表于 2016-5-3 15:23

沙发....

冰楓丶殘瀷 发表于 2016-5-3 15:25

难得前排

ppszxc 发表于 2016-5-3 15:25

不错,可以加个权限,不知道大文件会不会有影响,下载来看看源码

pxhb 发表于 2016-5-3 15:26

这个估计很多人都期待已久了

Vvvvvoid 发表于 2016-5-3 15:27

前排
感谢分享

我是萌萌哒提莫 发表于 2016-5-3 15:28

{:1_918:}这个吊这个吊.but我是java不会安卓

admib木木 发表于 2016-5-3 15:36

很不错看看看

方妍心 发表于 2016-5-3 15:38

像加个IEME权限校验挺不错的,可以用于某些APP上。注意!注意!注意!请不要非法使用

myqqq 发表于 2016-5-3 15:39

萧大侠又出精品了         
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 【原创源码】教你如何给APP添加IEME权限校验