开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4285|回复: 4
收起左侧

[技术专题] pcqq official汇编算法翻译

[复制链接]
结帖率:0% (0/1)
发表于 2019-4-3 10:18:27 | 显示全部楼层 |阅读模式   广东省广州市
pcqq协议 0836中有一个official算法,貌似和稳定性有关,汇编代码为
mov eax, [ebp+0Ch]
mov eax, [eax]
add eax, 08h
push eax
mov edx, [ebp+08h]
mov edx, [edx]
add edx, 08h
mov ecx, [ebp+10h]
mov ecx, [ecx]
add ecx, 08h
call 00000024Ch

mov esp, ebp
pop ebp
retn 000Ch

sub esp, 14h
mov eax, [edx]
push ebx
mov [esp+14h], ecx
mov ebx, 00000010h
mov ecx, [esp+1Ch]
push ebp
push esi
mov esi, [edx+04h]
mov edx, [ecx+04h]
mov [esp+0Ch], edx
mov edx, [ecx]
mov ebp, [esp+0Ch]
mov [esp+10h], edx
mov edx, [ecx+0Ch]
mov ecx, [ecx+08h]
push edi
bswap esi
bswap eax
mov edi, 9E3779B9h
mov [esp+1Ch], edx
mov [esp+18h], ecx
mov edx, esi
mov ecx, esi
shr edx, 05h
shl ecx, 04h
add edx, ebp
add ecx, [esp+14h]
xor edx, ecx
lea ecx, [esi+edi]
xor edx, ecx
add eax, edx
mov edx, eax
mov ecx, eax
shl edx, 04h
add edx, [esp+18h]
shr ecx, 05h
add ecx, [esp+1Ch]
xor edx, ecx
lea ecx, [eax+edi]
xor edx, ecx
lea edi, [edi-61C88647h]
add esi, edx
dec ebx
jne 00000041h
mov ebp, [esp+20h]
bswap esi
pop edi
bswap eax
mov [ebp+04h], esi
mov [ebp+00h], eax
mov eax, ebp
pop esi
pop ebp
pop ebx
add esp, 14h
retn 0004h

翻译成c++:
#include "stdafx.h"

typedef unsigned char BYTE;

BYTE* Long2Bytes(unsigned long n);
unsigned long Bytes2Long(BYTE *bytes);
BYTE* ReverseBytes(BYTE* data, int size);
void Official(BYTE *data, BYTE *key, BYTE *result);
BYTE* SubBytes(BYTE *bytes, int start, int count);
void PrintBytes(BYTE *bytes, int size);

int _tmain(int argc, _TCHAR* argv[])
{
        BYTE *data = new BYTE[8]{1, 2, 3, 4, 5, 6, 7, 8};//要加密的数据
        BYTE *key = new BYTE[16]{9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};//加密key
        BYTE *result = new BYTE[8]{0};//加密结果
        Official(data, key, result);
        PrintBytes(result,8);
        delete[] data;
        delete[] key;
        delete[] result;
        getchar();
        return 0;
}
void PrintBytes(BYTE *bytes, int size){
        for (int i = 0; i < size; i++){
                printf("%d ",bytes[i]);
        }
}
void Official(BYTE *data, BYTE *key, BYTE *result){
        unsigned long eax = Bytes2Long(SubBytes(data,0,4));
        unsigned long esi = Bytes2Long(SubBytes(data, 4, 4));
        unsigned long var4 = Bytes2Long(ReverseBytes(SubBytes(key, 0, 4), 4));
        unsigned long ebp = Bytes2Long(ReverseBytes(SubBytes(key, 4, 4), 4));
        unsigned long var3 = Bytes2Long(ReverseBytes(SubBytes(key, 8, 4), 4));
        unsigned long var2 = Bytes2Long(ReverseBytes(SubBytes(key, 12, 4), 4));
        //printf("%lu %lu %lu %lu %lu %lu\n", eax,esi,var4, ebp, var3, var2);

        unsigned long edi = 0x9E3779B9;
        unsigned long edx = 0;
        unsigned long ecx = 0;
        for (int i = 0; i < 16; i++){
                edx = esi;
                ecx = esi;
                edx = edx >> 5;
                ecx = ecx << 4;
                edx += ebp;
                ecx += var4;
                edx = edx ^ ecx;
                ecx = esi + edi;
                edx = edx ^ ecx;
                eax += edx;
                edx = eax;
                ecx = eax;
                edx = edx << 4;
                edx = edx + var3;
                ecx = ecx >> 5;
                ecx += var2;
                edx = edx ^ ecx;
                ecx = eax + edi;
                edx = edx ^ ecx;
                edi -= 0x61C88647;
                esi += edx;
        }
        memcpy(result,Long2Bytes(eax), 4);
        memcpy(result+4, Long2Bytes(esi), 4);
}
BYTE* Long2Bytes(unsigned long n){
        BYTE *temp = new BYTE[4];
        temp[0] = n / 16777216;
        temp[1] = (n - temp[0] * 16777216)/65536;
        temp[2] = (n - temp[0] * 16777216 - temp[1] * 65536) / 256;
        temp[3] = (n - temp[0] * 16777216 - temp[1] * 65536-temp[2]*256);
        return temp;
}
unsigned long Bytes2Long(BYTE *bytes){
        unsigned long a =bytes[0] * 16777216;
        unsigned long  b = bytes[1] * 65536;
        unsigned long  c = bytes[2] * 256;
        unsigned long  d = bytes[3];
        unsigned long  n = a + b + c + d;
        return n;
}
//因为数据在内存中是从低到高存放的,所以要反取字节
BYTE* ReverseBytes(BYTE* bytes, int size){
        BYTE *temp = new BYTE[size];
        for (int i = 0; i < size; i++){
                temp[i] = bytes[size - i - 1];
        }
        return temp;
}
BYTE* SubBytes(BYTE* bytes, int start, int count){
        BYTE *temp = new BYTE[count];
        for (int i = 0; i < count; i++){
                temp[i] = bytes[start + i];
        }
        return temp;
}



评分

参与人数 1精币 +1 收起 理由
被封禁言 + 1 支持开源~!感谢分享

查看全部评分


结帖率:78% (21/27)
发表于 2019-4-17 11:31:44 | 显示全部楼层   安徽省阜阳市
感谢分享,收藏一下再看
回复 支持 反对

使用道具 举报

发表于 2019-4-13 02:29:38 | 显示全部楼层   广东省广州市
感谢分享。。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2019-4-13 02:29:22 | 显示全部楼层   广东省广州市
感谢分享。。。。。。。。。。。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2019-4-7 00:26:48 | 显示全部楼层   河南省商丘市
pcqq official汇编算法翻译
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表