[调试逆向]

[原创]RTX(腾讯通)本地保存密码TEA变形算法及还原器

2012-11-11 12:35

16367

[调试逆向]

[原创]RTX(腾讯通)本地保存密码TEA变形算法及还原器

2012-11-11 12:35

16367

上月在研究RTX本地保存密码还原,发现是变形的TEA,伪代码如下:

//TEA test program written by HappyTown   [2006-10-10]

#include

#include

#include "winsock2.h"

#pragma comment(lib,"WS2_32.LIB")

#include "tea.h"

//变形TEADec

void myDecrypt(unsigned char *data,unsigned char *key,unsigned char *out);

//变形TEAEnc

void myEncrypt(unsigned char *data,unsigned char *key,unsigned char *out);

//Ecnrypt

void myEncrypt(unsigned char *data,unsigned char *key,unsigned char *out)

{

int i;

unsigned int y=0,z=0,a,b,c,d;

int        e = 0;

unsigned int sum = 0x61C88647;

//设置y和z

//        printf("%08X\n",*(DWORD*)data);

//        printf("%08X\n",*(DWORD*)(data+4));

y =  ntohl(*(DWORD*)data);

z =  ntohl(*(DWORD*)(data+4));

//        printf("y=%08X z=%08X\n",y,z);

//变形key设置a,b,c,d值

a = ntohl(*(DWORD*)(key+0));

b = ntohl(*(DWORD*)(key+4));

c = ntohl(*(DWORD*)(key+8));

d = ntohl(*(DWORD*)(key+12));

//        printf("a=%08X,b=%08X,c=%08X,d=%08X\n",a,b,c,d);

//        printf("%08X %08X %08X\n",(c+(y<<4)),(d+(y>>5)),(c+(y<<4))^(d+(y>>5)));

//        printf("%08X %08X %08X\n",(delta+y),(delta+y) ^ (c+(y<<4))^(d+(y>>5)),z-((delta+y) ^ (c+(y<<4))^(d+(y>>5))));

//Decrypt

for(i=0; i<16; i++)

{

e -= sum;

y += (e+z) ^ (a+(z<<4)) ^ (b+(z>>5));

z += (e+y) ^ (c+(y<<4)) ^ (d+(y>>5));

}

//        printf("y=%08X z=%08X \n",y,z);

//output y

*(DWORD*)out =  ntohl(y);

//output z

*(DWORD*)(out+4) = ntohl(z);

return;

}

//Decrypt

void myDecrypt(unsigned char *data,unsigned char *key,unsigned char *out)

{

int i;

unsigned int y=0,z=0,a,b,c,d;

int        e = 0;

unsigned int sum = 0x61C88647;

unsigned delta = 0xE3779B90;

//设置y和z

//        printf("%08X\n",*(DWORD*)data);

//        printf("%08X\n",*(DWORD*)(data+4));

y =  ntohl(*(DWORD*)data);

z =  ntohl(*(DWORD*)(data+4));

//        printf("y=%08X\n",y);

//        printf("z=%08X\n",z);

//        printf("a=%08X,b=%08X,c=%08X,d=%08X\n",a,b,c,d);

//变形key设置a,b,c,d值

a = ntohl(*(DWORD*)(key));

b = ntohl(*(DWORD*)(key+4));

c = ntohl(*(DWORD*)(key+8));

d = ntohl(*(DWORD*)(key+12));

//        printf("%08X %08X %08X\n",(c+(y<<4)),(d+(y>>5)),(c+(y<<4))^(d+(y>>5)));

//        printf("%08X %08X %08X\n",(delta+y),(delta+y) ^ (c+(y<<4))^(d+(y>>5)),z-((delta+y) ^ (c+(y<<4))^(d+(y>>5))));

//Decrypt

for(i=0; i<16; i++)

{

z -= (delta+y) ^ (c+(y<<4)) ^ (d+(y>>5));

e = (delta+z) ^ (a+(z<<4)) ^ (b+(z>>5));

delta += sum;

y -= e;

}

//        printf("y=%08X z=%08X \n",y,z);

//output y

*(DWORD*)out =  ntohl(y);

//output z

*(DWORD*)(out+4) = ntohl(z);

return;

}

