吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2868|回复: 13
收起左侧

[已解决] 遇到读不懂的逆向源码(魔改JAVA MD5算法),百度了也不行。

[复制链接]
sirliu 发表于 2020-10-24 00:37
本帖最后由 sirliu 于 2020-10-26 09:05 编辑

解决方案在14楼!!!
解决方案在14楼!!!
解决方案在14楼!!!APP逆向遇到一个加密算法,其中有一段源码是求字符串MD5值的,但是又跟一般的MD5算法不一样,代码如下。

public static String setMD5(String str) {
    StringBuilder sb = new StringBuilder();
    try {
        MessageDigest instance = MessageDigest.getInstance("MD5");
        instance.update(str.getBytes("UTF-8"));
        for (byte b : instance.digest()) {//  digest()获得密文完成哈希计算,产生128 位的长整数
            byte b2 = b & MAX_VALUE;
            // public static final byte MAX_VALUE = -1;
            String hexString = Integer.toHexString(b2);
            if (b2 <= 15) {
                hexString = GESTURE_PWD_UNSET + hexString;
            // public static final String GESTURE_PWD_UNSET = "0";
            }
            sb.append(hexString);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sb.toString();

}




有谁能教教我怎么转换成Python代码呀?

我知道for循环之前是求md5值,
但是for循环里面又是位运算,又是判断和字符串拼接,就有点看不懂了。
for循环里面的内容关键点貌似是进制转换。

11楼自己写了python,不知道能不能实现。
image.png



解决方案在14楼!!!

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
为之奈何? + 1 + 1 我很赞同!

查看全部评分

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

JammyLin 发表于 2020-10-24 20:28
本帖最后由 JammyLin 于 2020-10-24 20:32 编辑
sirliu 发表于 2020-10-24 06:51
for循环之前可以明显看出是生成MD5实例求字符串的byte,for循环开始,里面显示位运算,然后是大小判断和 ...

确实在计算完后又进行了其他操作,然后我试了下,python中直接for取出来的byte是没有负值的,所以得进行变换,我重新写了一个你看看
[Python] 纯文本查看 复制代码
import hashlib
def setMD5(strs):
    sb = hashlib.md5()
    sb.update(strs.encode('utf-8'))
    x = sb.digest()
    md5_ = ""
    for b in x:
        b2 = int.from_bytes(b.to_bytes(1, 'big'), 'big', signed = True)
        hexString = str(hex(b)[2:])
        if b2 <= 15:
            if b2 < 0:
                hexString = format(hexString, 'f>8')
            hexString = "0" + hexString
        md5_ += hexString
    return md5_
strs1 = 'abc'
r = setMD5(strs1)
print(r)
 楼主| sirliu 发表于 2020-10-25 10:40
本帖最后由 sirliu 于 2020-10-25 10:42 编辑
JammyLin 发表于 2020-10-24 20:28
确实在计算完后又进行了其他操作,然后我试了下,python中直接for取出来的byte是没有负值的,所以得进行 ...

感谢这位仁兄。
为了弄清java代码的含义及最终输出结果,我临时学了一点点java语法,写了如下java代码:
import java.util.*;
import java.security.MessageDigest;
import java.lang.Integer;

public class Main{

    public static void main(String[] args){
        System.out.print("要计算的字符串是:");
        String str2md5 = "aaaaaa";
        System.out.println(str2md5);
        StringBuilder sb = new StringBuilder();
        try {
            MessageDigest instance = MessageDigest.getInstance("MD5");
            instance.update(str2md5.getBytes("UTF-8"));
            // byte   max = Byte.MAX_VALUE;//max=十进制的127
            byte[] x = instance.digest();
            System.out.println(Arrays.toString(x));
            for (byte b : x) {
                System.out.print("b  的值为:");
                System.out.println(b);
                byte b2 = (byte)(b & 127);
                System.out.print("b2的值为:");
                System.out.println(b2);

                String hexString = Integer.toHexString(b2);
                System.out.print("b2的转化成的字符串为为:");
                System.out.println(hexString);
                if (b2 <= 15) {
                    System.out.println("+++使用了补0操作");
                    hexString = "0" + hexString;
                }
                System.out.print("最终的b2转化字符为:");
                System.out.println(hexString);
                sb.append(hexString);
                System.out.println("----------------");
            }
        }   catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(sb.toString());
    }
}
输出结果如下:
要计算的字符串是:aaaaaa
[11, 78, 122, 14, 95, -24, 74, -45, 95, -75, -7, 91, -100, -18, -84, 121]
b  的值为:11
b2的值为:11
b2的转化成的字符串为为:b
+++使用了补0操作
最终的b2转化字符为:0b
----------------
b  的值为:78
b2的值为:78
b2的转化成的字符串为为:4e
最终的b2转化字符为:4e
----------------
b  的值为:122
b2的值为:122
b2的转化成的字符串为为:7a
最终的b2转化字符为:7a
----------------
b  的值为:14
b2的值为:14
b2的转化成的字符串为为:e
+++使用了补0操作
最终的b2转化字符为:0e
----------------
b  的值为:95
b2的值为:95
b2的转化成的字符串为为:5f
最终的b2转化字符为:5f
----------------
b  的值为:-24
b2的值为:104
b2的转化成的字符串为为:68
最终的b2转化字符为:68
----------------
b  的值为:74
b2的值为:74
b2的转化成的字符串为为:4a
最终的b2转化字符为:4a
----------------
b  的值为:-45
b2的值为:83
b2的转化成的字符串为为:53
最终的b2转化字符为:53
----------------
b  的值为:95
b2的值为:95
b2的转化成的字符串为为:5f
最终的b2转化字符为:5f
----------------
b  的值为:-75
b2的值为:53
b2的转化成的字符串为为:35
最终的b2转化字符为:35
----------------
b  的值为:-7
b2的值为:121
b2的转化成的字符串为为:79
最终的b2转化字符为:79
----------------
b  的值为:91
b2的值为:91
b2的转化成的字符串为为:5b
最终的b2转化字符为:5b
----------------
b  的值为:-100
b2的值为:28
b2的转化成的字符串为为:1c
最终的b2转化字符为:1c
----------------
b  的值为:-18
b2的值为:110
b2的转化成的字符串为为:6e
最终的b2转化字符为:6e
----------------
b  的值为:-84
b2的值为:44
b2的转化成的字符串为为:2c
最终的b2转化字符为:2c
----------------
b  的值为:121
b2的值为:121
b2的转化成的字符串为为:79
最终的b2转化字符为:79
----------------
0b4e7a0e5f684a535f35795b1c6e2c79

然后,我又借鉴你的python代码,写了如下代码,终于计算结果一致了。
import hashlib
def setMD5(strs):
    sb = hashlib.md5()
    sb.update(strs.encode('utf-8'))
    x = sb.digest()
    md5_ = ""
    for b in x:  #  x的值为: b'\x0bNz\x0e_\xe8J\xd3_\xb5\xf9[\x9c\xee\xacy'
        b = int.from_bytes(b.to_bytes(1, 'big'), 'big', signed = True)  
        # 因为x在被迭代的时候,会自动转化成为无符号的十进制数,最大的坑!!!
        # 上面这句的作用是,将无符号十进制转化成有符号的十进制数。
        
        b2=b&127
        hexString = str(hex(b2)[2:]) #  将有符号十进制转化成对应十六进制表达,并截取"0x"后面的字符串。
        print('b2转化来的',hexString)
        if b2 <= 15:
            hexString = "0" + hexString
            print('补零后的值:',hexString)
        md5_ += hexString
        print('-'*20)
    return md5_
strs1 = 'aaaaaa'
r = setMD5(strs1)
print(r)


运行结果是:
b2转化来的 b
补零后的值: 0b
--------------------
b2转化来的 4e
--------------------
b2转化来的 7a
--------------------
b2转化来的 e
补零后的值: 0e
--------------------
b2转化来的 5f
--------------------
b2转化来的 68
--------------------
b2转化来的 4a
--------------------
b2转化来的 53
--------------------
b2转化来的 5f
--------------------
b2转化来的 35
--------------------
b2转化来的 79
--------------------
b2转化来的 5b
--------------------
b2转化来的 1c
--------------------
b2转化来的 6e
--------------------
b2转化来的 2c
--------------------
b2转化来的 79
--------------------
0b4e7a0e5f684a535f35795b1c6e2c79


CRoot 发表于 2020-10-24 00:49
本帖最后由 CRoot 于 2020-10-24 00:52 编辑
public​​ static​​ String​ setMD5(​String​ str)
    {​
        StringBuilder​ sb​ = ​​new​​ StringBuilder​();​
        try​
        {​
            MessageDigest​ instance​ = ​​MessageDigest​.​getInstance(​"​MD5​"​);
            instance​.​update(str​.​getBytes(​"​UTF-8​"​));​​
            for​(​byte​ b​: ​instance​.​digest())
            {​​
                byte​ b2​ = ​b​ & ​​UByte​.​MAX_VALUE​;​ //​public static final byte MAX_VALUE = -1;​String​ hexString ​=​ ​Integer​.​toHexString(b2);​if​ (b2 ​<=​ ​15​) { hexString ​=​ ​AppConst​.​GESTURE_PWD_UNSET​ ​+​ hexString;​//​ public static final String GESTURE_PWD_UNSET = "0"; } sb​.​append(hexString); } } ​catch​ (​Exception​ e) { e​.​printStackTrace(); }​return​ sb​.​toString(); } }


乱码了……
topckey 发表于 2020-10-24 01:08
CRoot 发表于 2020-10-24 00:49
[md]``` java
public&#8203;&#8203; static&#8203;&#8203; String&#8203; setMD5(&#8203;String&#8203; st ...

大神啊,膜拜学习了
JammyLin 发表于 2020-10-24 01:11
[Python] 纯文本查看 复制代码
import hashlib
def setMD5(str):
    sb = hashlib.md5()
    sb.update(str.encode('utf-8'))
    return sb.hexdigest()


这不就是md5加密吗
bentom 发表于 2020-10-24 02:07
md5加密的话,连public, static这种关键字也不会有吧?
 楼主| sirliu 发表于 2020-10-24 06:51
本帖最后由 sirliu 于 2020-10-24 07:01 编辑
JammyLin 发表于 2020-10-24 01:11
[mw_shl_code=python,true]import hashlib
def setMD5(str):
    sb = hashlib.md5()

for循环之前可以明显看出是生成MD5实例求字符串的byte,for循环开始,里面显示位运算,然后是大小判断和字符串拼接,这还是求MD5值嘛?
刚以"MD5+位运算"百度出这篇帖子https://www.jianshu.com/p/47d8c41132f8
,说明我提供的源码也是对MD5进行了魔改。
jwpiaoi 发表于 2020-10-24 07:01
这些代码给大神们看吧。
头像被屏蔽
阿狸主题曲 发表于 2020-10-24 08:04
提示: 作者被禁止或删除 内容自动屏蔽
tea456 发表于 2020-10-24 08:48
  现在JAVA应用越来越广了
 楼主| sirliu 发表于 2020-10-24 09:01
求版主移动到编程区去吧,感觉那里更适合这个题设。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-23 11:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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