吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22708|回复: 38
收起左侧

[移动样本分析] 【Java代码】目前流行的锁机APP的通用DES加解密算法

  [复制链接]
1595901624 发表于 2016-10-11 13:34
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 1595901624 于 2016-11-15 13:07 编辑

经过几天对android锁机APP的分析,发现锁机主要源码近乎一样,简单的锁机,反编译之后就可以看到锁屏密码,而复杂的则用到了DES加密和MD5加密。

某锁机软件的源码截图(大部分锁机源码基本是这个架构): des.JPG

对于DES加解密,网页在线工具很多,但是我发现网页上的工具都解不出来,找了很多款也是这样,不知道你们是不是这样,因此,我就试着还原了一下
工具中的加解密算法,源码带注释。     适用于当前流行的锁机APP用到的DES加解密      具体代码如下:




[Java] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import java.security.Key;
import javax.crypto.Cipher;
 
/**
 * DES加密和解密工具,可以对字符串进行加密和解密操作 。
 * 该加密工具适用于当前主流的"android锁机软件"的DES加解密
 * @author 1595901624
 *         <p>
 *         2016-10-01
 *         </p>
 */
public class DesUtils {
 
        /** 字符串默认键值 */
        private static String strDefaultKey = "national";
 
        /** 加密工具 */
        private Cipher encryptCipher = null;
 
        /** 解密工具 */
        private Cipher decryptCipher = null;
 
        /**
         * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
         * hexStr2ByteArr(String str) 互为可逆的转换过程
         *
         * @param arrB
         *            需要转换的byte数组
         * [url=home.php?mod=space&uid=155549]@Return[/url] 转换后的字符串
         * @throws Exception
         *             本方法不处理任何异常,所有异常全部抛出
         */
        public static String byteArr2HexStr(byte[] arrB) throws Exception {
                int iLen = arrB.length;
                // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
                StringBuffer sb = new StringBuffer(iLen * 2);
                for (int i = 0; i < iLen; i++) {
                        int intTmp = arrB[i];
                        // 把负数转换为正数
                        while (intTmp < 0) {
                                intTmp = intTmp + 256;
                        }
                        // 小于0F的数需要在前面补0
                        if (intTmp < 16) {
                                sb.append("0");
                        }
                        sb.append(Integer.toString(intTmp, 16));
                }
                return sb.toString();
        }
 
        /**
         * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
         * 互为可逆的转换过程
         *
         * @param str
         *            需要转换的字符串
         * @return 转换后的byte数组
         * @throws Exception
         *             本方法不处理任何异常,所有异常全部抛出
         * @author 1595901624
         */
        public static byte[] hexStr2ByteArr(String str) throws Exception {
                byte[] arrB = str.getBytes();
                int iLen = arrB.length;
 
                // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
                byte[] arrOut = new byte[iLen / 2];
                for (int i = 0; i < iLen; i = i + 2) {
                        String strTmp = new String(arrB, i, 2);
                        arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
                }
                return arrOut;
        }
 
        /**
         * 默认构造方法,使用默认密钥
         *
         * @throws Exception
         */
        public DesUtils() throws Exception {
                this(strDefaultKey);
        }
 
        /**
         * 指定密钥构造方法
         *
         * @param strKey
         *            指定的密钥
         * @throws Exception
         */
        public DesUtils(String strKey) throws Exception {
                Key key = getKey(strKey.getBytes());
 
                encryptCipher = Cipher.getInstance("DES");
                encryptCipher.init(Cipher.ENCRYPT_MODE, key);
 
                decryptCipher = Cipher.getInstance("DES");
                decryptCipher.init(Cipher.DECRYPT_MODE, key);
        }
 
        /**
         * 加密字节数组
         *
         * @param arrB
         *            需加密的字节数组
         * @return 加密后的字节数组
         * @throws Exception
         */
        public byte[] encrypt(byte[] arrB) throws Exception {
                return encryptCipher.doFinal(arrB);
        }
 
