吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15759|回复: 138

[Android 原创] 《教我兄弟学Android逆向12 编写xposed模块》

    [复制链接]
会飞的丑小鸭 发表于 2019-1-9 12:45
本帖最后由 qtfreet00 于 2019-1-16 10:07 编辑

上一篇 《教我兄弟学Android逆向11 动态调试init_array我带你 用IDA动态调试了init_array段和JNI_OnLoad里面的方法,虽然你学的很吃力,但是经过自己不断上网查阅资料,花了几天的时间终于把不懂的地方弄清楚了。你从网上面加了好几个Android逆向学习交流群,看到群里面有人说xposed相关的内容,你听的云里雾里的,想到之前面试的时候面试官也问过xpose相关的问题,你对xpose更是产生了浓厚的好奇心。
那么xpose到底是什么东西呢?在开始本节课之前我们先了解一下它。
原理:
Xpose是一款特殊的安卓应用,诞生于著名的XDA论坛,它的原理是替换安卓系统/system/bin目录下的app_process来控制zygote进程,使得app_pross在启动时会加载XposedBridge.jar,从而实现对zygode进程以及其创建的虚拟机的劫持,最终对系统的某些功能实现接管。
优点:
xpose可以在我们不破坏apk自身的情况下实现对函数的hook,修改函数的参数和返回值,改变函数的结构并执行我们自己的代码,用好了xposed可以对我们的逆向过程起到事半功倍的作用。
缺点:
本身不能对so中的函数进行修改 需要结合其他框架。


看完上面的介绍我想你应该对xpose有个基本的了解了  那么本节课我们一起来揭开xpose的神秘面纱。


要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学!    --致选择


博客同步更新地址
https://blog.csdn.net/ASSYIRAN/article/details/86139496


编译环境:
AndroidStudio3.0.1版本
测试手机:
Nexus 4
所需框架和jar包:
1.XposedBridge的jar包
[color=rgba(0, 0, 0, 0.75)]主要功能是提供给Xpose的模块开发者所需的api 我们接下来开发xpose模块需要这个jar包
2.xposedInstaller框架
Xpose安装到手机的框架,用来加载我们编写出来的模块


下载链接:

https://pan.baidu.com/s/1fEShR4h1XK7yJIhOKtiYiw
提取码:vrxg


补充:
上面下载链接所给的xpose框架和模块都是事先编译好的,我们平常做项目时直接拿来用就可以。
xpose是一个开源项目,开源地址:
https://github.com/rovo89


一 .搭建hook环境用来编译框架所需要的模块
1.打开AS在项目app目录下新建lib目录并将XposedBridgeApi-54.jar放到lib目录下 右键Add As Library将jar包添加进依赖。
2.打开项目分支src/main目录下的AndroidManifest.xml 在application标签里面添加内容如下图所示:
<meta-data
        android:name="xposedmodule"
        android:value="true" />
<meta-data
        android:name="xposeddescription"
        android:value="Easy example" />
<meta-data
        android:name="xposedminversion"
        android:value="54" />
1-2-1.png


3.打开app目录下的build.gradle将
compile files('lib/XposedBridgeApi-54.jar')
更改为
provided files('lib/XposedBridgeApi-54.jar')
1-3-1.png


4.新建Hook入口类HookMain实现xposed的接口IXposedHookLoadPackage并重写方法handleLoadPackage 如图所示 这个写法格式是固定的。
[Java] 纯文本查看 复制代码
public class HookMain implements IXposedHookLoadPackage {
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
}
}



1-4-1.png


5.在src/main/assets下新建文件xposed_init并将HookMain类并将hook的主入口类以包名+类名的格式写进去。
com.example.xposed_test.HookMain
1-5-1.png


