jeb 分析程序逻辑。

逻辑

根据 Manifest 找到程序的 主要逻辑的地方。 在 Main2Activity 里面

找到 按键 监听的 逻辑。

  1. 先更具 id 找到对应的 名字。

  2. 先看到 new Intent 发现这里 我们之间看看 s.class 是干什么的。

    发现在 s.class 的类中 也有一个按键监听,这里实现的功能是 连接上 sctf.db 数据库。将里面的内容 写入到 v4_1 数组中。

    解压 apk 文件 在对面 目录得到 sctf.db 在利用 工具打开 发现 s1 = hello s2 = sctf

  3. 然后 程序 进入 d类

    d类 中的关键函数, 又一次调用了 几个函数 我们依次分析

    b类 中 又依次调用了 d方法。

    d方法 调用了 q类 中的 get 函数 连接 hellosctf 然后返回进入 a方法

    然后 得到的 "hellosctf" 字符串 进行了 md5 加密。

    最后调用了 c类 中的 a函数 加密, arg12 = 我们的输入, arg13 为字符串 md5 加密后的值。

    最后 调用 s类 中的g函数进行比较。 根据这个 id

    先在 资源类中找到名字 再在value 中找到值

    最后 加密结构进行 比较, 注意 函数中,对应的 大小写转换。

思路

知道了 关键的 加密函数, 可以写脚本 进行 逆向。

public class Notepad 
{
    public static void main(String[] args) 
    {
        byte[] enctob = new byte[]{-62, -117, -61, -99, -61, -90, -62, -125, -62, -77, -61, -99, -62, -109, -62, -119, -62, -72, -61, -70, -62, -98, -61, -96, -61, -89, -62, -102, 22, 84, -61, -81, 40, -61, -95, -62, -79, 33, 91, 83};       
        String bs = new String(enctob);
        char[] flagenc = bs.toCharArray();
        char[] out = new char[bs.length()];
        int[] S = new int[256];
        byte[] wtf = new byte[256];
        int i,j,k;
        String key = "E7E64BF658BAB14A25C9D67A054CEBE5";
        for (i = 0; i < 256; i++ ) 
        {
            S[i] = i;
            wtf[i] = (byte)(key.charAt(i % 32));
        }
        i = 0;
        j = 0;
        for(i = 0,j = 0;i < 256; i++ ) 
        {
            j = (S[i] + j + wtf[i]) % 256;
            k = S[i];
            S[i] = S[j];
            S[j] = k;
        }
        for (i = 0,j = 0,k = 0; i < bs.length(); i++ ) 
        {
            k = (k + 1) % 256;
            j = (S[k] + j) % 256;
            int temp = S[k];
            S[k] = S[j];
            S[j] = temp;
            out[i] = (char)((flagenc[i] ^ S[(S[k] + S[k] % 256) % 256]) + k);
            System.out.println(out);
        }
 
    }
}
// sctf{IT_IS_A_NICE_SONG}