银行存款截图生成器,银行卡余额p图神器,js+c++逆向思路

857 阅读3分钟

 下载地址:wenshushu.vip/download.ph…

完整的银行存款截图生成器实现方案,包含前端HTML/CSS/JavaScript界面和C++后端处理逻辑,以及逆向分析思路:

前端Web界面实现

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>银行交易模拟生成器</title>
    <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
    <style>
        .bank-bg {
            background: linear-gradient(135deg, #1a3c8b 0%, #0d6efd 100%);
        }
        .receipt {
            font-family: 'Arial', sans-serif;
            background: white;
            box-shadow: 0 10px 30px rgba(0,0,0,0.2);
            border-radius: 15px;
        }
        .watermark {
            opacity: 0.1;
            pointer-events: none;
        }
    </style>
</head>
<body class="min-h-screen bank-bg flex items-center justify-center p-4">
    <div class="w-full max-w-4xl">
        <div class="bg-white rounded-xl shadow-2xl overflow-hidden">
            <div class="p-6 bg-blue-800 text-white">
                <h1 class="text-2xl font-bold">银行交易模拟生成器</h1>
                <p class="text-blue-200">生成逼真的银行交易截图</p>
            </div>
            
            <div class="grid md:grid-cols-3 gap-6 p-6">
                <!-- 控制面板 -->
                <div class="md:col-span-1 space-y-4">
                    <div>
                        <label class="block text-sm font-medium text-gray-700 mb-1">银行选择</label>
                        <select id="bankSelect" class="w-full px-3 py-2 border rounded-md">
                            <option value="icbc">工商银行</option>
                            <option value="ccb">建设银行</option>
                            <option value="abc">农业银行</option>
                            <option value="boc">中国银行</option>
                        </select>
                    </div>
                    
                    <div>
                        <label class="block text-sm font-medium text-gray-700 mb-1">交易类型</label>
                        <select id="transType" class="w-full px-3 py-2 border rounded-md">
                            <option value="deposit">存款</option>
                            <option value="withdraw">取款</option>
                            <option value="transfer">转账</option>
                        </select>
                    </div>
                    
                    <div id="amountField">
                        <label class="block text-sm font-medium text-gray-700 mb-1">金额 (元)</label>
                        <input type="number" id="amount" class="w-full px-3 py-2 border rounded-md" placeholder="1000.00">
                    </div>
                    
                    <div id="transferFields" class="hidden space-y-4">
                        <div>
                            <label class="block text-sm font-medium text-gray-700 mb-1">收款人</label>
                            <input type="text" id="receiver" class="w-full px-3 py-2 border rounded-md" placeholder="张三">
                        </div>
                        <div>
                            <label class="block text-sm font-medium text-gray-700 mb-1">收款账号</label>
                            <input type="text" id="receiverAccount" class="w-full px-3 py-2 border rounded-md" placeholder="6222 8888 8888 8888">
                        </div>
                    </div>
                    
                    <div>
                        <label class="block text-sm font-medium text-gray-700 mb-1">交易时间</label>
                        <input type="datetime-local" id="transTime" class="w-full px-3 py-2 border rounded-md">
                    </div>
                    
                    <div>
                        <label class="block text-sm font-medium text-gray-700 mb-1">交易状态</label>
                        <select id="transStatus" class="w-full px-3 py-2 border rounded-md">
                            <option value="success">交易成功</option>
                            <option value="processing">处理中</option>
                            <option value="failed">交易失败</option>
                        </select>
                    </div>
                    
                    <button id="generateBtn" class="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 px-4 rounded-md transition">
                        生成截图
                    </button>
                    
                    <button id="downloadBtn" class="w-full bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-md transition hidden">
                        下载截图
                    </button>
                </div>
                
                <!-- 预览区域 -->
                <div class="md:col-span-2">
                    <div class="receipt p-6 relative">
                        <div class="watermark absolute inset-0 flex items-center justify-center text-gray-400 text-6xl font-bold rotate-45">
                            模拟生成
                        </div>
                        <div id="receiptContent">
                            <!-- 动态生成的内容将显示在这里 -->
                            <div class="text-center py-20 text-gray-400">
                                请配置参数后生成预览
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script src="script.js"></script>
</body>
</html>


// 银行模板数据
const bankTemplates = {
    icbc: {
        name: "中国工商银行",
        logo: "https://example.com/icbc-logo.png",
        color: "#c12f2f",
        receiptStyle: "icbc-style"
    },
    ccb: {
        name: "中国建设银行",
        logo: "https://example.com/ccb-logo.png",
        color: "#1a3c8b",
        receiptStyle: "ccb-style"
    },
    abc: {
        name: "中国农业银行",
        logo: "https://example.com/abc-logo.png",
        color: "#0d6efd",
        receiptStyle: "abc-style"
    },
    boc: {
        name: "中国银行",
        logo: "https://example.com/boc-logo.png",
        color: "#c12f2f",
        receiptStyle: "boc-style"
    }
};

// 生成随机银行账号
function generateBankAccount(bankCode) {
    let prefix = "";
    switch(bankCode) {
        case "icbc": prefix = "6222"; break;
        case "ccb": prefix = "4367"; break;
        case "abc": prefix = "6228"; break;
        case "boc": prefix = "4563"; break;
        default: prefix = "6222";
    }
    
    let account = prefix;
    for(let i = 0; i < 12; i++) {
        account += Math.floor(Math.random() * 10);
    }
    
    // 添加空格每4位
    return account.replace(/(\d{4})(?=\d)/g, "$1 ");
}

// 数字转中文大写
function numberToChinese(num) {
    const chineseNums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
    const chineseUnits = ["", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"];
    
    let str = num.toString().split(".")[0];
    let result = "";
    
    for(let i = 0; i < str.length; i++) {
        const digit = parseInt(str[i]);
        const unit = chineseUnits[str.length - 1 - i];
        result += chineseNums[digit] + unit;
    }
    
    // 处理小数部分
    if(num.toString().includes(".")) {
        result += "点";
        const decimalPart = num.toString().split(".")[1];
        for(let i = 0; i < decimalPart.length; i++) {
            const digit = parseInt(decimalPart[i]);
            result += chineseNums[digit];
        }
    }
    
    return result + "元整";
}

// 生成交易流水号
function generateTransactionId() {
    const date = new Date();
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    const random = Math.floor(Math.random() * 1000000).toString().padStart(6, '0');
    return `${year}${month}${day}${random}`;
}

// 初始化页面
document.addEventListener('DOMContentLoaded', function() {
    // 设置默认时间为当前时间
    const now = new Date();
    const timeString = now.toISOString().slice(0, 16);
    document.getElementById('transTime').value = timeString;
    
    // 为收款账号生成随机账号
    document.getElementById('receiverAccount').value = generateBankAccount('icbc');
    
    // 交易类型变化时显示/隐藏转账相关字段
    document.getElementById('transType').addEventListener('change', function() {
        const transferFields = document.getElementById('transferFields');
        if(this.value === 'transfer') {
            transferFields.classList.remove('hidden');
        } else {
            transferFields.classList.add('hidden');
        }
    });
    
    // 银行选择变化时更新收款账号
    document.getElementById('bankSelect').addEventListener('change', function() {
        document.getElementById('receiverAccount').value = generateBankAccount(this.value);
    });
    
    // 生成按钮点击事件
    document.getElementById('generateBtn').addEventListener('click', generateReceipt);
    
    // 下载按钮点击事件
    document.getElementById('downloadBtn').addEventListener('click', downloadReceipt);
});

// 生成收据内容
function generateReceipt() {
    const bank = document.getElementById('bankSelect').value;
    const transType = document.getElementById('transType').value;
    const amount = parseFloat(document.getElementById('amount').value) || 0;
    const receiver = document.getElementById('receiver').value || "张三";
    const receiverAccount = document.getElementById('receiverAccount').value;
    const transTime = document.getElementById('transTime').value;
    const transStatus = document.getElementById('transStatus').value;
    
    const template = bankTemplates[bank];
    const dateObj = new Date(transTime);
    const formattedDate = `${dateObj.getFullYear()}${dateObj.getMonth() + 1}${dateObj.getDate()}日`;
    const formattedTime = `${dateObj.getHours().toString().padStart(2, '0')}:${dateObj.getMinutes().toString().padStart(2, '0')}:${dateObj.getSeconds().toString().padStart(2, '0')}`;
    
    let receiptHTML = `
        <div class="${template.receiptStyle}">
            <div class="flex justify-between items-center border-b pb-4 mb-4">
                <img src="${template.logo}" alt="${template.name} Logo" class="h-12">
                <div class="text-right">
                    <h2 class="text-xl font-bold">${template.name}</h2>
                    <p class="text-sm text-gray-500">电子交易凭证</p>
                </div>
            </div>
            
            <div class="space-y-4">
                <div class="flex justify-between">
                    <span class="text-gray-600">交易类型:</span>
                    <span class="font-medium">${
                        transType === 'deposit' ? '存款' : 
                        transType === 'withdraw' ? '取款' : '转账'
                    }</span>
                </div>
                
                <div class="flex justify-between">
                    <span class="text-gray-600">交易时间:</span>
                    <span class="font-medium">${formattedDate} ${formattedTime}</span>
                </div>
                
                <div class="flex justify-between">
                    <span class="text-gray-600">交易流水号:</span>
                    <span class="font-medium">${generateTransactionId()}</span>
                </div>
                
                <div class="flex justify-between">
                    <span class="text-gray-600">交易状态:</span>
                    <span class="font-medium ${
                        transStatus === 'success' ? 'text-green-600' : 
                        transStatus === 'failed' ? 'text-red-600' : 'text-yellow-600'
                    }">
                        ${
                            transStatus === 'success' ? '交易成功' : 
                            transStatus === 'failed' ? '交易失败' : '处理中'
                        }
                    </span>
                </div>
                
                ${transType === 'transfer' ? `
                <div class="border-t pt-4 mt-4">
                    <h3 class="font-bold mb-2">转账详情</h3>
                    <div class="space-y-2">
                        <div class="flex justify-between">
                            <span class="text-gray-600">收款人:</span>
                            <span class="font-medium">${receiver}</span>
                        </div>
                        <div class="flex justify-between">
                            <span class="text-gray-600">收款账号:</span>
                            <span class="font-medium">${receiverAccount}</span>
                        </div>
                        <div class="flex justify-between">
                            <span class="text-gray-600">开户银行:</span>
                            <span class="font-medium">${template.name}</span>
                        </div>
                    </div>
                </div>
                ` : ''}
                
                <div class="border-t pt-4 mt-4">
                    <div class="flex justify-between items-center">
                        <span class="text-gray-600">金额:</span>
                        <div class="text-right">
                            <div class="text-3xl font-bold" style="color: ${template.color}"${amount.toFixed(2)}</div>
                            <div class="text-sm text-gray-500">${numberToChinese(amount)}</div>
                        </div>
                    </div>
                </div>
                
                <div class="border-t pt-4 mt-4 text-center text-sm text-gray-500">
                    <p>本凭证仅作为模拟使用,不具有任何法律效力</p>
                    <p>${template.name}版权所有</p>
                </div>
            </div>
        </div>
    `;
    
    document.getElementById('receiptContent').innerHTML = receiptHTML;
    document.getElementById('downloadBtn').classList.remove('hidden');
}

// 下载收据为图片
function downloadReceipt() {
    const receipt = document.querySelector('.receipt');
    const options = {
        scale: 2,
        useCORS: true,
        allowTaint: true
    };
    
    // 使用html2canvas库将DOM转换为canvas
    html2canvas(receipt, options).then(canvas => {
        const link = document.createElement('a');
        link.download = '银行交易凭证.png';
        link.href = canvas.toDataURL('image/png');
        link.click();
    });
}


#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <ctime>
#include <random>
#include <iomanip>
#include <sstream>

using namespace std;

// 银行账户类
class BankAccount {
private:
    string accountNumber;
    string accountName;
    double balance;
    
public:
    BankAccount(string number, string name, double initialBalance) 
        : accountNumber(number), accountName(name), balance(initialBalance) {}
    
    string getAccountNumber() const { return accountNumber; }
    string getAccountName() const { return accountName; }
    double getBalance() const { return balance; }
    
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }
    
    bool withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
            return true;
        }
        return false;
    }
    
    bool transfer(BankAccount& recipient, double amount) {
        if (withdraw(amount)) {
            recipient.deposit(amount);
            return true;
        }
        return false;
    }
};

