精易论坛

标题: 汇编 大神,进进进! [打印本页]

作者: penck    时间: 2025-3-6 22:56
标题: 汇编 大神,进进进!
求助,求助,这样,我有一个程序 test.exe,和一个新写的 vvv.dll   主程序是c++  但没有源码
现在我想这样:test.exe 汇编写入代码,用一个数值,或者其它返回值,来判断是否是我 vvv.dll

然后,test.exe 启动的时候,去调用读取 vvv.dll ,返回值必须是正确,主程序才能正常启动。

目的:防止别人伪造一个空的 “vvv.dll” 来启动主程序。请求有什么好的办法或者逻辑方式??


作者: CigaretteWine    时间: 2025-3-6 22:56
没加壳的话就处理PE,把dll加入到导入表,导出函数,修复RVA和大小,让PE头的信息正确反映你的新导入表。
作者: penck    时间: 2025-3-6 23:01
最终目标就是:让主程序必须依赖我这个vvv.dll 才能正常启动。
作者: zhining    时间: 2025-3-6 23:59
5555555555555555555555555555
作者: 扑街仔    时间: 2025-3-7 00:07
使用哈希值验证
计算正版 vvv.dll 的哈希值(如 MD5、SHA - 1、SHA - 256 等),将该哈希值硬编码到 test.exe 中。在 test.exe 启动时,加载 vvv.dll 并重新计算其哈希值,将计算得到的哈希值与硬编码的哈希值进行比较,如果相同则认为是正版 DLL,主程序可以正常启动,否则拒绝启动。

1. 计算 vvv.dll 的哈希值
可以使用第三方库(如 OpenSSL)来计算 DLL 文件的哈希值。以下是一个使用 OpenSSL 计算 SHA - 256 哈希值的示例代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <openssl/sha.h>

std::string calculateSHA256(const std::string& filename) {
    std::ifstream file(filename, std::ios::binary);
    if (!file) {
        return "";
    }

    SHA256_CTX sha256;
    SHA256_Init(&sha256);

    const int bufferSize = 32768;
    char buffer[bufferSize];
    while (file.read(buffer, bufferSize)) {
        SHA256_Update(&sha256, buffer, bufferSize);
    }
    SHA256_Update(&sha256, buffer, file.gcount());

    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_Final(hash, &sha256);

    std::ostringstream oss;
    for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
        oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]);
    }

    return oss.str();
}

2.在 test.exe 中验证哈希值

#include <iostream>
#include <windows.h>

// 硬编码正版 DLL 的 SHA - 256 哈希值
const std::string validHash = "your_valid_sha256_hash";

bool verifyDLL() {
    std::string dllPath = "vvv.dll";
    std::string calculatedHash = calculateSHA256(dllPath);
    return calculatedHash == validHash;
}

int main() {
    if (!verifyDLL()) {
        std::cout << "Invalid DLL detected. Program will not start." << std::endl;
        return 1;
    }

    // 加载 DLL
    HINSTANCE hDLL = LoadLibrary("vvv.dll");
    if (hDLL == NULL) {
        std::cout << "Failed to load DLL." << std::endl;
        return 1;
    }

    // 主程序正常启动逻辑
    std::cout << "Program started successfully." << std::endl;

    // 释放 DLL
    FreeLibrary(hDLL);

    return 0;
}
作者: 笨来无一悟    时间: 2025-3-7 00:15
不是有现成的方案 给任何成品EXE加验证
作者: penck    时间: 2025-3-7 01:31
扑街仔 发表于 2025-3-7 00:07
使用哈希值验证
计算正版 vvv.dll 的哈希值(如 MD5、SHA - 1、SHA - 256 等),将该哈希值硬编码到 test.e ...

但是我的主程序 test.exe 是编译好的成品程序,没有源码。该怎么搞?
作者: penck    时间: 2025-3-7 01:32
笨来无一悟 发表于 2025-3-7 00:15
不是有现成的方案 给任何成品EXE加验证

EXE加验证??求个传送门,我看看
作者: muye84    时间: 2025-3-7 06:50
直接加个补丁就行啦,不需要啥汇编和test的源码
作者: penck    时间: 2025-3-7 08:33
muye84 发表于 2025-3-7 06:50
直接加个补丁就行啦,不需要啥汇编和test的源码

怎么加个补丁??求解释,老哥
作者: QZZZ    时间: 2025-3-7 08:47
简单的办法,如果你的exe不大,可以直接重新写个程序放到资源里,然后通过你的程序想干啥都行,没问题了再把它释放到临时目录运行
作者: muye84    时间: 2025-3-7 08:51
penck 发表于 2025-3-7 08:33
怎么加个补丁??求解释,老哥

再写个相关功能的DLL,永久注入test.exe
作者: hujunchao    时间: 2025-3-7 08:53
penck 发表于 2025-3-7 01:32
EXE加验证??求个传送门,我看看

百du万捷验证
能给成品exe加验证
作者: b0y    时间: 2025-3-7 09:18
直接导入表里写入你的dll  




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4