二.编写框架所需模块 Hook系统的imei检测hook环境是否配置成功
1.打开项目的MainActivity类并写一个getIMEI方法获取当前系统的imei并在程序运行的时候打印出来。
[Java] 纯文本查看 复制代码
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        Log.i("手机的imei是",getIMEI(this));
    }
    public static final String getIMEI(Context context) {
        try {
            //实例化TelephonyManager对象
            TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            //获取IMEI号
            String imei = telephonyManager.getDeviceId();
            //在次做个验证,也不是什么时候都能获取到的啊
            if (imei == null) {
                imei = "";
            }
            return imei;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

2-1-1.png


2.运行程序得到当前手机的imei 355136055053345 说明hook环境配置成功。
2-2-1.png


3.打开HookMain编写Hook imei的代码
Hook一个函数需要满足三个条件:
(1)方法的包名+类名
(2)方法名
(3)方法的参数类型


对初学者这里可能会有个疑问
(1)如何找到方法的包名+类名?
(2)如何找到方法参数类型


针对上面的两个问题这里有个小技巧,对于系统函数你要hook哪个方法就先找到这个方法的定义 这里我们要hook的方法是getDeviceId 所以我们要找到它的定义位置
2-3-1.png


2-3-2.png


2-3-3.png


4.方法的包名+类名和参数类型都知道了 下面就可以按照固定格式编写hook代码了。
[Java] 纯文本查看 复制代码
public class HookMain implements IXposedHookLoadPackage {
    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
         //固定格式
        findAndHookMethod(
                "android.telephony.TelephonyManager",  //要hook的包名+类名
                lpparam.classLoader,                   //classLoader固定
                "getDeviceId",                         //要hook的方法名
                                                       //方法参数 没有就不填
                new XC_MethodHook() {
                    @Override
                    //方法执行前执行
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    }
                    //方法执行后执行,改方法的返回值一定要在方法执行完毕后更改
                    protected void afterHookedMethod(MethodHookParam param)
                            throws Throwable {
                        param.setResult("355888888888888");

                    }
                }
        );


    }
}

2-4-1.png


5.将AndroidStudio编译出来的hook程序安装到手机 并将xposedInstaller框架安装到手机 打开xposed应用 在我们编写的模块后面打钩后点安装更新。
2-5-1.png


2-5-2.png


6.重启后打开模块运行查看log看到imei已经变成355888888888888说明hook成功。如果有没hook成功的同学可能环境没搭建好,重新来一次。
2-6-1.png


三.实战
安装并打开附件中的解锁程序apk发现程序需要输入密码才能解锁,接下来我将带你一起完成以下两个任务:
任务一
获得解锁码
任务二
解锁程序开启宝箱


要求:只能通过hook去开启宝箱,修改本地文件等视为无效。


任务一
1.用JEB打开解锁程序apk发现程序被简单混淆,我们找到MainActivity查看反编译代码
3-1-1.png


3-1-2.png


3-1-3.png




3-1-4.png


2.经过大致的分析我们知道解锁码为当前手机的androidid经过md5加密后与固定字符串hfdcxy1011进行拼接后再进行一次md5加密得到的值截取前6位。
这里我们有三种方式可以把这个解锁码打印出来
(1)我们知道第一个a方法是最后一层的加密 我们可以hook这个a方法把它的返回值打印出来 然后取其前6位为解锁码
(2)因为整个apk只有一处对substring的调用 我们可以hook系统函数substring把函数返回值打印出来
(3)通过分析知道第二个a方法为log打印的方法 我们可以Hook这个a方法的参数 把解锁码通过log打印出来


这里我给大家演示第一种hook方法
前面我们hook imei的时候已经说过了如果要hook一个方法要满足以下三个条件:
(1)方法的包名+类名
我们找打它为com.hfdcxy.android.by.test.a
(2)方法名
这里不用多提了吧,你要hook哪个方法,方法名就是哪个这里为a
(3)方法的参数类型
String
3-2-1.png


3-2-2.png


