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.页面制作