Ericky 发表于 2016-1-3 19:12

一枚KeyGenMe分析

该KM的下载地址:http://www.52pojie.cn/thread-453211-1-1.html将自己的分析过程分享给大家。答案是:hello2016,先贴张图:接下来是技术交流:1.unpack so (dump)soSo被加过Naga的壳,具体脱壳过程在我这篇文章里有写:http://www.52pojie.cn/thread-453521-1-1.html2.脱完壳之后的分析在check函数里面:可以看到最后对比的字符串为:XVccAwVbVQQE我们从最后开始往前推到。转换成相对应的Hex如下:0x58 0x56 0x63 0x63 0x41 0x77 0x56 0x62 0x56 0x51 0x51 0x45 这些Hex的值怎么算出来的呢?继续往前看:在base64encode函数中:一共12个值,通过num2base64char函数,循环3次,每次4个值。进入num2base64char函数里看算法:贴一段转换后的java代码: public static int NumToChar(int a1){
               {
                       int v2 ;
                          if ( a1 <= 0x19 ) //65到90
                          return (a1 + 65);
                          if ( a1 <= 0x33 )//
                          return (a1 + 71);//71到122
                          if ( a1 <= 0x3D )//61-4
                          return (a1 - 4);
                          v2 = 43;
                          if ( a1 != 62 )
                          {
                          if ( a1 == 63 )
                          {
                              v2 = 47;
                          }
                          else if ( a1 == 64 )
                          {
                              v2 = 61;
                          }
                          }
                          return v2;
                        }根据这段算法逆推出Numtochar之前的Hex为:0x17 0x15 0x1c 0x1c 0x00 0x30 0x15 0x1b 0x15 0x10 0x10 0x04
继续向前看,找出这12个Hex的值是如何来的:图中红框的函数为关键函数,进去看一下:传入3个参数,生成了4个结果。所以之前的12个Hex的值应该是3组3位的Hex值生成的,根据算法,解密程序如下:int x ,y ,z ,four1,four2,four3,four4;
                for(x=0;x<=0xff;x++){
                        for(y=0;y<=0xff;y++){
                                for(z=0;z<=0xff;z++){
                                        four1 = x>>2;
                                        four2 = (16 * x & 0x30) + (y >> 4);
                                        four3 = (4 * y & 0x3C) + (z >> 6);
                                        four4 = z & 0x3F;
                                        if(four1==0x15 && four2==0x10 &&four3==0x10 && four4==0x04){
                                                System.out.println("X:0x"+Integer.toHexString(x)+" Y:0x"+Integer.toHexString(y)+" Z:0x"+Integer.toHexString(z));
                                        }
                                }
                        }
                }
                }解密后得出3组3位的Hex值如下:0x5d 0x57 0x1c0x03 0x05 0x5b0x55 0x04 0x04再往前就是java层了:只要传入的字符串为以下Hex则成功:16进制:5d 57 1c 03 05 5b 55 04 04    | |   | |____   \ /   \/        JAVA层JAVA层的加密函数为: public static String Encrpt(String arg9, String arg10) {
                String v0_2;
                String v1 = null;
                if(arg9 != null && arg10 != null) {
                    try {
                      char[] v2 = arg10.toCharArray();
                      char[] v3 = arg9.toCharArray();
                      int v4 = v3.length; //v4 =9
                      int v5 = v2.length;
                      char[] v6 = new char;
                      int v0_1;
                      for(v0_1 = 0; v0_1 < v4; ++v0_1) {
                              System.out.println((int)(v3)+" ^ "+(int)v2);
                            v6 = ((char)(v3 ^ v2));
                      }

                      v0_2 = new String(v6);
                    }
                    catch(Exception v0) {
                      v0.printStackTrace();
                      v0_2 = v1;
                    }
                }
                else {
                    v0_2 = v1;
                }
                return v0_2;
          }
                public static String toHexString(String s) {
                        String str = "";
                        for (int i = 0; i < s.length(); i++) {
                                int ch = (int) s.charAt(i);
                                String s4 = Integer.toHexString(ch);
                                System.out.println((i+1)+": 0x"+s4);
                                str = str + s4;
                        }
                        return str;
                }运算都是异或加密,逆运算就是结果与key再异或回来,而key在Java层已经可以知道,为”52pojie”,所以异或回来的答案如下:Answer:104 101 108 108 111 50 48 49 54 最后再查一下ASCII码表得出答案为:hello2016到此整个分析就结束了,最后验证了下,是标准的base64,并没有做改动,所以完成这道题可以更简单,但是如果做了变形base64,那么这种方法才是通用的了。(*^__^*) 2016.1.3By Ericky


Ericky 发表于 2016-1-3 20:32

世事繁华皆成空 发表于 2016-1-3 19:20
你居然还是分析的之前的版本啊,我的key改了啊啊啊啊啊啊啊啊啊啊啊啊

不知道啊。。我就2个版本啊有个是中文的。。

Ericky 发表于 2016-1-3 20:33

世事繁华皆成空 发表于 2016-1-3 19:20
你居然还是分析的之前的版本啊,我的key改了啊啊啊啊啊啊啊啊啊啊啊啊

中文的key 都是 76啊 。。

qtfreet00 发表于 2016-1-3 19:20

你居然还是分析的之前的版本啊,我的key改了啊啊啊啊啊啊啊啊啊啊啊啊

-Zing- 发表于 2016-1-3 19:26

那逗逼不是H大妈?{:301_978:}

cool147852369 发表于 2016-1-3 19:28

学习了 表示回去好好努力

夜之零落兮 发表于 2016-1-3 19:30

前排抱花生米围观

Niuer 发表于 2016-1-3 19:32

前排卖瓜

一生情独醉 发表于 2016-1-3 20:06

还在学习的路上,虽然看不怎么懂,围观!

smile1110 发表于 2016-1-3 20:25

世事繁华皆成空 发表于 2016-1-3 19:20
你居然还是分析的之前的版本啊,我的key改了啊啊啊啊啊啊啊啊啊啊啊啊

那都比不是h大嘛
页: [1] 2 3 4 5
查看完整版本: 一枚KeyGenMe分析