3.下面开始编写Hook代码
我们把Hook imei的那份代码复制粘贴后放到下面,按照格式修改成hook a方法的代码。还要过滤下包名防止xposed找不到包名对应的类报错 这里的包名是Manifest下的包名。
com.ss.android.ugc.aweme
3-3-1.png


3-3-2.png


HookMain类
[Java] 纯文本查看 复制代码
public class HookMain implements IXposedHookLoadPackage {
    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
        //固定格式 因为是系统函数所以无需过滤包名
        findAndHookMethod(
                "android.telephony.TelephonyManager",  //要hook的包名+类名
                lpparam.classLoader,                   //classLoader固定
                "getDeviceId",                         //要hook的方法名
                //方法参数 没有就不填
                new XC_MethodHook() {
                    @Override
                    //方法执行前执行
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    }
                    //方法执行后执行,改方法的返回值一定要在方法执行完毕后更改
                    protected void afterHookedMethod(MethodHookParam param)
                            throws Throwable {
                        param.setResult("355888888888888");

                    }
                }
        );

        if(!lpparam.packageName.equals("com.ss.android.ugc.aweme")) //这里过滤一下包名
        {
            return;
        }
        Log.i("Tiger_test","hook进入解锁程序");
        //Hook a方法
        findAndHookMethod(
                "com.hfdcxy.android.by.test.a",  //要hook的包名+类名
                lpparam.classLoader,                   //classLoader固定
                "a",                                   //要hook的方法名
                String.class,                          //方法的参数类型 这里为String类
                new XC_MethodHook() {
                    @Override
                    //方法执行前执行
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    }
                    //方法执行后执行,改方法的返回值一定要在方法执行完毕后更改
                    protected void afterHookedMethod(MethodHookParam param)
                            throws Throwable {
                        Log.i("Tiger_test","a方法的第一个参数为:"+param.args[0].toString());//param.args[0]为方法的第一个参数,同理param.args[1]为第二个参数
                        Log.i("Tiger_test","a方法的返回值为:"+param.getResult());//方法的返回值只能放在afterHookedMethod中获取
                        //以下为修改
                        //param.args[0] = "235wtwerteq"  //如果要修改第一个参数可以直接这样写
                        //param.setResult("7f769c0f91efd402a23d63627f48f03e");   //param.setResult修改方法的返回值
                    }
                }
        );
    }
}





4.编译项目并安装到手机,xposed框架打钩模块,安装并更新重启后打开解锁程序随便输入一个解锁码点击解锁,可以看到a方法的参数和返回值已经被我们通过log打印出来了,因为a方法在程序中被调用了两次所以这里打印了两次。
我们只需看最后一次的返回值即可,取前6位可以看到我的手机的解锁码为4567d2
3-4-1.png


5.输入这个解锁码点击解锁 出现如图所示的界面说明解锁码正确 任务一获取解锁码也就完成了。
3-5-1.png


下面我们开看下任务二
1.任务二要求解锁程序开启宝箱,我们看到这个界面有两个按钮一个是充值1金币,另一个按钮是开启宝箱。测试发现这里我不断手点充值1金币把金币总量充值到100还是开启不了宝箱,提示金币不足,请充值。
work-1-1.png


2.我们继续分析代码,发现输入正确的解锁码后程序会跳转到DrawActivity类,这个类中有两个onClick 第一个是充值的onClick第二个是开启宝箱,分析发现只有金币大于9999时才能开启宝箱。
这里我们有两种方法去开启宝箱
(1)用手不断点击充值1金币,需要点9999次,这无疑是太耗费时间的,所以不可取。
(2)直接Hook第一个onClick里面的a方法把第三个参数改成10000即可开启宝箱。
work-2-1.png


work-2-2.png


work-2-3.png


3.编写hook代码
找到hook所需要的三个条件:
(1)方法的包名+类名
我们找打它为com.hfdcxy.android.by.test.b
(2)方法名
这里不用多提了吧,你要hook哪个方法,方法名就是哪个这里为a
(3)方法的参数类型 这里有三个
SharedPreferences
TextView
int
work-3-1.png