        /**
         * 加密字符串
         *
         * @param str
         *            需加密的字符串
         * @return 加密后的字符串
         * @throws Exception
         */
        public String encrypt(String str) throws Exception {
                return byteArr2HexStr(encrypt(str.getBytes()));
        }
 
        /**
         * 解密字节数组
         *
         * @param arrB
         *            需解密的字节数组
         * @return 解密后的字节数组
         * @throws Exception
         */
        public byte[] decrypt(byte[] arrB) throws Exception {
                return decryptCipher.doFinal(arrB);
        }
 
        /**
         * 解密字符串
         *
         * @param str
         *            需解密的字符串
         * @return 解密后的字符串
         * @throws Exception
         */
        public String decrypt(String str) throws Exception {
                return new String(decrypt(hexStr2ByteArr(str)));
        }
 
        /**
         * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
         *
         * @param arrBTmp
         *            构成该字符串的字节数组
         * @return 生成的密钥
         * @throws java.lang.Exception
         */
        private Key getKey(byte[] arrBTmp) throws Exception {
                // 创建一个空的8位字节数组(默认值为0)
                byte[] arrB = new byte[8];
 
                // 将原始字节数组转换为8位
                for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
                        arrB = arrBTmp;
                }
 
                // 生成密钥
                Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
 
                return key;
        }
 
        /**
         * main方法
         *
         * @author lhy
         * @param args
         */
        public static void main(String[] args) {
 
        }
}


源码内容可复制到Java编译器中直接使用

土豪下载链接如下: DesUtils.rar (1.53 KB, 下载次数: 137)




让我们共同抵制锁机软件





点评

https://pan.baidu.com/s/1kVjS9ZT 屌丝通道  发表于 2016-10-11 18:52

免费评分

参与人数 14威望 +1 吾爱币 +2 热心值 +14 收起 理由
sharkNet + 1 + 1 谢谢@Thanks!
wzhJava + 1 + 1 谢谢@Thanks!
HonDmOon + 1 用心讨论,共获提升!
Hmily + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
想你每一天 + 1 谢谢@Thanks!
Thefirst1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
唯一哟i + 1 我很赞同!
小小笑小肖 + 1 用心讨论,共获提升!
dieqiong + 1 抵制锁机软件!感谢大神分析
庸世俗人罢勒 + 1 抵制锁机软件!感谢大神分析
卷卷de小白 + 1 谢谢@Thanks!
Night_月殇 + 1 热心回复!
觅风 + 1 用心讨论,共获提升!
牵走天涯 + 1 厉害厉害,为何没有屌丝通道呢

查看全部评分

本帖被以下淘专辑推荐:

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

小小笑小肖 发表于 2016-10-11 18:14
感谢楼主用心发帖

免费评分

参与人数 1热心值 +1 收起 理由
1595901624 + 1 我很赞同!

查看全部评分

a6718589 发表于 2016-10-11 21:09
1595901624 发表于 2016-10-11 18:01
反编译锁机软件的时候,更方便的寻找锁屏密码

我知道用途,请问一下怎么使用呢?用AIOE可以吗?
benii 发表于 2016-10-11 13:54
a6718589 发表于 2016-10-11 14:00
怎么使用?楼主可以教一下吗?感谢
Night_月殇 发表于 2016-10-11 14:54
支持一个!!!
lonely 发表于 2016-10-11 15:00
源码都放出来了,可以拿去祸害人了
 楼主| 1595901624 发表于 2016-10-11 18:01
a6718589 发表于 2016-10-11 14:00
怎么使用?楼主可以教一下吗?感谢

反编译锁机软件的时候,更方便的寻找锁屏密码
a6718589 发表于 2016-10-11 18:44
1595901624 发表于 2016-10-11 18:01
反编译锁机软件的时候,更方便的寻找锁屏密码

好东西,已拿走
a421433356 发表于 2016-10-11 19:57
JAVA编译过了,怎么用啊,需解密的字符串添加到哪里啊。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-9 06:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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