位置:首页 » 技术 » Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

日期:2016-02-10 阅读:3num
Advertisement

本系列文章是《Android软件安全与逆向分析》的实践笔记(一些工具的版本和用法已经不同了),同时笔者希望系统性地记录一下逆向方面的文字和想法。

逆向工程(又称反向工程),是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是,在不能轻易获得必要的生产信息下,直接从成品的分析,推导出产品的设计原理。

逆向工程可能会被误认为是对知识产权的严重侵害,但是在实际应用上,反而可能会保护知识产权所有者。例如在集成电路领域,如果怀疑某公司侵犯知识产权,可以用逆向工程技术来寻找证据。 —— [ 维基百科 ]

首篇作为开始,先讲讲简单的反编译。反编译通常有几种目的:互相学习、借来用用、嘿嘿(干你,又分为小干干类似微信红包,和大干干改别人的apk帮他上架)。

因为没带kvm回来,mbpr屏幕太小,所以下文环境为windows。

反编译

让我们从实战开始,先实践一下怎么去反编译一个apk,看看某些功能的实现。毕竟没有实践的原理都是耍流氓。这里我们保留互相学习的心态,所以是友善的第一种目的,嘻嘻。

准备

工具

安装包

  • 手机QQ 6.2.3 (目标就设定为看看口令红包是怎么做的吧)

Apktool的使用

首先确保你安装了java 7或以上,并能直接在命令行调用 java

  1. 下载 windows用wrapper脚本 ( mac使用这个 )。
  2. 下载最新的 apktool
  3. 重命名上面下载的apktool jar文件为 apktool.jar
  4. 把apktool.bat和apktool.jar放在同一个目录下,并加入PATH环境变量。
  5. 现在你可以直接通过命令行调用 apktool 并查看使用方式了。
Apktool v2.0.3 - a tool for reengineering Android apk fileswith smali v2.1.0 and baksmali v2.1.0

usage: apktool -advance,--advanced   prints advance information. -version,--version    prints the version then exits

usage: apktool if|install-framework [options] <framework.apk> -p,--frame-path <dir>   Stores framework files into <dir>. -t,--tag <tag>          Tag frameworks using <tag>.

usage: apktool d[ecode] [options] <file_apk> -f,--force              Force delete destination directory. -o,--output <dir>       The name of folder that gets written. Default is apk.out -p,--frame-path <dir>   Uses framework files located in <dir>. -r,--no-res             Do not decode resources. -s,--no-src             Do not decode sources. -t,--frame-tag <tag>    Uses framework files tagged by <tag>.

usage: apktool b[uild] [options] <app_path> -f,--force-all          Skip changes detection and build all files. -o,--output <dir>       The name of apk that gets written. Default is dist/name.apk -p,--frame-path <dir>   Uses framework files located in <dir>.

jadx的使用

  1. 下载 jadx
  2. 运行gradlew dist编译。
  3. jadx\jadx-gui\build\install\jadx-gui\bin 下有可运行的gui
  4. jadx\jadx-cli\build\install\jadx\bin 是命令行程序
  5. 可以都加入PATH环境变量,以便直接命令行调用。

分析APK文件

First Try

虽然我们可以用jadx直接打开apk傻瓜式地去查看源代码,但是为了更理解反编译的过程和工作原理,以便以后在碰到一些问题(比如加壳)的时候可以自己解决,这里我们先装逼一下,使用Apktool去进行分析。

D:\dev\reverse>apktool d -o qq mobileqq_android_6.2.3.apkI: Using Apktool 2.0.3 on mobileqq_android_6.2.3.apkI: Loading resource table...Exception in thread "main" brut.androlib.AndrolibException: Multiple res specs: attr/name        at brut.androlib.res.data.ResTypeSpec.addResSpec(ResTypeSpec.java:78)        at brut.androlib.res.decoder.ARSCDecoder.readEntry(ARSCDecoder.java:248)        at brut.androlib.res.decoder.ARSCDecoder.readTableType(ARSCDecoder.java:212)        at brut.androlib.res.decoder.ARSCDecoder.readTableTypeSpec(ARSCDecoder.java:154)        at brut.androlib.res.decoder.ARSCDecoder.readTablePackage(ARSCDecoder.java:116)        at brut.androlib.res.decoder.ARSCDecoder.readTableHeader(ARSCDecoder.java:78)        at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:47)        at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:544)        at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:63)        at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:55)        at brut.androlib.Androlib.getResTable(Androlib.java:66)        at brut.androlib.ApkDecoder.setTargetSdkVersion(ApkDecoder.java:198)        at brut.androlib.ApkDecoder.decode(ApkDecoder.java:96)        at brut.apktool.Main.cmdDecode(Main.java:165)        at brut.apktool.Main.main(Main.java:81)

竟然报错了,Multiple res specs: attr/name,在网上找了找资料,应该是腾讯利用Apktool的bug去进行了加壳,除了添加同名id外还做了若干加固,好,你狠,我们下篇文章针对腾讯的壳来分析并修改Apktool,这次先用jadx来试试。