HookMain类
[Java] 纯文本查看 复制代码
public class HookMain implements IXposedHookLoadPackage {
    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
        //固定格式
        findAndHookMethod(
                "android.telephony.TelephonyManager",  //要hook的包名+类名
                lpparam.classLoader,                   //classLoader固定
                "getDeviceId",                         //要hook的方法名
                //方法参数 没有就不填
                new XC_MethodHook() {
                    @Override
                    //方法执行前执行
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    }
                    //方法执行后执行,改方法的返回值一定要在方法执行完毕后更改
                    protected void afterHookedMethod(MethodHookParam param)
                            throws Throwable {
                        param.setResult("355888888888888");

                    }
                }
        );

        if(!lpparam.packageName.equals("com.ss.android.ugc.aweme")) //这里过滤一下包名
        {
            return;
        }
        Log.i("Tiger_test","hook进入解锁程序");
        //Hook a方法
        findAndHookMethod(
                "com.hfdcxy.android.by.test.a",  //要hook的包名+类名
                lpparam.classLoader,                   //classLoader固定
                "a",                                   //要hook的方法名
                String.class,                          //方法的参数类型 这里为String类
                new XC_MethodHook() {
                    @Override
                    //方法执行前执行,修改参数的地方
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    }
                    //方法执行后执行,修改方法的返回值的地方
                    protected void afterHookedMethod(MethodHookParam param)
                            throws Throwable {
                        Log.i("Tiger_test","a方法的第一个参数为:"+param.args[0].toString());//param.args[0]为方法的第一个参数,同理param.args[1]为第二个参数
                        Log.i("Tiger_test","a方法的返回值为:"+param.getResult());//方法的返回值只能放在afterHookedMethod中获取
                        //以下为修改
                        //param.args[0] = "235wtwerteq"  //如果要修改第一个参数可以直接这样写
                        //param.setResult("7f769c0f91efd402a23d63627f48f03e");   //param.setResult修改方法的返回值
                    }
                }
        );
            findAndHookMethod(
                    "com.hfdcxy.android.by.test.b",  //要hook的包名+类名
                    lpparam.classLoader,             //classLoader固定
                    "a",                             //要hook的方法名
                    SharedPreferences.class,         //方法的参数类型
                    TextView.class,                  //方法的参数类型
                    int.class,                       //方法的参数类型
                    new XC_MethodHook() {
                        @Override
                        //方法执行前执行,修改参数的地方
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            param.args[2] = 10000;  //注意修改参数要放在beforeHookedMethod里面写
                            Log.i("Tiger_test","成功充值一万金币");
                        }
                        //方法执行后执行,修改方法的返回值的地方
                        protected void afterHookedMethod(MethodHookParam param)
                                throws Throwable {
                        }
                    }
            );
        }
}



4.编译xposed框架安装模块,打开解锁程序输入解锁码后点击充值1金币,然后点击开启宝箱。显示弹框开启成功,获得xposed新手称号。
work-4-1.png


work-4-2.png


work-4-3.jpg


四.总结
本节课我们首先了解了xpose的基本原理并一起搭建了xpose的hook环境。接下来我们又一起用xpose破解了解锁程序这个apk,通过对本节课的学习我想你对xpose已经有了一个全新的认识。环境搭建有问题的的同学可以直接把下面的课堂Demo导入到项目中去学习,课堂上面讲解的内容一定要多加练习,看不懂的要多百度,百度上面有很多关于xpose的教程,各种教程对比着来学习,总能理解的。


五.课后作业
1.hook本节课例子中的其他函数获取解锁码
2.hook修改极品美女找茬游戏中的金币余额为999


游戏下载链接
https://blog.csdn.net/ASSYIRAN/article/details/86014551


六.进阶
课堂作业完成后请参考以下两条链接,并自己编写对应模块练习里面的例子,完成对xpose的进阶。
http://www.cnblogs.com/gordon0918/p/6732100.html
https://bbs.pediy.com/thread-225190-1.htm


