三国kill字符串加密算法分析

【文章标题】:三国kill字符串加密算法

【文章作者】: Ericky

【作者博客】: http://blog.csdn.net/hk9259

【下载地址】: 百度下载

【保护方式】: 字符串加密

【作者声明】: 本人水平有限,若有不足错误之处请各位大侠指正

0x1 前言

据说这款游戏的老版本是可以直接修改其中相应的字符串来进行狸猫换太子,从而绕过检验并且达到内购破解的效果,如今时隔一年,该游戏为了防止被篡改或者其他,加强了对自身的加密,尤其把一些关键字符串所保护,强度是否值得起时间的考验,我们来一探究竟。

0x2 定位

打开libgame.so,按照以前的思路,在浩瀚的字符串中找到加密的字符串如下:

定位到红色框框中的类如下:

0x3 分析

分析如图:

继续向下分析:

跟进后如下:

Base64为标准的解密方式。

而下面的函数为Xor编码函数,不用管我们继续往下跟进:

这里是一个循环解密,关键函数为70004C。

跟进去再继续跟来到SUB_7BE950这个函数:

然后进行解密,解密出来的字符串用于so里面的调用。

0x4 写解密加密程序

还原加密代码如下:

//加密字符串
BYTE arry[] = "classes.dea";
//加密KEY
const  uint32_t  Key  =  0x9f;
//初始化
unsigned char XorOut[100] ="";
char Base64Out[100]="";
const  size_t  lens  =  sizeof(arry);
for  (size_t  i  = 0  ;  i  <  lens - 1;  i++)  { 

    XorOut[i] = arry[i]  ^  (Key+i);

}

base64_encode( XorOut, Base64Out, lens-1 );

printf("%s\n",  Base64Out); 

char * base64_encode( const unsigned char * bindata, char * base64, int binlength )
{
    int i, j;
    unsigned char current;

    for ( i = 0, j = 0 ; i < binlength ; i += 3 )
    {
        current = (bindata[i] >> 2) ;
        current &= (unsigned char)0x3F;
        base64[j++] = base64char[(int)current];

        current = ( (unsigned char)(bindata[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
        if ( i + 1 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = ‘=‘;
            base64[j++] = ‘=‘;
            break;
        }
        current |= ( (unsigned char)(bindata[i+1] >> 4) ) & ( (unsigned char) 0x0F );
        base64[j++] = base64char[(int)current];

        current = ( (unsigned char)(bindata[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
        if ( i + 2 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = ‘=‘;
            break;
        }
        current |= ( (unsigned char)(bindata[i+2] >> 6) ) & ( (unsigned char) 0x03 );
        base64[j++] = base64char[(int)current];

        current = ( (unsigned char)bindata[i+2] ) & ( (unsigned char)0x3F ) ;
        base64[j++] = base64char[(int)current];
    }
    base64[j] = ‘\0‘;
    return base64;
}

还原解密代码如下:

//*******************解密
//KEY
const  uint32_t Key2 = 0X9f;
//解密字符串
const char Base64In[]="7cXSzdbWxsPUhsbf3w==";
const  size_t  lens2  =  (sizeof(Base64In)- 1)*3/4 -2;
//Base64解密后存放
unsigned char XorIn[] ="";
//Base64解密
base64_decode( Base64In, XorIn);
//Xor解密后存放
char Base64Outd[100] = "";
//Xor解密
for  (size_t  i  = 0  ;  i  <  lens2;  i++)  { 

     Base64Outd[i] = XorIn[i]  ^  (Key2+i);

}
printf("%s\n",  Base64Outd); 

int  base64_decode( const char * base64, unsigned char * bindata )
{
    int i, j;
    unsigned char k;
    unsigned char temp[4];
    for ( i = 0, j = 0; base64[i] != ‘\0‘ ; i += 4 )
    {
        memset( temp, 0xFF, sizeof(temp) );
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i] )
                temp[0]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+1] )
                temp[1]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+2] )
                temp[2]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+3] )
                temp[3]= k;
        }

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
                ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
        if ( base64[i+2] == ‘=‘ )
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
                ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
        if ( base64[i+3] == ‘=‘ )
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
                ((unsigned char)(temp[3]&0x3F));
    }
    return j;
}