int main()

{

int i;

int runnum = 0;

int keylen = 40;//暂定密文长40

unsigned char k[16] = {0x52,0x00,0x54,0x00,0x58,0x00,0x21,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//128bits key

//变形密钥

unsigned char k2[16] = {0x00, 0x54, 0x00, 0x52, 0x00, 0x21, 0x00, 0x58, 0x00, 0x00,

0x00, 0x33, 0x00, 0x00, 0x00, 0x00};//128bits key

unsigned char data[128] = {0x95, 0x8D, 0x23, 0x06, 0x74, 0xBB, 0x15, 0xDA, 0xC2, 0x6B,

0x0E, 0xFF, 0xE7, 0x0F, 0x6D, 0xE6, 0x88, 0x26, 0x91, 0x1F,

0xBE, 0x68, 0xBE, 0xF0, 0x3E, 0x24, 0x65, 0xBB, 0x53, 0xF0,

0x89, 0x8D, 0xB3, 0xBE, 0xE2, 0xAC, 0xC1, 0x81, 0xBA, 0x17,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};//plaintext

unsigned char outEn[128] = {0};        //cipher

unsigned char temp[128] = {0};

unsigned char testdata[]={0xD2,0x90,0x2d,0x48,0xd3,0x73,0x00,0x68};

//以十六进制输出密钥k

printf("Key is:");

for (i=0; i<16; i++)

{

printf("%02X", k[i]);

}

//以十六进制输出密钥k

printf("\ndata is:");

for (i=0; i<8; i++)

{

printf("%02X", data[i]);

}

printf("\n数据解密为:\n");

/*

//加密明文data,并输出密文

TEA_Encrypt(outEn, data, k);

printf("TEA(");

for (i=0; i<16;i++)

{

printf("%02X ", data[i]);

}

printf(") is:");

for (i=0; i<8; i++)

{

printf("%02X", outEn[i]);

}

printf("\n");

*/

//解密上一步的密文outEn,并输出明文

myDecrypt(data, k,outEn);//第一次解密

for (i=0; i<8;i++)

{

printf("%02X ", outEn[i]);

}//加密

//开始加密

printf("\n数据加密为:\n");

myEncrypt(outEn,k,outEn);

for (i=0; i<8;i++)

{

printf("%02X ", outEn[i]);

}

//再解密

printf("\n数据再解密为:\n");

myDecrypt(outEn,k,outEn);

for (i=0; i<8;i++)

{

printf("%02X ", outEn[i]);

}

if(!(outEn[0] & 7))

return 0;

//        runnum = (40-(outEn[0] & 7) -10);

//        printf("次数:%d %d",runnum,(outEn[0] & 7));

printf("\n\n");

system("pause");

return 0;

}

RTX对本地代码用了随机数填充,多次加密,造成相同密码,密文不一致(密钥用的是“RTX!3”)。另外处理步骤过于复杂,还原密码就直接调用了RTX的Crypt.Dll,还原和加密代码如下(好像和QQ有些算法一致),加解密代码用到了上面的变形算法:

//自定义TEA解密

typedef BOOL (*oi_symmetry_decrypt2) (char *mw,int Len,char *key,char *ret,int *num);

oi_symmetry_decrypt2 mydecrypt2;

//自定义TEA加密

//data 是宽字符

//key 是宽字符

//ret 应该是宽字符,长64位

//num 指向长64位的宽字符

typedef BOOL (*oi_symmetry_encrypt2) (wchar_t *data,int Len,char *key,unsigned char *ret,int *num);

oi_symmetry_encrypt2 myencrypt2;

//查找函数地址

mydecrypt2 = (oi_symmetry_decrypt2)::GetProcAddress(::LoadLibrary("Crypt.dll"), "oi_symmetry_decrypt2");

myencrypt2 = (oi_symmetry_encrypt2)::GetProcAddress(::LoadLibrary("Crypt.dll"), "oi_symmetry_encrypt2");

还原密码:

void CRtxPwDlg::OnRead()

{

// TODO: Add your control notification handler code here

char key[]={0x52, 0x00, 0x54, 0x00, 0x58, 0x00, 0x21, 0x00, 0x33, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

char ret[1024]={0};

char buff[1024]={0};

char filekey[]="strPassword";

int keylen = 0;

int num = 1024;

::GetPrivateProfileStruct("Default","strPassword",buff,

64,

"D:\\rtx.cfg");//注意rtx.cfg在RTX的安装目录下,这里是本机未安装RTX将CFG文件COPY到D盘测试用

if (2 * wcslen((unsigned short*)buff) >= 64 )

keylen = 64;

else

keylen = 2*wcslen((unsigned short*)buff);

CString msg;

msg.Empty();

//解密

mydecrypt2(buff,keylen,key,ret,&num);

for(int j=0;j<64;j++)

{

CString temp;

if(ret[j]!=0x00)

{

temp.Format("%c",ret[j]);

msg+=temp;

}

}

AfxMessageBox(msg);

}

//加密密码

void CRtxPwDlg::OnWrite()

{

// TODO: Add your control notification handler code here

char key[]={0x52, 0x00, 0x54, 0x00, 0x58, 0x00, 0x21, 0x00, 0x33, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

char buff[64] = "123456";

unsigned char ret[64] = {0};

int temp = 0;

//        AfxMessageBox(msg);

//第四个参数为-1时,取得转换需要的大小

int nLen = MultiByteToWideChar(CP_ACP, 0,buff, -1, NULL, NULL);

//分配空间

wchar_t *pwText;

pwText = new wchar_t[nLen];

if(!pwText)

delete[]pwText;

//转换

MultiByteToWideChar(CP_ACP,0,buff,-1,pwText,nLen);

CString msg,ls;

m_Show.Empty();

//        for(int k=1;k

{

myencrypt2(pwText,nLen*2-2,key,ret,&temp);

msg.Empty();

for(int i=0;i<64;i++)

{

ls.Format("%02X",ret[i]);

m_Show += ls;

}

//        AfxMessageBox(m_Show);

}

delete[]pwText;

UpdateData(FALSE);

}

rtx 加密机制_[原创]RTX(腾讯通)本地保存密码TEA变形算法及还原器相关推荐

  1. rtx 加密机制_rtx腾讯通组织架构(结构)不显示的解决办法

    rtx腾讯通组织架构(结构)不显示了? 在公司,刚来的新同事的rtx腾讯通组织架构(结构)不显示,这些都是电脑上以前没有上过rtx的原因,其实很简单就可以完美的解决这一个问题. 1.首先,我以前用的方 ...

  2. 腾讯通服务器保存传输文件,RTX腾讯通客户端使用小结

    腾讯通客户端使用手册 默认是指在WINXP系统下.WIN7系统稍有不同(ACCOUNT文件夹位置不一样). 一.安装与设置 1.安装过程. i.直接双击运行RTX源程序. ii.安装过程中,在如下步骤 ...

  3. 5g通用模组是什么_中国移动联合芯讯通发布5G终端、芯片及测试产业报告

    11月19日,2020中国移动全球合作伙伴大会以"5G融入百业 数智引领未来"为主题在广州召开,从多个维度展现了中国移动运用5G技术驱动各行业转型升级的强大实力.并于21日在展会现 ...

  4. rtx 加密机制_RTX发送消息提醒实现以及注意事项

    三.消息发送原理: 通过GET或者POST方式将需要发送的消息和RTX用户帐号,传给RTX提供的cgi接口. 四.消息发送方法: 功能一:发送即时消息 1.调用方式:GET/POST URL:/sen ...

  5. 单片机断电后不保存程序_法兰购买到货后直接入库保存?不不不,还需要做一件事情...

    法兰在管道工程中是较为常见的零件.在管道工程中,法兰主要用于管道的连接,在需要连接的管道,各安装一片法兰盘,低压管道可以使用丝接法兰,4公斤以上压力的使用焊合法兰:低压小直径有丝接法兰,高压和低压大直 ...

  6. Edusoho修改注册的用户密码加密机制规则

    一.简介 1.修改生成$salt的机制规则. 2.修改生成$password的机制规则. 二.edusoho的默认用户密码加密机制规则 1.系统默认生成$salt的方式: edusoho\src\Bi ...

  7. 企业使用RTX腾讯通2013

    2019独角兽企业重金招聘Python工程师标准>>> 腾讯通基本上成为了公司的默认配置,确实缺不了,这里记录一篇配置RTX,包括服务端和客户端. 1.客户端的使用 1.1 一般使用 ...

  8. 腾讯网页登陆的加密机制

    转自:http://www.cnblogs.com/DebugLZQ/archive/2011/12/31/2309100.html 问题的引入:前些天,几乎是再同时,CSDN等几大门户网站用户密码被 ...

  9. arm rtx教程_【RTX操作系统教程】第4章 RTX操作系统介绍

    第4章 RTX操作系统介绍 本章节介绍一下RTX操作系统,让大家对RTX有一个整体的了解,Keil RTX 是免版税的确定性实时操作系统,适用于 ARM 和 Cortex-M 设备. 4.1 RTX系 ...

最新文章

  1. Scala进阶之路-正则表达式案例
  2. 如何发表cscd核心论文_教育论文发表时几种核心期刊介绍
  3. inner join 和 exists 效率_19条效率至少提高3倍的MySQL技巧
  4. 04_ClickHouse表引擎概述、MergeTree系列引擎、Log系列引擎、集成引擎、特定功能的引擎(学习笔记)
  5. 如何使用Proxy模式及Java内建的动态代理机制
  6. LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用
  7. 图像处理 --- 三、图像变换 3.2 图像的几何变换
  8. 支撑双十一的网络引擎:飞天洛神
  9. 《BI那点儿事》数据挖掘各类算法——准确性验证
  10. 计算机专业开题报告指导老师意见评语,开题报告指导教师评语
  11. 如何去掉 WinCE 4.2 的桌面墙纸
  12. 移动硬盘加上密码_树莓派+Seafile+移动硬盘搭建私有云
  13. Windows/Linux/Solaris 软中断处理机制
  14. 门户通专访草根站长九天狼:做站贵在坚持
  15. 根据字体图片,查找下载Font字体
  16. 科学家计算机模拟宇宙,科学家利用计算机模拟整个宇宙的演化
  17. mimics软件临床应用.计算机辅助外科入门技术,Mimics软件临床应用 计算机辅助外科入门技术.pdf...
  18. 魔兽世界提取CG最新教程
  19. w7系统里没有iis信息服务器,win7系统控制面板的管理选项没有“internet信息服务(IIS)管理器”的解决方法...
  20. java毕业论文云笔记_《毕业设计指导的系统设计与实现》论文笔记(八)

热门文章

  1. 微信支付 php简单源码,php微信支付相关源码
  2. CAS的ABA问题及解决代码示例
  3. 初二物理模型有哪些_史上最全的初二物理复习笔记!(假期必备)
  4. python四级考试_利用Python来教你通过英语四六级!成功率95%!太牛了!
  5. 2016 下半年网络工程师上午真题及解析
  6. eclipse新建C/C++项目
  7. 【Linux】Linux的简单认识
  8. C语言中字母a等于,C语言中’a’和"a"有什么区别?,c语言中“!a"是什么意思啊...
  9. Linux学习篇——基于C语言使用结构体、链表实现贪吃蛇
  10. 在Java Web项目中建src/main/java包