PC微信逆向-PC微信HOOK-生成彩色二维码(版本3.0.0.47)
Protobuf文件内容:
二维码是由网址生成的,HOOK端获取网址的代码(VC++):
QT端生成二维码要用到QrCode库,下载地址:
QT端生成二维码代码:
//接收二维码数据包
WeChatHelper::Packet packet;
packet.ParseFromArray(data, len);
int cmdid = packet.cmdid();
switch(cmdid)
{
case WM_ShowQrPicture:
{
QString qrcUrl=QString::fromUtf8(packet.data().c_str());
qDebug()<<"qrcode:"<<qrcUrl;
//生成二维码图像
QPixmap pix=createQRCode(qrcUrl);
if(pix.width()>0)
{
mqrcodeWidget->qrcodeImg->setImage(pix);
mqrcodeWidget->show();
mqrcodeWidget->raise();
}
break;
}
}
生成二维码函数:
#include "QRCode/qrencode.h"
//通过网址创建二维码图像
QPixmap createQRCode(const QString &text)
{
int margin = 2;
if (text.length() == 0)
{
return QPixmap();
}
QRcode *qrcode = QRcode_encodeString(text.toLocal8Bit(), 2, QR_ECLEVEL_H, QR_MODE_8, 0);
if (qrcode == NULL) {
return QPixmap();
}
unsigned char *p, *q;
p = NULL;
q = NULL;
int x, y, bit;
int realwidth;
realwidth = qrcode->width;
QPixmap pix(realwidth, realwidth);
QPainter painter;
painter.begin(&pix);
painter.fillRect(QRect(0,0,realwidth,realwidth),QColor(245,245,245));
p = qrcode->data;
//二维码色彩模板图像
QImage image(":/images/base/qrcode_bg.png");
image=image.scaledToWidth(qrcode->width);
//qDebug()<<"qrcode_width"<<qrcode->width;
for(y=0; y<qrcode->width; y++)
{
bit = 3;
q += margin / 4;
bit = 3 - (margin % 4);
for(x=0; x<qrcode->width; x++)
{
QColor color=image.pixelColor(x,y);
if ((*p & 1) << bit)
{
//黑点从图像中取色
painter.fillRect(QRect(x, y, 1,1),color);
}
else
{
//白色区域
painter.fillRect(QRect(x, y, 1,1),QColor(245,245,245));
}
bit--;
if(bit < 0)
{
q++;
bit = 3;
}
p++;
}
}
free(qrcode);
painter.end();
//二维码边框
QPixmap qrcodeFrame(":/images/base/qrcode_frame.png");
//二维码Logo
QPixmap qrcodeLogo(":/images/base/qrc_logo.png");
qrcodeFrame=qrcodeFrame.scaled(280,280, Qt::KeepAspectRatio,
Qt::SmoothTransformation);
pix=pix.scaledToWidth(200);
QPixmap returnPix(280,280);
painter.begin(&returnPix);
painter.fillRect(QRect(0,0,280,280),QColor(245,245,245));
painter.drawPixmap(QRect(0,0,280,280),qrcodeFrame,QRect(0,0,280,280));
painter.drawPixmap(QRect(40,40,200,200),pix,QRect(0,0,200,200));
int logoPos=(280-64)/2;
painter.drawPixmap(QRect(logoPos,logoPos,64,64),qrcodeLogo,QRect(0,0,64,64));
painter.end();
return returnPix.scaledToWidth(280);
}
代码中用到的三个图像在QrCode库中。
上一篇:
uniapp开发微信小程序-2.页面制作
