dd765139628 发表于 2020-4-23 15:53:21

pcqq official汇编算法翻译

pcqq协议 0836中有一个official算法,貌似和稳定性有关,汇编代码为mov eax, mov eax, add eax, 08hpush eaxmov edx, mov edx, add edx, 08hmov ecx, mov ecx, add ecx, 08hcall 00000024Ch
mov esp, ebppop ebpretn 000Ch
sub esp, 14hmov eax, push ebxmov , ecxmov ebx, 00000010hmov ecx, push ebppush esimov esi, mov edx, mov , edxmov edx, mov ebp, mov , edxmov edx, mov ecx, push edibswap esibswap eaxmov edi, 9E3779B9hmov , edxmov , ecxmov edx, esimov ecx, esishr edx, 05hshl ecx, 04hadd edx, ebpadd ecx, xor edx, ecxlea ecx, xor edx, ecxadd eax, edxmov edx, eaxmov ecx, eaxshl edx, 04hadd edx, shr ecx, 05hadd ecx, xor edx, ecxlea ecx, xor edx, ecxlea edi, add esi, edxdec ebxjne 00000041hmov ebp, bswap esipop edibswap eaxmov , esimov , eaxmov eax, ebppop esipop ebppop ebxadd esp, 14hretn 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{1, 2, 3, 4, 5, 6, 7, 8};//要加密的数据      BYTE *key = new BYTE{9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};//加密key      BYTE *result = new BYTE{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);      }}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;      temp = n / 16777216;      temp = (n - temp * 16777216)/65536;      temp = (n - temp * 16777216 - temp * 65536) / 256;      temp = (n - temp * 16777216 - temp * 65536-temp*256);      return temp;}unsigned long Bytes2Long(BYTE *bytes){      unsigned long a =bytes * 16777216;      unsigned longb = bytes * 65536;      unsigned longc = bytes * 256;      unsigned longd = bytes;      unsigned longn = a + b + c + d;      return n;}//因为数据在内存中是从低到高存放的,所以要反取字节BYTE* ReverseBytes(BYTE* bytes, int size){      BYTE *temp = new BYTE;      for (int i = 0; i < size; i++){                temp = bytes;      }      return temp;}BYTE* SubBytes(BYTE* bytes, int start, int count){      BYTE *temp = new BYTE;      for (int i = 0; i < count; i++){                temp = bytes;      }      return temp;}

zxc654987 发表于 2020-12-10 03:59:18


论坛不能没有像楼主这样的人才啊!我会一直支持易语言吧。

yyz860723 发表于 2021-5-29 01:01:42

楼主发贴辛苦了,谢谢楼主分享!我觉得易语言吧是注册对了!
页: [1]
查看完整版本: pcqq official汇编算法翻译