Second Try

如果直接用jadx-gui打开QQ的apk,你会发现,卡死了。不错,就是卡死了,因为太大了…

我们打开jadx-gui文件(其实就是个启动的script),加上:

set JAVA_OPTS=-server -Xms1024m -Xmx8192m -XX:PermSize=256m -XX:MaxPermSize=1024m

就跟我们加速as/idea差不多,这样就能顺利地打开了(可能会需要比较久的时间)。

Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

字符串大法

为了找到我们的目标,红包,我们首先尝试用字符串搜索大法:在Resources -> resources.arsc -> res -> values -> strings.xml找到口令红包对应的

<string name="qb_hbdetail_command_word">口令红包</string>

然后Crtl+Shift+F进行Text Search,结果…没找到。

我们再使用资源id大法,直接在resources.arsc找到

0x7f0a0e5a (2131365466) = string.qb_hbdetail_command_word: 口令红包

再搜,好,你狠。。。还是没有。是在下输了。

类/函数名大法

我们再祭出第二大杀器,类/函数/变量名大法搜索大法。

通常类名符合的范围更小,所以先只使用Class。

试试看红包的英语:RedPacket(类名命名所以R和P大写)

Android逆向分析(一) - 反编译看看手Q口令红包的实现原理


OK,我们找到了十几条,开始逐一排查,第一条 RedPacketInfo 点进去一看就是个包含了各种field的ui用的vo类,跳过,再看下一个,从包名 com.tencent.mobileqq.data 看上去,似乎有戏, QQWalletRedPacketMsg :

package com.tencent.mobileqq.data;

import android.text.TextUtils;import com.tencent.mobileqq.hotpatch.NotVerifyClass;import cooperation.qzone.util.WiFiDash;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectOutput;import tencent.im.msg.im_msg_body.QQWalletAioBody;

