cheng_sr 发表于 2021-11-11 22:26

记一到简单的安卓逆向

几个常用函数的用法

substring(v1,v2)取 v1-v2的字符
m.equals(n) 比较m,n相同返回ture
str.charAt(1)表示从str中取第一个字符



程序用了三个函数进行加密

secodeStr()是flag的前半段

thirdstr()是flag的后半段

```java
    private boolean getFlag(String arg8) {
      String v0 = first.firstStr(arg8);
      int v2 = 15;
      if(v0.length() < v2) {
            return 0;
      }

      int v1 = 5;
      if(v0.substring(0, v1).equals("flag{")) {
            if(!v0.substring(v0.length() - 1).equals("}")) {
            }
            else {
                String v1_1 = v0.substring(v1, v2);
                String v2_1 = v0.substring(v2, v0.length() - 1);
                if(!v1_1.equals(second.secondStr())) {
                  return 0;
                }
                else if(!third.thirdStr(v2_1)) {
                  return 0;
                }
                else {
                  return 1;
                }
            }
      }
```

firststr()函数是将字符串中的某些字符做一些替换

```
    public static String firstStr(String arg2) {
      return arg2.replace("B1", "dN").replace("_", "8").replace("!", "P").replace("rea", "hwl").replace('1', 'u').replace("m", "+");
    }
```

secondStr()函数是将字符串进行AES解密输出,直接用Java复写就可以,注意base64解密函数的用法

```
   public static String secondStr() {
      String v0 = "";
      String v1 = "9z2ukkD3Ztxhj+t/S1x1Eg==";
      byte[] v2 = "1234567890123456".getBytes();
      String v3 = "AES/ECB/NoPadding";
      String v4 = "AES";
      try {
            byte[] v5_1 = Base64.decode(v1, 0);
            SecretKeySpec v6 = new SecretKeySpec(v2, v4);
            Cipher v7 = Cipher.getInstance(v3);
            v7.init(2, ((Key)v6));
            return new String(v7.doFinal(v5_1)).replace(" ", ((CharSequence)v0));
      }
      catch(Exception v5) {
            v5.printStackTrace();
            return v0;
      }
    }
```

第三个函数对每个字符进行了判断,只有8个字符,手撕即可,得到的结果如下

v12=80
v10=84
v9=108
v8=119
v6=104
v5=57
v4=104

```java
public static boolean thirdStr(String arg14) {
      int v1 = 8;
      if(arg14.length() != v1) {
            return 0;
      }

      int v0 = arg14.charAt(0);
      int v4 = arg14.charAt(1);
      int v5 = arg14.charAt(2);
      int v6 = arg14.charAt(3);
      int v7 = 4;
      int v8 = arg14.charAt(v7);
      int v9 = arg14.charAt(5);
      int v10 = arg14.charAt(6);
      int v12 = arg14.charAt(7);
      if(v0 % 8 == 7) {
            if(v0 % 9 != v1) {
            }
            else {
                int v11 = 100;
                if(v4 - 3 != v11) {
                  return 0;
                }
                else if((v5 ^ 93) != v11) {
                  return 0;
                }
                else if(v5 * 2 - 10 != v6) {
                  return 0;
                }
                else if(v8 + 1 != 120) {
                  return 0;
                }
                else if((v9 ^ v10) != 56) {
                  return 0;
                }
                else {
                  if(v9 - v10 == 24) {
                        if(v10 - v12 != v7) {
                        }
                        else if(v12 != 80) {
                            return 0;
                        }
                        else {
                            return 1;
                        }
                  }

                  return 0;
                }
            }
      }
```



第二个函数解除的字符串为0dNlE8us8

第三个函数解除的字符串为Gh9hwlTP

然后再用第一个函数进行替换得到的字符串为 0B1lE_1s_Gh9reaT!

replace("B1", "dN").replace("_", "8").replace("!", "P").replace("rea", "hwl").replace('1', 'u').replace("m", "+")


!(https://github.com/chenggege666/mkdown/raw/mkdown/img202110112318391.png)

cheng_sr 发表于 2021-11-29 22:44

Amirliu 发表于 2021-11-12 12:02
大佬逆向从哪里学起比较好

从c语言学起,哈哈能看懂代码就行

sototo 发表于 2021-11-12 00:19

感谢分享!

nc6 发表于 2021-11-12 00:35

感谢分享

低调灬厚道 发表于 2021-11-12 07:42

这是用来干什么的呢?

宾鹏博 发表于 2021-11-12 08:02

感谢楼主的无私奉献!受教了!

骑行吧 发表于 2021-11-12 08:16

感谢分享,但是看不懂{:1_937:}

asdfgh2011 发表于 2021-11-12 08:17

程序挺简洁!

yanfengzhe 发表于 2021-11-12 08:19

没基础,看不懂

ITai 发表于 2021-11-12 08:21

感谢分享

peanut98 发表于 2021-11-12 08:22

哈哈,楼主加油,看好你
页: [1] 2 3 4 5 6 7 8
查看完整版本: 记一到简单的安卓逆向