课堂Demo
链接:https://pan.baidu.com/s/1uTkofcZIORJeAscXIRaf6g
提取码:6vi6


解锁程序.zip

742.69 KB, 下载次数: 79, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 78吾爱币 +79 热心值 +73 收起 理由
satellite0226 + 1 + 1 用心讨论,共获提升!
漆黑的骨头 + 1 + 1 热心回复!
Moyuan + 1 + 1 热心回复!
虞珂啊 + 1 + 1 太强了!感谢!
xiong_online + 1 + 1 用心讨论,共获提升!
一点丶心动 + 1 + 1 谢谢@Thanks!
dashui6 + 1 可以很棒棒!留着学习
qianeymax6274 + 1 + 1 用心讨论,共获提升!
汉城路一哥 + 1 热心回复!
linzi + 1 + 1 谢谢@Thanks!
杀猪用牛刀 + 1 + 1 好兄弟,系列继续出,写得太好了!
YCXS + 1 + 1 谢谢@Thanks!
moyu2 + 1 + 1 谢谢大佬抽时间写教程
chilun + 1 + 1 用心讨论,共获提升!
轩可雅 + 1 谢谢@Thanks!
Seper + 1 + 1 我很赞同!
zhangzhaoshuai + 1 + 1 我很赞同!
又红又专 + 1 + 1 热心回复!
hitpan + 1 + 1 用心讨论,共获提升!
成都 + 1 + 1 谢谢@Thanks!
YCAPTAIN + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
youhen233 + 1 + 1 谢谢@Thanks!
a804853956 + 1 + 1 热心回复!
Sen + 1 + 1 Nice, 最近正在入Xp门~~
78765403 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
莽撞人 + 1 + 1 谢谢@Thanks!
pj3008 + 1 + 1 谢谢@Thanks!
laohucai + 1 + 1 谢谢@Thanks!
lanlana + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
jaffa + 1 谢谢@Thanks!
wllovexiaoma + 1 + 1 热心回复!
ya979 + 1 + 1 谢谢@Thanks!
Kn1ht + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
jnez112358 + 1 + 1 谢谢@Thanks!
Roman_Black + 1 + 1 谢谢@Thanks!
狐狼 + 1 + 1 厉害了,留名,收藏
siuhoapdou + 1 + 1 谢谢@Thanks!
这是追求不是梦 + 1 + 1 用心讨论,共获提升!
福利姬 + 1 + 1 谢谢@Thanks!
hxddtc + 1 用心讨论,共获提升!
wyf3809 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
东哥在雨中 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
liluoyuan + 1 感谢,正在寻找这个教程!
gongyong728125 + 1 + 1 热心回复!
ym1 + 1 + 1 用心讨论,共获提升!
halo_o + 1 我很赞同!
秃然一笑 + 1 + 1 谢谢@Thanks!
夕阳下的背影 + 1 + 1 用心讨论,共获提升!
l1679668663 + 1 + 1 谢谢@Thanks!
enjon + 1 + 1 我很赞同!
459731069 + 1 + 1 热心回复!
一个悲桑的问题 + 1 + 1 谢谢@Thanks!
manloss + 1 + 1 谢谢 @Thanks!
sunnylds7 + 1 + 1 热心回复!
soha1018 + 2 + 1 谢谢@Thanks!
dibh10 + 1 + 1 用心讨论,共获提升!
多幸运遇见baby + 1 + 1 用心讨论,共获提升!
killov07 + 1 + 1 用心讨论,共获提升!
tztt3033 + 1 + 1 用心讨论,共获提升!
静叶流云 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lookerJ + 1 谢谢@Thanks!
qq2619577 + 1 + 1 用心讨论,共获提升!
禁惹尘埃 + 1 + 1 iOSer前来学习。涨见识了通熟易懂
tong_wen2504 + 1 谢谢@Thanks!
笙若 + 2 + 1 谢谢@Thanks!
wflb826 + 1 + 1 用心讨论,共获提升!
netle8 + 2 + 1 谢谢@Thanks!
xwzj20170829 + 1 + 1 谢谢@Thanks!
mz135135 + 2 + 1 用心讨论,共获提升!
superzhangxue + 1 + 1 我很赞同!
莫问刀 + 1 + 1 大佬终于更新,写的很好
涛之雨 + 2 + 1 特来评分,收藏。。。从头看起吧。。。
骑龟赛跑 + 1 + 1 大神更新,必须跟进!
丶咖啡猫丶 + 1 + 1 谢谢@Thanks!
ll2sinan2 + 1 + 1 你为论坛做的贡献有目共睹 评分献上 不成敬意
stars-one + 1 + 1 我很赞同!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lyrong + 1 + 1 羡慕懂技术的大神~!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Lyxin_c 发表于 2019-1-18 10:52
你好,我在运行的时候出现两个问题。