// 交易记录类
class Transaction {
private:
    string transactionId;
    string type; // "deposit", "withdraw", "transfer"
    time_t timestamp;
    double amount;
    string fromAccount;
    string toAccount;
    string status; // "success", "failed", "processing"
    
public:
    Transaction(string id, string t, double amt, string from, string to, string stat)
        : transactionId(id), type(t), amount(amt), fromAccount(from), 
          toAccount(to), status(stat) {
        timestamp = time(nullptr);
    }
    
    string generateReceipt(const BankAccount& account) const {
        ostringstream oss;
        tm* localTime = localtime(&timestamp);
        
        oss << "=== 银行交易凭证 ===\n";
        oss << "交易ID: " << transactionId << "\n";
        oss << "交易时间: " << put_time(localTime, "%Y年%m月%d日 %H:%M:%S") << "\n";
        oss << "账户: " << account.getAccountNumber() << "\n";
        oss << "户名: " << account.getAccountName() << "\n";
        oss << "交易类型: " << getTypeChinese() << "\n";
        oss << "金额: " << fixed << setprecision(2) << amount << "元\n";
        
        if (type == "transfer") {
            oss << "收款账号: " << toAccount << "\n";
        }
        
        oss << "交易状态: " << getStatusChinese() << "\n";
        oss << "账户余额: " << fixed << setprecision(2) << account.getBalance() << "元\n";
        oss << "========================

C++后端处理模块

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <ctime>
#include <random>
#include <iomanip>
#include <sstream>

using namespace std;

// 银行账户类
class BankAccount {
private:
    string accountNumber;
    string accountName;
    double balance;
    
public:
    BankAccount(string number, string name, double initialBalance) 
        : accountNumber(number), accountName(name), balance(initialBalance) {}
    
    string getAccountNumber() const { return accountNumber; }
    string getAccountName() const { return accountName; }
    double getBalance() const { return balance; }
    
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }
    
    bool withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
            return true;
        }
        return false;
    }
    
    bool transfer(BankAccount& recipient, double amount) {
        if (withdraw(amount)) {
            recipient.deposit(amount);
            return true;
        }
        return false;
    }
};

