本来想写个详细的,心情有点恶,还是算了吧....
加密通讯,在这是指两个飞秋用户之间的聊天信息的加密.加密通讯的数据包分为两个部分,一是聊天消息的加密,二是将加密聊天消息的密钥加密,然后将两个加密内容都转换为可显字符.
A向B要向B发送聊天信息...软件都作了些什么呢?
1:A向B发送下面这样的一个UDP数据包
char QingQiuMiShi[]="1_1bt2_82#128#00065B901234#0#0#0:1217863660:Administrator:HD-SJK-YHF:114:21003";
2:B向A应答一个类似上面结构的数据包,其中包含转换成可显示字符的加密通讯密钥.
3:A用收到的这个密钥加密消并发送给B
①:将收到的密钥进行转换,怎样的转换呢?像这样:将字串"EAFB9D45"转换为0x45,0x9D,0xFB,0xEA.注意头尾对换位置.解析出来的通讯密钥长0x80.
②:用CryptAcquireContext()创建一个命名的密码容器,将上面解析出来的通讯密钥用CryptImportKey()导入,导入时的密钥=0x10长度的固定数据+上面解析出来的密钥,
③:加密要用到两个数据表,在这我称为表a和表b.用上面导入的密钥初始化这两个表(程序在这个和上个步骤之间用了CryptGenRandom产生随机数,所以每次加密结果不一样)
下面的操作除特别说明外,字长均是DWORD
⑴:将一个内存地址的数据赋给表a,长度0x12;
⑵:将一个内存地址的数据赋给表b,长度0x400;
⑶:用第②步导入的密钥前0x10个字循环异或表a数据
⑷:首先调用一加密函数加密为0的两相DWORD字,将结果覆盖表a前面两个DWORD,再将结果作为下一轮加密字调用函数加密,结果再覆盖表a后面的内容。循环上面操作,直到表a内容全部覆盖。
⑸:将上面最后一个加密结果,调用加密函数,再加密,将加密结果的两个DWORD覆盖表b的内容,如此循环操作,直到表b也完成覆盖。
至此两个表初始化完成
④:填充待加密消息。将待加密消息长度置为向上的8的整倍数,即如长度为6(包括结尾的\0\字符),那待加密的长度(6/8的商+1)*8=8,待加密消息缓冲不足长度的地方填充字符=待加密长度--原消息长度=0x02。
⑤:加密消息。调用函数每次加密两个DWORD值,结果高低位换位,存入原地址,循环直到加密完成。
⑥:加密密钥。用CryptEncrypt()将初始化表a、表b的密钥加密。
⑦:转换加密结果为可显示字符。形式类似这样:将0xEA,0xAB,0x90,0x12转换为"1290ABEA"的字串,注意头尾换位,而消息密文是不用关尾换位的。
⑧:发送消处。将加密后的密钥密文和消息密文以一定形式组合,发送即完成。
本来想给出一图,是测试程序发给目标程序的,谁知要链接...,上传测试程序也不知从哪上传....
顺便提下,程序的授权码产生流程,不一定正确,用产生一加密密钥(每机不一样),用这密钥初始化表a、表b,调用函数加密特征码,用加密结果作运算产生授权码....
最后说下,飞秋真的不错,希望大家只作些技术研究,不要作一些注册机,消息攻击器什么的,没意思,这样弄来弄去的就会像CS一样,作弊的多了就没兴趣玩了--还不是怪流传作弊的人...
本来想写个详细的,心情有点恶,还是算了吧....
加密通讯,在这是指两个飞秋用户之间的聊天信息的加密.加密通讯的数据包分为两个部分,一是聊天消息的加密,二是将加密聊天消息的密钥加密,然后将两个加密内容都转换为可显字符.
A向B要向B发送聊天信息...软件都作了些什么呢?
1:A向B发送下面这样的一个UDP数据包
char QingQiuMiShi[]="1_1bt2_82#128#00065B901234#0#0#0:1217863660:Administrator:HD-SJK-YHF:114:21003";
2:B向A应答一个类似上面结构的数据包,其中包含转换成可显示字符的加密通讯密钥.
3:A用收到的这个密钥加密消并发送给B
①:将收到的密钥进行转换,怎样的转换呢?像这样:将字串"EAFB9D45"转换为0x45,0x9D,0xFB,0xEA.注意头尾对换位置.解析出来的通讯密钥长0x80.
②:用CryptAcquireContext()创建一个命名的密码容器,将上面解析出来的通讯密钥用CryptImportKey()导入,导入时的密钥=0x10长度的固定数据+上面解析出来的密钥,
③:加密要用到两个数据表,在这我称为表a和表b.用上面导入的密钥初始化这两个表(程序在这个和上个步骤之间用了CryptGenRandom产生随机数,所以每次加密结果不一样)
下面的操作除特别说明外,字长均是DWORD
⑴:将一个内存地址的数据赋给表a,长度0x12;
⑵:将一个内存地址的数据赋给表b,长度0x400;
⑶:用第②步导入的密钥前0x10个字循环异或表a数据
⑷:首先调用一加密函数加密为0的两相DWORD字,将结果覆盖表a前面两个DWORD,再将结果作为下一轮加密字调用函数加密,结果再覆盖表a后面的内容。循环上面操作,直到表a内容全部覆盖。
⑸:将上面最后一个加密结果,调用加密函数,再加密,将加密结果的两个DWORD覆盖表b的内容,如此循环操作,直到表b也完成覆盖。
至此两个表初始化完成
④:填充待加密消息。将待加密消息长度置为向上的8的整倍数,即如长度为6(包括结尾的\0\字符),那待加密的长度(6/8的商+1)*8=8,待加密消息缓冲不足长度的地方填充字符=待加密长度--原消息长度=0x02。
⑤:加密消息。调用函数每次加密两个DWORD值,结果高低位换位,存入原地址,循环直到加密完成。
⑥:加密密钥。用CryptEncrypt()将初始化表a、表b的密钥加密。
⑦:转换加密结果为可显示字符。形式类似这样:将0xEA,0xAB,0x90,0x12转换为"1290ABEA"的字串,注意头尾换位,而消息密文是不用关尾换位的。
⑧:发送消处。将加密后的密钥密文和消息密文以一定形式组合,发送即完成。
本来想给出一图,是测试程序发给目标程序的,谁知要链接...,上传测试程序也不知从哪上传....
顺便提下,程序的授权码产生流程,不一定正确,用产生一加密密钥(每机不一样),用这密钥初始化表a、表b,调用函数加密特征码,用加密结果作运算产生授权码....
最后说下,飞秋真的不错,希望大家只作些技术研究,不要作一些注册机,消息攻击器什么的,没意思,这样弄来弄去的就会像CS一样,作弊的多了就没兴趣玩了--还不是怪流传作弊的人...