1.我使用virtualAPP去hook函数getDeviceId能够成功,但是使用xposed installers就无效,这是为什么.
2.在beforeHookedMethod无法获取到hook之前的值呢?

[Java] 纯文本查看 复制代码
       if (loadPackageParam.packageName.equals("com.example.pc4001.test_getuid")) {
            XposedHelpers.findAndHookMethod(
                    "android.telephony.TelephonyManager",
                    loadPackageParam.classLoader,
                    "getDeviceId",
                    new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        }

                        protected void afterHookedMethod(MethodHookParam param)
                                throws Throwable {
                            param.setResult("355888888888888");
                        }
                    }
            );
        }
Vegetable_Cat 发表于 2019-4-15 17:47
后排提示:
本人在最新的AS3.3.2 测试机Android8.1环境下进行复现,遇到一些问题,整理如下:
目前为支持新版Android,xposedbridge广泛使用82版本,官方下载地址(需要科学上网):
https://bintray.com/rovo89/de.robv.android.xposed/api
也可在网上自行搜索
为适应新版AS,gradle文件的dependencies应作如下调整,注:我将bridgeapi放入了libs文件夹中
再注:请删除自动生成的
[Java] 纯文本查看 复制代码
fileTree(include: ['*.jar'], dir: 'libs')

理由:Xposed里已有该JAR包内容,再次打包进去会冲突,就会导致handleLoadPackage没有回调。
没有自动生成就最好啦。
[Java] 纯文本查看 复制代码
dependencies {
    
    //provided 有错就替换为 compileOnly
    compileOnly files('libs/api-82.jar')
    compileOnly files('libs/api-82-sources.jar')
    //如果需要可以引入文档,
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

其他基本问题不大,但是hook总是失败,增加日志输出后,发现hook类未被调用。
经查阅资料,发现与AS下Instant run功能有关,参考资料:https://www.cnblogs.com/JipengYe/p/10044715.html
2019-04-15_145620.png
去除对勾,即关闭该功能。
然而在AS下进行安装调试,依然无法hook。
之后将APK打包,在手机上直接安装,hook成功
2019-04-15_173819.png
TIM图片20190415174502.png
ZuiShuai-Song 发表于 2019-1-9 12:55
田田爱崽崽 发表于 2019-1-9 12:55
感谢楼主,终于又在继续更新了,谢谢
13551494196 发表于 2019-1-9 12:59
感谢分享
xtkj4382 发表于 2019-1-9 13:00
谢谢分享。
飞天蜗牛 发表于 2019-1-9 13:12
感谢楼主分享技术
stars-one 发表于 2019-1-9 13:45
膜拜大佬!
cqom 发表于 2019-1-9 13:55
这个必须顶
罗茂松 发表于 2019-1-9 14:56
这个很不错,看看
识者择势 发表于 2019-1-9 15:42
太专业了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-4-19 18:59

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表