// 交易记录类
class Transaction {
private:
    string transactionId;
    string type; // "deposit", "withdraw", "transfer"
    time_t timestamp;
    double amount;
    string fromAccount;
    string toAccount;
    string status; // "success", "failed", "processing"
    
public:
    Transaction(string id, string t, double amt, string from, string to, string stat)
        : transactionId(id), type(t), amount(amt), fromAccount(from), 
          toAccount(to), status(stat) {
        timestamp = time(nullptr);
    }
    
    string generateReceipt(const BankAccount& account) const {
        ostringstream oss;
        tm* localTime = localtime(&timestamp);
        
        oss << "=== 银行交易凭证 ===\n";
        oss << "交易ID: " << transactionId << "\n";
        oss << "交易时间: " << put_time(localTime, "%Y年%m月%d日 %H:%M:%S") << "\n";
        oss << "账户: " << account.getAccountNumber() << "\n";
        oss << "户名: " << account.getAccountName() << "\n";
        oss << "交易类型: " << getTypeChinese() << "\n";
        oss << "金额: " << fixed << setprecision(2) << amount << "元\n";
        
        if (type == "transfer") {
            oss << "收款账号: " << toAccount << "\n";
        }
        
        oss << "交易状态: " << getStatusChinese() << "\n";
        oss << "账户余额: " << fixed << setprecision(2) << account.getBalance() << "元\n";
        oss << "========================