0x5 测试结果

7cXSzdbWxsPUhsbf3w== ——–> resources.out

88nDjcLWyMPGysCFx8XPyc7d1JzA2w== ——–> lib/armeabi/libgame.so

88nDjcLWyMPGysCH3ZvMgcPZ09XS2dCYxNc= ——–> lib/armeabi-v7a/libgame.so

/MzA0dDB1ojDzdE= ——–> classes.dex

0x6总结

需要十足的耐心来分析算法,很锻炼人,睡觉。

2015.7.26

By Ericky

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 04:16:44

三国kill字符串加密算法分析的相关文章

字符串加密解密

字符串加密(指定加密密钥) 如字符串"Good good study,day day up! You can you up,no can no bibi!",加密密钥为"marchfour",对字符串进行加密 原理很简单,就是字符之间的异或 错误的代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 void encrypt_decode(char

字符串加密

//字符串加密 //Qi Ming Liu,October 23,2015 package Demo; import javax.swing.JOptionPane; public class StringSercet {  public static void main(String[] args) { String str=JOptionPane.showInputDialog("请输入一个字符串:"); char charArray[]=str.toCharArray();   

课堂-字符串加密

//字符串加密 //Qi Ming Liu,October 23,2015 package Demo; import javax.swing.JOptionPane; public class StringSercet {  public static void main(String[] args) { String str=JOptionPane.showInputDialog("请输入一个字符串:"); char charArray[]=str.toCharArray();   

字符串加密以及动手动脑截图

1.字符串的比较: 使用equals()或equalsIgnoreCase()方法比较两字串内容是否相同,使用==比较两字串变量是否引用同一字串对象:Demo: StringEquals.ava compareTo:使用字典法进行比较,返回0表两字串相等,小于返回负值,大于返回正值 regionMatches:比较两字串中的某一部分是否相等.示例:StringCompare.Java 2.参看示例 StringMisc.java,其中展示了以下String类的重要方法与字段 Length():获

lazarus:将字符串加密生成md5码

var sSrc, sDst: string; begin sSrc := EditSrc.Text; sDst := MD5Print(MD5String(sSrc)); EditDest.Text := sDst; lazarus:将字符串加密生成md5码,布布扣,bubuko.com

华为OJ——字符串加密

题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS.如果单词中包含有重复的字母,只保留第1个,其余几个丢弃.现在,修改过的那个单词死于字母表的下面,如下所示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z T R A I L B Z E S C D F G H J K M N O P Q U V W X Y 上面其他用字母表中剩余的字母填充完整.在

字符串加密和解密的常类

字符串加密和解密常用类:转载至: http://www.cnblogs.com/malaohu/p/3214136.html   public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summary> /// <param name="input">需要加密的字符串</param> /// <returns>

登录与注册的加密算法分析

登录与注册的加密算法分析 算法目的 提供固定的 秘钥 和 明文 能够产生不同的密文摘要 hamc 算法 大概流程是 使用一个秘钥 对明文进行两次散列操作得到密文摘要 哈希(散列)函数 MD5 SHA1 SHA256 注册 向服务器请求一个随机的秘钥 把注册的密码进行 md5.hmac(hamc使用md5的散列函数来操作字符)加密 : md5.hmac(key,message) ==> 密文摘要(key : 秘钥 , message : 明文) : md5.hmac密文摘要 把摘要提交到服务器,同

利用javascript对字符串加密

没事利用js写个对字符串加密的方法,基本原理就是先把字符串转化成对应的unicode(用到的方法是charCodeAt()),再把unicode统一减去100(这里加减随便你取多少),把得到的unicode码再转换成对应的字符(用到的方法是String.fromCharCode()),代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title