/* compiled from: ProGuard */public class QQWalletRedPacketMsg {    public String authkey;    private int channelId;    public int conftype;    public QQWalletTransferMsgElem elem;    public String envelopeName;    public int envelopeid;    public boolean isOpened;    public int msgFrom;    public String redPacketId;    public int redtype;    private int resend;    public int templateId;

...串行化、读写、构建方法等,可以无视。

从field名来看,这里还是比较可疑的,猜测 redtype 是不是描述红包类型的。

我们再次使用关键词 redtype 进行搜索,这次选择Code,只进行代码内搜索,结果却发现貌似不对,找到相关的字符串是”查看详情”,貌似是描述红包领取状态的。

不放弃,继续抓住 QQWalletRedPacketMsg 这个类进行搜索,看看是不是有外面包着这个类的Class,搜索QQWalletRedPacketMsg,范围使用Field,排除掉类本身外,只有唯一的结果: MessageForQQWalletMsg :

public class MessageForQQWalletMsg extends ChatMessage {    // 哦哦?COMMAND_REDPACKET?口令红包    public static final int MSG_TYPE_COMMAND_REDPACKET = 6;    public static final int MSG_TYPE_COMMON_REDPACKET = 2;    public static final int MSG_TYPE_COMMON_THEME_REDPACKET = 4;    public static final int MSG_TYPE_INDIVIDUAL_REDPACKET = 2001;    public static final int MSG_TYPE_LUCY_REDPACKET = 3;    public static final int MSG_TYPE_LUCY_THEME_REDPACKET = 5;    public static final int MSG_TYPE_PUBLIC_ACCOUNT_REDPACKET = 2002;    public static final int MSG_TYPE_TRANSFER = 1;    ...

我们找到了一个常量字段,目测就是这个描述了是否是口令红包了。在该类搜索此字段还找到

public static boolean isCommandRedPacketMsg(MessageRecord messageRecord) {    if (messageRecord != null && (messageRecord instanceof MessageForQQWalletMsg) && ((MessageForQQWalletMsg) messageRecord).messageType == MSG_TYPE_COMMAND_REDPACKET) {        return true;    }    return false;}

果然,我们再接着分别查找 MSG_TYPE_COMMAND_REDPACKETisCommandRedPacketMsg ,结果只在 TroopMessageManager 里面找到了一段没成功反编译的代码中对方法 isCommandRedPacketMsg 的引用:

L_0x0100:    r2 = com.tencent.mobileqq.data.MessageForQQWalletMsg.isCommandRedPacketMsg(r25);    if (r2 == 0) goto L_0x011e;

这里如果是口令红包会继续走下去,而如果不是则会跳到L_0x011e。

而从类的名字来看, TroopMessageManager 应该是指 群消息管理者 ,应该没错,毕竟红包也是群消息的一种。

于是我们只能耐心地看下去这段神奇的充满goto的代码。晕着看完后大概看到就是各种逻辑判断和调用 MsgProxyUtils.java 去处理消息处理逻辑和缓存。然后就没了…好,你屌,是在下输了。我再试试别的。

常量大法

常量大法其实也可以算是字符串搜索的一种,只是不去搜索xml里的,而是使用中文转化为unicode后的字符串去进行查找。自行搜索Unicode编码转化可以找到online convertor。

口令红包对应的是”\u53e3\u4ee4\u7ea2\u5305”:

Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

找到2个类共3处代码引用。

最后那个类的起名有点耐人寻味, PasswdRedBagManager ,密码红包管理器,有点意思:

public void b(String str) {    ((TroopTipsMsgMgr) this.f2203a.getManager(80)).a(str, "\u533f\u540d\u4e0d\u80fd\u62a2\u53e3\u4ee4\u7ea2\u5305\u54e6", NetConnInfoCenter.getServerTime(), BaseConstants.DEFAULT_QUICK_HEARTBEAT_TIMEOUT, f);}

这串Unicode转换成中文后是”匿名不能抢口令红包哦”,原来还有这种逻辑,产品经理你真是够了。

这里我们重新从该类的上面看下来,大致扫一扫,发现onDestroy下面有一个方法打的log很神奇:

public long[] m883a(SessionInfo sessionInfo, String str) {    if (QLog.isColorLevel()) {        QLog.d(f2197a, (int) h, "openPasswdRedBagByPassword, passwd = " + str);    }    long[] jArr = new long[]{0, 0};    if (sessionInfo == null) {        return jArr;    }    if (TextUtils.isEmpty(str)) {        return jArr;    }    c();    List<String> list = (List) this.f2206a.get(str);    if (list == null || list.isEmpty()) {        return jArr;    }    PasswdRedBagInfo passwdRedBagInfo;    String str2 = a(sessionInfo.a) + "_" + sessionInfo.f1757a;    for (String str3 : list) {        HashMap hashMap = (HashMap) this.f2209b.get(str3);        if (hashMap != null) {            passwdRedBagInfo = (PasswdRedBagInfo) hashMap.get(str2);            if (!(passwdRedBagInfo == null || a(str3))) {                jArr[g] = passwdRedBagInfo.a.uint64_creator_uin.get();                if (!b(str3)) {                    if (!c(str3)) {                        hashMap.put(str2, passwdRedBagInfo);                        jArr[f] = 1;                        break;                    }                    jArr[f] = 3;                } else {                    jArr[f] = 2;                }            }        }    }    passwdRedBagInfo = null;    if (passwdRedBagInfo == null) {        return jArr;    }    b(sessionInfo.a, sessionInfo.f1757a, passwdRedBagInfo.a.string_redbag_id.get().toStringUtf8());    a(sessionInfo, passwdRedBagInfo);    return jArr;}

isColorLevel目测是某种debug用的tag,可能某些环境下部分用户会打开,而从log结合我们平时打log习惯来看,这个方法应该就叫 openPasswdRedBagByPassword 了,第二个参数就是 password 。终于找到了。看一下逻辑大致是从外面load进来所有红包信息到本类的各种hashmap和list(有一个tag,只会加载第一次,本类多个方法都会调用这个方法),然后根据password从里面找到对应 passwdRedBagInfo ,设置result tag,然后调用了

b(sessionInfo.a, sessionInfo.f1757a, passwdRedBagInfo.a.string_redbag_id.get().toStringUtf8());a(sessionInfo, passwdRedBagInfo);

我们先不急看这两个方法是做什么的。再往下看下一个方法,直接就有:

public long[] b(SessionInfo sessionInfo, String str) {    if (QLog.isColorLevel()) {        QLog.d(f2197a, (int) h, "openPasswdRedBagById, id = " + str);    }

openPasswdRedBagById 用id打开红包,猜测该id就是我们最早看到的结构里的 redPacketId 字段。

而该方法同样调用了

b(sessionInfo.a, sessionInfo.f1757a, str);a(sessionInfo, passwdRedBagInfo);

看看这两个方法:

public void a(SessionInfo sessionInfo, PasswdRedBagInfo passwdRedBagInfo) {    if (sessionInfo != null && passwdRedBagInfo != null) {        Object obj = (sessionInfo.a == 0 || sessionInfo.a == h || sessionInfo.a == Action.ACTION_REGISTNEWACCOUNT_COMMITSMS || sessionInfo.a == Action.ACTION_LOGIN) ? g : null;        String str = sessionInfo.f1757a;        String valueOf = String.valueOf(passwdRedBagInfo.a.uint64_creator_uin.get());        if (obj != null) {            str = valueOf.equals(this.f2213d) ? sessionInfo.f1757a : this.f2213d;        }        JSONObject a = QQWalletMsgItemBuilder.a(this.f2203a, sessionInfo, passwdRedBagInfo.a.string_redbag_id.get().toStringUtf8(), passwdRedBagInfo.a.string_authkey.get().toStringUtf8(), str, "appid#1344242394|bargainor_id#1000030201|channel#msg", "graphb", null);        Bundle bundle = new Bundle();        bundle.putString("json", a.toString());        bundle.putString("callbackSn", jbi.a);        Intent intent = new Intent(this.f2200a, PayBridgeActivity.class);        intent.putExtras(bundle);        intent.addFlags(268435456);        intent.putExtra("pay_requestcode", 5);        this.f2200a.startActivity(intent);    }}

public void b(int i, String str, String str2) {    if (!TextUtils.isEmpty(str2)) {        HashMap hashMap = (HashMap) this.f2209b.get(str2);        if (hashMap != null) {            PasswdRedBagInfo passwdRedBagInfo = (PasswdRedBagInfo) hashMap.get(a(i) + "_" + str);            if (passwdRedBagInfo != null && !passwdRedBagInfo.f4810a) {                passwdRedBagInfo.f4810a = true;                ThreadManager.a(new kmr(this, str2), h, null, true);            }        }    }}

发现第一个方法似乎就直接发请求了,看来只要调用到这里,就是可以领红包了。那最初又是如何来这里的呢?我们搜索对 PasswdRedBagManager 内这两个方法的引用找到 BaseChatPie.java :

...public PasswdRedBagManager f25190a;...public class EnterForSend implements OnKeyListener, OnEditorActionListener {    ...  // 这里从方法名判断是每次输入后    public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {        if (i != BaseChatPie.dr) {            return false;        }        String obj = this.a.f25220a.getText().toString();        if (obj.length() > 0) {          // 调用了下面的方法!            long[] a = this.a.a(obj);            SendMsgParams sendMsgParams = new SendMsgParams();            sendMsgParams.b = this.a.dL;            sendMsgParams.a = this.a.dJ;            sendMsgParams.c = this.a.dN;            sendMsgParams.f26863c = this.a.dL;            ...        }        return true;    }}

// 这里调用了那2个openPasswdRedBagxxx方法public long[] m5613a(String str) {    long[] jArr = null;    if (!AnonymousChatHelper.a().a(this.f25174a.a)) {        if (TextUtils.isEmpty(this.f25269d) || !str.equals(this.f25278e)) {            jArr = this.f25190a.a(this.f25174a, str);        } else {            jArr = this.f25190a.b(this.f25174a, this.f25269d);        }        if (jArr != null && jArr[s] == 1) {            this.f25269d = QunUppUploadTask.QunUppAppId;            this.f25278e = QunUppUploadTask.QunUppAppId;            this.f25228a.sendEmptyMessage(dz);            if (QLog.isColorLevel()) {                QLog.d(PasswdRedBagManager.a, u, "passwdredbags result[0]=" + jArr[s] + ",result[1]=" + jArr[t] + ",send str=" + str);            }        }    } else if (QLog.isColorLevel()) {        QLog.d(PasswdRedBagManager.a, u, "current is in Anonymous, dont search passwdredbags");    }    return jArr;}

可见每次我们输入消息发送时,都发生了判断,会去查询是不是红包口令,如果是则直接发请求拿红包然后继续,否则直接当做普通消息继续发送。所以如果想要做自动抢红包的话,其实只要直接在收到消息时,调用 PasswdRedBagManager 的open方法即可,连模拟UI、生成请求、发送消息都不用了,我们再也不用昧着良心说口令了。

总结和下期预告

经过上文的折腾,我们成功反编译了手机QQ,并追溯到手机QQ红包的数据结构和判断流程。期间经历过数次无用功,但逆向工程正是这么一回事,尤其是静态分析,如果不及时找其他的路,而一路钻牛角尖从一个线索一路去看,很可能会越陷越深,本文的跟踪流程正是不断在坑还小的时候钻出来,然后去找其他的路径,最后才快速地找到了想看的东西。

至于下一期,可能是smali,可能是怎么修改Apktool,也可能是jadx的源码分析,看心情吧,哈哈。

参考资料:

http://www.mak-blog.com/tencent-shell-crack.html

http://www.kanxue.com/bbs/showthread.php?p=1390763&langid=3

相关文章
  • Android逆向分析(一) - 反编译看看手Q口令红包的实现原理 Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

    本系列文章是<Android软件安全与逆向分析>的实践笔记(一些工具的版本和用法已经不同了),同时笔者希望系统性地记录一下逆向方面的文字和想法. 逆向工程(又称反向工程),是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程.组织结构.功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品.逆向工程源于商业及军事领域中的硬件分析.其主要目的是,在不能轻易获得必要的生产信息下,直接从成品的分析,推导出产品的设计原理. 逆向工程可能会被误认为是对知识产权的严重

  • Android逆向之旅-反编译利器Apktool和Jadx源码分析以及异常纠正 Android逆向之旅-反编译利器Apktool和Jadx源码分析以及异常纠正

    Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正 一.前言 在之前的破解过程中可以看到我们唯一离不开的一个神器那就是apktool了,这个工具多强大就不多说了,但是如果没有他我们没法涉及到后面的破解工作了,这个工具是开源的,也是使用Java语言开发的,代码相对简单,我们今天就来分析一下他的大体逻辑,注意是大体逻辑哦,因为如果要一行一行代码分析,首先觉得没必要,其次浪费时间,有了源码,谁看不懂呢.至于为什么要分析这个工具其实原因只有一个,就是我们在之前的反编译过程

  • Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正 Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正

    一.前言 在之前的破解过程中可以看到我们唯一离不开的一个神器那就是apktool了,这个工具多强大就不多说了,但是如果没有他我们没法涉及到后面的破解工作了,这个工具是开源的,也是使用Java语言开发的,代码相对简单,我们今天就来分析一下他的大体逻辑,注意是大体逻辑哦,因为如果要一行一行代码分析,首先觉得没必要,其次浪费时间,有了源码,谁看不懂呢.至于为什么要分析这个工具其实原因只有一个,就是我们在之前的反编译过程中会发现,总是有那么几个apk应用不让我们那么容易的反编译,他们就利用apktool

  • Android逆向分析源码中资源代码复原小工具

    Android逆向分析源码中资源代码还原小工具 一般情况下,我们采用apktool(xml资源)+dex2jar+JDGui(jar to java)反编译android apk之后的代码中,涉及到资源索引的信息全部替换成了十进制的数字. 如何将这些数字还原成为原始的资源索引形式呢? public g(Context paramContext) { super(paramContext); b(2130903088); this.b = ((FirModule)this.k.N().a("fir

  • Android逆向之旅-解析编译以后的Dex文件格式 Android逆向之旅-解析编译以后的Dex文件格式

    Android逆向之旅---解析编译之后的Dex文件格式 一.前言 新的一年又开始了,大家是否还记得去年年末的时候,我们还有一件事没有做,那就是解析Android中编译之后的classes.dex文件格式,我们在去年的时候已经介绍了: 如何解析编译之后的xml文件格式: http://blog.csdn.net/jiangwei0910410003/article/details/50568487 如何解析编译之后的resource.arsc文件格式: http://blog.csdn.net/

  • Android逆向之旅-解析编译以后的AndroidManifest文件格式 Android逆向之旅-解析编译以后的AndroidManifest文件格式

    Android逆向之旅---解析编译之后的AndroidManifest文件格式 一.前言 今天又是周六了,闲来无事,只能写文章了呀,今天我们继续来看逆向的相关知识,我们今天来介绍一下Android中的AndroidManifest文件格式的内容,有的同学可能好奇了,AndroidManifest文件格式有啥好说的呢?不会是介绍那些标签和属性是怎么用的吧?那肯定不会,介绍那些知识有点无聊了,而且和我们的逆向也没关系,我们今天要介绍的是Android中编译之后的AndroidManifest文件的

  • Android逆向分析之APKTool Android逆向分析之APKTool

    由于刚踏入Android逆向分析领域,因此有许多的不懂,所以得不断地去学习. 因为是入门,我又有一定的Android应用开发基础,所以先从一些简单工程的反编译开始入手,先了解一些反编译所用到的工具. 上一次写博客,记录了反编译工具dex2jar和jd-gui 的使用,这次继续记录另一款比较强大的反编译工具APKTool. 该工具的使用方法很简单,只需要在dos控制台里输入apktool d xxx.apk 则可以在当前文件夹生成一个装有该APK的smali文件夹. 通过记事本可打开smali文件

  • Android系统安全跟反编译实战——互动出版网 Android系统安全跟反编译实战——互动出版网

    Android系统安全和反编译实战--互动出版网 这篇是计算机类的优质预售推荐>>>><Android系统安全和反编译实战> Android安全专家写作,从Android系统安全机制介绍到综合实例演练,是完整学习Android系统安全知识的必备指南 内容简介 <Android系统安全和反编译实战>循序渐进地讲解了Android系统安全方面的基本知识,从Android系统介绍开始到综合实例的实战过程,全程剖析了Android系统安全.应用安全开发和加密.解密方

  • Android札记:防反编译、混淆文件proguard.cfg与proguard-project.txt详解

    Android笔记:防反编译.混淆文件proguard.cfg与proguard-project.txt详解 ===========[转]混淆文件proguard.cfg详解====================================== -injars androidtest.jar[jar包所在地址] -outjars out[输出地址] -libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' [

  • Proguard android代码搅混 防止反编译 Proguard android代码搅混 防止反编译

    Proguard android代码混淆 防止反编译 要达到代码混淆,让别人在反编译你的代码后看不懂,方法如下: 由于我的SDK和ADT20.0.1都是最新的,所以像网上的提供的使用proguard.cfg混淆代码的方式我看了,都是一样的,http://hi.baidu.com/jiaoyake/blog/item/9e4a8dddce354cc0b7fd48cb.html.都说会在项目文件下自动生成proguard.cfg,可是我的怎么也无法生成,因此也无法使用这个方法,搞得很头痛. 不过今天

  • Android逆向分析惯用网站

    Android逆向分析常用网站 androidterm: Android Terminal Emulator http://code.google.com/p/androidterm/ droidbox: Android Application Sandbox https://code.google.com/p/droidbox/ TaintDroid: Realtime Privacy Monitoring on Smartphones https://github.com/TaintDroi

  • Android中的Apk反编译

    Android中的Apk反编译! 不知道谁说过的名句:人生来都是一张白纸.谁都是从小白过来的,所以现在把成长中学习到的记下来以帮后人,也让自己有个参考. 事无巨细. 工欲善其事,必先利其器.反编译肯定会用到工具.目前我只是会了一种反编译的做法,也是参考很多前辈的介绍,选的一种据说是靠谱率比较高的做法. 就是用dex2jar和jd-gui两个工具合用的做法.这两个软件都是绿色的.压缩包在我上传的附件中,感兴趣的童鞋可以自行下载! 1.首先把这两个软件下载到自己电脑中,并且分别在两个文件夹中.见图1

  • Android应用程序破译(反编译) Android应用程序破译(反编译)

    Android应用程序破解(反编译) 一.apktools进行反编译 1.首先安装需要JAVA环境(JDK和JRE) 设置JAVA环境变量 CLASSPATH %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar JAVA_HOME C:\Program Files\Java\jdk1.8.0_20 Path %JAVA_HOME%\bin;C:\Program Files\Java\jre1.8.0_20\bin 2.下载apktools并解压 (1

  • 求反编译大手,自信的进 求反编译大手,自信的进

    求反编译大手,自信的入 是这样的,我有一个程序用到一个软件的某功能. 我搞了很久都没弄出思路. 我想反编译过来学习学习. 然后我到网上下载了个工具, 翻译出那个软件的窗体和空间. 但是代码部分都是这些看不懂的语言. 'Sub procDispList()'N * ref: __vbaExceptHandler'N * ref: __vbaObjSet'N * ref: __vbaHresultCheckObj'N * ref: __vbaFreeObj'N * ref: __vbaHresult

  • 求反编译大手,自信的入,该如何解决 求反编译大手,自信的入,该如何解决

    求反编译大手,自信的入 是这样的,我有一个程序用到一个软件的某功能. 我搞了很久都没弄出思路. 我想反编译过来学习学习. 然后我到网上下载了个工具, 翻译出那个软件的窗体和空间. 但是代码部分都是这些看不懂的语言. 'Sub procDispList()'N * ref: __vbaExceptHandler'N * ref: __vbaObjSet'N * ref: __vbaHresultCheckObj'N * ref: __vbaFreeObj'N * ref: __vbaHresult

  • Android初学者日记25-android反编译 Android初学者日记25-android反编译

    Android菜鸟日记25-android反编译 Android菜鸟日记 25 android反编译 写在最前面的话:之所以写这个是感觉目前市场上的书写的内容都不够,那么有很多大公司的android apk写的不错,教下师弟们反编译去看看人家怎么写的,加以学习,请勿用于抄袭或者任何形式的不正确的行为,这样违背了我的初衷谢谢. 所有要用到的文件在附件 用dex2jar来反编译classes.dex 1.首先用压缩软件打开apk[我这里打开的是京东的 =-=#感谢京东apk] 得到: 2.把里面的c

  • android 最简略的反编译apk脚本(1拖即可完成) android 最简略的反编译apk脚本(1拖即可完成)

    android 最简单的反编译apk脚本(1拖即可完成) android 最简单的反编译apk脚本(1拖即可完成) 在开始之前,首先要确保电脑上已经装有1.6或16以上的java运行环境. 在dos命令行中输入 java -version出现上图信息,表示可以. 参考了网上一些关于android 的apk反编译文章,做了一个简单的批处理文件,方便操作. 并把相关的文件整理打了一个完整的压缩包. 压缩包包含下面4个工具有:(如果下载后面附件中的压缩包了,就不用下载下面的4个工具,已经集成在压缩包中

  • android Application的防反编译Proguard跟应用签名

    android Application的防反编译Proguard和应用签名 android APK防止反编译: 在android2.3之后的版本新建项目中会自动生成proguard.cfg和project.properties文件,proguard.cfg文件是混淆java代码的配置文件,里面对不需要混淆代码的类文件进行配置过滤,project.properties文件里设置android项目对应的版本和proguard.cfg的路径. 1.贴上自动生成的proguard.cfg文件的内容: -

  • android工程搅混和反编译 android工程搅混和反编译

    android工程混淆和反编译 一.工程文件的混淆 混淆文件下载:http://download.csdn.net/detail/lxq_xsyu/6328751 1.在根目录下添加progard.cfg文件 2.打开project.properties在底下添加proguard.config=proguard.cfg # This file is automatically generated by Android Tools. # Do not modify this file -- YOU

  • Android保险专项测试之反编译 Android保险专项测试之反编译

    Android安全专项测试之反编译 apktool 反编译APK 使用apktool d <apk文件名>,默认会生成和APK文件名同名的文件夹,里面会存放反编译后的文件: localhost:apk wuxian$ apktool d com.wangyin.payment-3.11.1.apk I: Using Apktool 2.0.1 on com.wangyin.payment-3.11.1.apk I: Loading resource table... I: Decoding A

最新文章
  • sudo subl 之后 Sublime Text 的菜单栏无法显示, 你们有这样的情况吗?

    Ubuntu 14.04 Sublime Text 3103 直接 subl 是正常的, 但是 sudo subl 就不正常. 已经发到官方: https://forum.sublimetext.com/t/the-menu-bar-is-not-displayed-linux-terminal-sudo-subl/17784 --cut-- canautumn在2016-05-09 19:58:23回答到: 估计是找不到当前用户的配置文件 iugo在2016-05-09 19:58:23回答到

  • 大寒养生保健 大寒养生保健

    新年将至,大寒已到.中医讲究天.地.人三因制宜,其中一方面,就是要求随着时间的变化而适当调整.二十四节气则是中华文化的瑰宝,一年之中物候的变化都与节气密切相关,大寒节虽是一年中的最后一个节气,但却是一年"运"."气"循环变化的开始,做好大寒节的养生保健是非常重要的. 精神:心情舒畅 所谓"暖身先暖心,心暖则身温".意思是说心神旺盛,气机通畅,血脉顺和,全身四肢百骸才能温暖,方可抵御严冬酷寒的侵袭.因此在大寒时节,我们应安心养性,怡神敛气,尤其是老

  • 3分钟抬腿运动治疗膝盖酸痛

    方法如下: 1.仰卧在地板上,一条腿膝盖弯曲(大腿与小腿的角度小于直角),另一条腿伸直,两手自然地放在身体左右两侧. 2.将伸直的那条腿向上抬(离地板约10厘米),静止5秒左右后慢慢放下回到1中的姿势.休息2-3秒再往上抬腿,反复做20次. 腰疼或躺着做这一运动腰会疼的人及弯曲的那条腿膝盖酸痛的人,可以浅坐在椅子上进行. 具体方法为: 1.浅坐在椅子面略高的椅子上,一条腿的膝盖弯曲(大腿与小腿呈90度),另一条腿伸直,脚脖子自然弯曲(脚后跟着地,脚尖离地).伸直的那条腿向上抬时,请注意膝盖不要弯

  • 肠道老化有什么表现_让肠道衰老有哪些因素 肠道老化有什么表现_让肠道衰老有哪些因素

    衰老是人们最大的敌人,每个人都不希望脸上长满皱纹,其实衰老的表现还有很多,例如我们没有注意的肠道衰老. 身体的肠道是最先步入衰老路程的,人们每天所吃的食物是各种各样的,肠胃肯定是受不了的,所以我们要避免出现肠道衰老的现象. 你有没有想到?盘绕长达5~6米的肠道竟然是你衰老最开始的地方?抗衰老医学研究表明,人体90%的疾病与肠道不洁有关,1天不排便等于吸3包烟. 人最先衰老的是脾胃,中医讲的脾胃也包括肠道,是我们身体里重要的消化吸收器官,营养从这里吸收,毒素.垃圾都从这里排出. 肠道衰老带来的最直

  • 有关描写春天的童谣

    春天的田野最迷人. 妈妈带着盼儿挖荠菜,青青的气息陶醉着母与子. 盼儿不识得荠菜,却识得翩跹的蝴蝶. 妈妈怕盼儿跑远,便唤道:"盼儿过来,盼儿过来,我教你一首歌谣." 歌谣?盼儿极兴奋地小跑过来. 妈妈信手在地上的杂草中寻出一株圆叶儿的青草,摊在手中,轻轻用手拍打: "手指丫,拍三巴, 不变黄瓜变梢瓜--" 然后妈妈把那草儿放在盼儿的鼻尖尖上. 咦?盼儿嗅了嗅,果真黄瓜味咧! 盼儿快活地在四周寻那黄瓜味的小草去了,甜甜的童谣就荡漾在早春的气息里. 但不一会儿,盼儿就

  • 六年级创建森林城市手抄报 六年级创建森林城市手抄报

    六年级创建森林城市手抄报图片: 创建森林城市标语 1.建清波绿林新**,绘山青水秀帝都城 2.留山水风光,建生态城市 3.植树造林,绿化国土是一项基本国策 4.森林城市大家共创,绿色成果全民共享 5.营造绿色家园,建设生态 6.植树造林,改善环境,森林进城,园林下乡,城市森林化,郊区生态化,村庄园林化 7.植下千顷树,福泽荫后人,城市绿起来,人民富起来 8.加强城市绿化美化,提高城市水平 9.创建国家森林城市,人人参与,人人受益 10.倡导绿色生活共建生态文明 11.创国家森林城市,建**幸福家

  • DNF剑豪PVE刷图加点推荐 物理掌法流加点方式 DNF剑豪PVE刷图加点推荐 物理掌法流加点方式

    DNF国服大转移过后,热门职业女鬼剑开启二觉,而女剑豪更是众多玩家热衷培养的角色之一.那么对于PVE玩家来说,如何选择一套最合适的刷图加点,则成为当下玩家们比较关心的话题. 今天小编要与大家分享的是一套比较常规但非常实用的剑豪PVE刷图加点,希望能的对大家有所借鉴. 1.主流,无45综合向加点. 加点方案 职业:女鬼剑 流浪武士 剑豪 等级:85 SP:全部 10770 已用 8970 剩余 1800 TP:全部 36 已用 22 剩余 14 QP:全部 3974 已用 0 剩余 3974 通用

  • 创业必定赚钱的16种人

    1.很聪明的人. 读书学习好与坏与做生意赚钱完全是两码事.读书人往往呆头呆,墨守陈规.而做生意则需要头脑灵活多变,想到就要做到. 2.办事能力和办事效率很强的人. 一旦有赚钱的生意马上一步一个脚印的去做,要付诸于行动.敢做.敢干,只有这样才能抓住机会. 3.不安于现状,不断努力的人. "一天三顿饱,老婆孩子热炕头"的人觉得一辈子捧着"铁饭碗"的人,永远没有赚钱的机会,"够用就行,要那么多钱干嘛"这句话是那些不会乃至赚不到钱的人聊以自慰的"

  • 《激战2》迈古玛之门新地图干涸高地跳水点怎么跳 《激战2》迈古玛之门新地图干涸高地跳水点怎么跳

    激战2迈古玛之门新地图干涸高地跳水点怎么跳?进入这张地图后,我们会发现一个十分眼熟的东西,就是四风版本时在迷城峭壁随处可见的各种能力水晶. 我们在这张地图需要通过这些能力去抵达新的区域或者难以抵达的地方,合理迅速的运用这些技能将会让你更加的便捷的完成很多成就.事件和动态事件剧情. 当然也包括了新的跳跳乐和跳水点(这个跳水点的坑爹难度不亚于以太跳水点,诸位强迫症患者请自重). 大家在跳的时候,带上眼镜前要先开加速,然后跳起来从这个空隙穿过去,一直按着前进.至于能不能过,就要看运气了.

  • 简单谈谈Javascript中类型的判断

    数据类型的判断有这么几种方式 1.一元运算符 typeOf 2.关系运算符 instanceof 3.constructor 属性 4.prototype属性 一.typeof typeof的返回值有以下几种 类型 结构 Undefined "undefined" Null "object" (见下方) 布尔值 "boolean" 数值 "number" 字符串 "string" Symbol (ECMAS

热门推荐
  • 成熟的夜间模式解决方案 成熟的夜间模式解决方案 关注仓库,及时获得更新: iOS-Source-Code-Analyze 从开始写 DKNightVersion 这个框架到现在已经将近一年了,目前整个框架的设计也趋于稳定. 其实夜间模式的实现就是相当于 多主题加颜色管理 .而最新版本的 DKNightVersion 已经很好的解决了这个问题. 在正式介绍目前版本的实现之前,我会先简单介绍一下 1.0 时代的 DKNightVersion 的实现,为各位读者带来一些新的思路,也确实想梳理一下这个框架是如何演变的. 我们会以对 backgroun
  • 生命是一个自我修炼的过程 生命是一个自我修炼的过程 那天,跟一个好久没有联系的朋友打电话聊天,谈论最近工作的一些感受.他突然问我一个问题:"你到底想做什么?" 已经好久没人问过我这个问题.夜深人静,夜不能寐时,这个问题已经好久没有困扰过我了.这将近一年,因为有了许多新的事情做,一直把自己放到工作的细节中.工作的状态.生活的状态都改变了许多.好像很少跳出来,往更远的地方想想. 这次,被人突然问起,一时不知如何回答. 那天在办公室,跟同事东拉西扯.她说:"有一次你说过一句话,可能你自己已经不记得了,但是对我来说非常有震撼性.&qu
  • 支付宝手机网页及时到账接口(2)之授权接口请求 支付宝手机网页及时到账接口(2)之授权接口请求 支付宝手机网页即时到账接口(2)之授权接口请求 前言 这篇文章主要讲诉系统调用支付宝手机网页即时到账授权接口获取支付宝返回的request_token. 上篇文章地址:支付宝手机网页即时到账接口(1)之相关信息介绍. 这是上篇文章结尾调用授权接口的图解. 官方文档中对授权接口的说明是: 商户利用编程方法来模拟http请求远程解析html,获取支付宝返回的结果数据后,可以结合自身网站的业务逻辑进行数据处理. 说明中不难看出我们的代码中需要模拟http提交参数,然后解析支付宝返回的结果再进行处理.该