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库中。

经验分享 程序员 微信小程序 职场和发展