在分析pcqq协议时,0836包里有一个official算法,经多次测试发现,如果这个算法没有或者错误,会导致账号被冻结或屏蔽。为了解决这个问题,我们要逆向这个算法
1.用od调试找到这个算法的汇编代码为

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 00000024Chmov esp, ebp
pop ebp
retn 000Chsub 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

2.汇编找到了,但是怎么在代码里面调用呢?第一种办法:vs可以直接在_asm{}块中嵌套汇编代码。但是我的call 00000024h这一段不知道为什么会报错,所以只能用第二种办法了,就是直接翻译成c源码。
3.这时默默地打开了从看雪论坛买来的加密与解密第四版一书,看了两章,然后直接开干。代码如下

// test.cpp : 定义控制台应用程序的入口点。#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};//加密keyBYTE *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;
}

4.在这里有个要注意的地方就是数字类型必须是unsigned long,否则会数据溢出,导致算法计算错误…坑

PCQQ official算法逆向相关推荐

  1. 微信公众平台js算法逆向

    大家好我是J哥,js逆向已经是爬虫工程师进阶必会的了,今天我来带领大家演练一下关于微信公众平台js算法逆向的学习,希望对大家有所帮助. 一.首先我们对页面整体进行分析和我们所要配对的环境 https: ...

  2. 红米k30 允许调用gpu调试层_记一次APP的so层算法逆向(六)

    " 前言:初学逆向 请多多指教" 学习到的内容 - 1.在java层,对容器类的对象进行hook来进行快速定位 2.ida的findcrypt插件对so层的算法快速识别 3.文章分 ...

  3. 抖音xg03算法逆向杂谈

    抖音xg03算法逆向杂谈 @[toc] # 1: 修复jni_onload不能f5 ## 1.1 jni_onload函数初探 使用ida打开libcms.so 定位到Jni_Onload函数. [外 ...

  4. 湖北校园网PC端拨号算法逆向

    湖北校园网PC端拨号算法逆向 前言 上一文 PPPoE中间人拦截以及校园网突破漫谈我们谈到使用 PPPoE 拦截来获取真实的账号密码. 在这个的基础上,我对我们湖北的客户端进行了逆向,得到了拨号加密算 ...

  5. wifi定位算法 java_记一次APP的so层算法逆向(七)

    " 前言:初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了..." 学习到的内容 - 1.新学习到IDA的一些分析时候的小技巧 2.算法还原代码实现的练习(有个参数没有分 ...

  6. 逆向so_记一次APP的so层算法逆向(七)

    " 前言:初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了..." 学习到的内容 - 1.新学习到IDA的一些分析时候的小技巧 2.算法还原代码实现的练习(有个参数没有分 ...

  7. 某影视APP算法逆向分析

    一.抓取数据包 1.请求头有%加十六进制,说以是url编码,先解密一下 GET http://m.mapps.m1905.cn/User/sendVer?request=jYgPer7AuEqdM+D ...

  8. MD5算法逆向快速分析

    1. MD5基本原理 MD5即Message-Digest Algorithm 5(信息-摘要算法5),主要用于确保信息一致性.MD5原理简要概述为以512位分组来处理输入的信息,且每一分组又被划分为 ...

  9. 基础入门-算法逆向散列对称非对称JS源码逆向AESDESRSASHA

    文章目录 安全测试中: 加密解密-识别特征&解密条件 其他密文特点见: 解密实例-密文存储&数据传输 课件附加资源百度云 安全测试中: 密文-有源码直接看源码分析算法(后端必须要有源码 ...

  10. 010 Editor算法逆向与编写注册机

    010editor是一款非常好用的十六进制编辑工具,但是因为他是收费软件,我们接下来对此软件进行一下破解与编写注册机 将程序拖入OD,通过字符串搜索定位到核心代码,经过分析,主要是如下图所示的两个关键 ...

最新文章

  1. SAP Return to External Vendor
  2. AbstractBeanDefinition:lenientConstructorResolution属性源码分析
  3. CSS3 @font-face
  4. python app教程-Python zipapp打包教程(超级详细)
  5. php中按引用传递参数,如何通过PHP中的引用传递可变参数的参数?
  6. getchar的利用
  7. 运行mapreduce程序yarn的web端显示进度
  8. vSphere虚拟化使用第三方备份方案常见CBT故障实战处理
  9. Java笔记(二十一) 动态代理
  10. mac 下 hadoop、spark 的安装及配置
  11. 图像局部特征(十二)--BRISK特征
  12. 5000字超干货,新中国成立70年人口流动迁移的特征与趋势可视化!
  13. 如何在华为交换机上查询光模块DDM信息?
  14. 3.2【微信小程序全栈开发课程】登录功能(一)--实现登录功能
  15. GPU深度学习训练时出现train_loss一直不变且val_loss不变的问题
  16. java创建exe程序快捷方式
  17. python数字分割
  18. 解决MAC系统字体模糊发虚,并更换默认中文字体为微软雅黑
  19. matlab使用mex编译c语言报错undefined reference to `__imp_WSAStartup‘
  20. 22nd Century向FDA递交该公司极低尼古丁含量香烟的改良风险烟草产品(MRTP)申请

热门文章

  1. (STM32F103ZET6)SG90舵机的驱动程序
  2. 47001 data format error hint -- 解析 JSON/XML 内容错误
  3. 【中级计量经济学】Lecture 1 计量经济学初步
  4. Matlab一维数据的中值滤波与均值滤波函数
  5. 泛函分析复习笔记(二)线性算子与线性泛函
  6. 字节跳动面试题 —— 水壶问题
  7. 2022电大国家开放大学网上形考任务-国学经典选读(山东)非免费(非答案)
  8. 硕士论文中期汇报ppt_做一场合格的中期汇报
  9. oa系统是什么?如何使用企业oa办公系统?
  10. ZeNmap端口扫描工具详解10种扫描方式附使用脚本扫描教程