rtx 加密机制_[原创]RTX(腾讯通)本地保存密码TEA变形算法及还原器
[调试逆向]
[原创]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变形算法及还原器相关推荐
- rtx 加密机制_rtx腾讯通组织架构(结构)不显示的解决办法
rtx腾讯通组织架构(结构)不显示了? 在公司,刚来的新同事的rtx腾讯通组织架构(结构)不显示,这些都是电脑上以前没有上过rtx的原因,其实很简单就可以完美的解决这一个问题. 1.首先,我以前用的方 ...
- 腾讯通服务器保存传输文件,RTX腾讯通客户端使用小结
腾讯通客户端使用手册 默认是指在WINXP系统下.WIN7系统稍有不同(ACCOUNT文件夹位置不一样). 一.安装与设置 1.安装过程. i.直接双击运行RTX源程序. ii.安装过程中,在如下步骤 ...
- 5g通用模组是什么_中国移动联合芯讯通发布5G终端、芯片及测试产业报告
11月19日,2020中国移动全球合作伙伴大会以"5G融入百业 数智引领未来"为主题在广州召开,从多个维度展现了中国移动运用5G技术驱动各行业转型升级的强大实力.并于21日在展会现 ...
- rtx 加密机制_RTX发送消息提醒实现以及注意事项
三.消息发送原理: 通过GET或者POST方式将需要发送的消息和RTX用户帐号,传给RTX提供的cgi接口. 四.消息发送方法: 功能一:发送即时消息 1.调用方式:GET/POST URL:/sen ...
- 单片机断电后不保存程序_法兰购买到货后直接入库保存?不不不,还需要做一件事情...
法兰在管道工程中是较为常见的零件.在管道工程中,法兰主要用于管道的连接,在需要连接的管道,各安装一片法兰盘,低压管道可以使用丝接法兰,4公斤以上压力的使用焊合法兰:低压小直径有丝接法兰,高压和低压大直 ...
- Edusoho修改注册的用户密码加密机制规则
一.简介 1.修改生成$salt的机制规则. 2.修改生成$password的机制规则. 二.edusoho的默认用户密码加密机制规则 1.系统默认生成$salt的方式: edusoho\src\Bi ...
- 企业使用RTX腾讯通2013
2019独角兽企业重金招聘Python工程师标准>>> 腾讯通基本上成为了公司的默认配置,确实缺不了,这里记录一篇配置RTX,包括服务端和客户端. 1.客户端的使用 1.1 一般使用 ...
- 腾讯网页登陆的加密机制
转自:http://www.cnblogs.com/DebugLZQ/archive/2011/12/31/2309100.html 问题的引入:前些天,几乎是再同时,CSDN等几大门户网站用户密码被 ...
- arm rtx教程_【RTX操作系统教程】第4章 RTX操作系统介绍
第4章 RTX操作系统介绍 本章节介绍一下RTX操作系统,让大家对RTX有一个整体的了解,Keil RTX 是免版税的确定性实时操作系统,适用于 ARM 和 Cortex-M 设备. 4.1 RTX系 ...
最新文章
- Scala进阶之路-正则表达式案例
- 如何发表cscd核心论文_教育论文发表时几种核心期刊介绍
- inner join 和 exists 效率_19条效率至少提高3倍的MySQL技巧
- 04_ClickHouse表引擎概述、MergeTree系列引擎、Log系列引擎、集成引擎、特定功能的引擎(学习笔记)
- 如何使用Proxy模式及Java内建的动态代理机制
- LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用
- 图像处理 --- 三、图像变换 3.2 图像的几何变换
- 支撑双十一的网络引擎:飞天洛神
- 《BI那点儿事》数据挖掘各类算法——准确性验证
- 计算机专业开题报告指导老师意见评语,开题报告指导教师评语
- 如何去掉 WinCE 4.2 的桌面墙纸
- 移动硬盘加上密码_树莓派+Seafile+移动硬盘搭建私有云
- Windows/Linux/Solaris 软中断处理机制
- 门户通专访草根站长九天狼:做站贵在坚持
- 根据字体图片,查找下载Font字体
- 科学家计算机模拟宇宙,科学家利用计算机模拟整个宇宙的演化
- mimics软件临床应用.计算机辅助外科入门技术,Mimics软件临床应用 计算机辅助外科入门技术.pdf...
- 魔兽世界提取CG最新教程
- w7系统里没有iis信息服务器,win7系统控制面板的管理选项没有“internet信息服务(IIS)管理器”的解决方法...
- java毕业论文云笔记_《毕业设计指导的系统设计与实现》论文笔记(八)
热门文章
- 微信支付 php简单源码,php微信支付相关源码
- CAS的ABA问题及解决代码示例
- 初二物理模型有哪些_史上最全的初二物理复习笔记!(假期必备)
- python四级考试_利用Python来教你通过英语四六级!成功率95%!太牛了!
- 2016 下半年网络工程师上午真题及解析
- eclipse新建C/C++项目
- 【Linux】Linux的简单认识
- C语言中字母a等于,C语言中’a’和"a"有什么区别?,c语言中“!a"是什么意思啊...
- Linux学习篇——基于C语言使用结构体、链表实现贪吃蛇
- 在Java Web项目中建src/main/java包