开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1166|回复: 27
收起左侧

[闲聊] 关于最近热论的分赃不均

[复制链接]
结帖率:96% (50/52)
发表于 2024-8-23 12:25:59 | 显示全部楼层 |阅读模式   湖南省长沙市
最近讨论的热火朝天,网警都开始关注了,
哈哈哈,其实搞过逆向的都知道在内存中搜字符串来找明文,并不是什么发明,github上搜相关的源码,十几年前的代码都有,
这不我让gpt写了个 速度还行,这玩意容易写,主要是怎么提速,要是有ce那么快就好咯
[C++] 纯文本查看 复制代码

#include "test.h"

std::mutex resultMutex;  // 用于保护结果输出
std::atomic<bool> found{ false };  // 用于标记是否已经找到目标字符串

// 创建进程内存转储
bool CreateMemoryDump(DWORD pid, const std::string& dumpFilePath) {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (hProcess == NULL) {
        std::cerr << "Failed to open process." << std::endl;
        return false;
    }

    HANDLE hFile = CreateFile(dumpFilePath.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to create dump file." << std::endl;
        CloseHandle(hProcess);
        return false;
    }

    MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
    exceptionInfo.ThreadId = GetCurrentThreadId();
    exceptionInfo.ExceptionPointers = NULL;
    exceptionInfo.ClientPointers = FALSE;

    BOOL success = MiniDumpWriteDump(
        hProcess,
        pid,
        hFile,
        MiniDumpWithFullMemory,
        &exceptionInfo,
        NULL,
        NULL
    );

    CloseHandle(hFile);
    CloseHandle(hProcess);

    if (!success) {
        std::cerr << "Failed to write dump file." << std::endl;
        return false;
    }

    return true;
}

// 加载内存转储文件
bool LoadMemoryDump(const std::string& dumpFilePath, std::vector<char>& dumpData) {
    HANDLE hFile = CreateFile(dumpFilePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to open dump file." << std::endl;
        return false;
    }

    DWORD fileSize = GetFileSize(hFile, NULL);
    dumpData.resize(fileSize);

    DWORD bytesRead;
    if (!ReadFile(hFile, dumpData.data(), fileSize, &bytesRead, NULL) || bytesRead != fileSize) {
        std::cerr << "Failed to read dump file." << std::endl;
        CloseHandle(hFile);
        return false;
    }

    CloseHandle(hFile);
    return true;
}

//宏获取openssl的版本
#if OPENSSL_VERSION_NUMBER > 0x1010107fL

    //evp实现md5
    std::string CalculateMD5(const std::string& str) {
                EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
        unsigned char md_value[EVP_MAX_MD_SIZE];
        unsigned int md_len;
        EVP_MD_CTX_create(&mdctx);
        EVP_DigestInit_ex(mdctx, EVP_md5(), NULL);
        EVP_DigestUpdate(mdctx, str.c_str(), str.length());
        EVP_DigestFinal_ex(mdctx, md_value, &md_len);
        EVP_MD_CTX_destroy(mdctx);

        char md5String[33];
        for (int i = 0; i < md_len; i++) {
            sprintf(&md5String[i * 2], "%02x", (unsigned int)md_value);
        }
        md5String[32] = '\0'; // 确保字符串以空字符结尾
        return std::string(md5String);
    }
#else

    // 计算字符串的MD5
    std::string CalculateMD5(const std::string& str) {
        unsigned char md5Digest[MD5_DIGEST_LENGTH];
        MD5((unsigned char*)str.c_str(), str.length(), md5Digest);

        char md5String[33];
        for (int i = 0; i < 16; ++i)
            sprintf(&md5String[i * 2], "%02x", (unsigned int)md5Digest);

        return std::string(md5String);
    }
#endif

// 搜索内存中的字符串
void SearchStrings(const std::vector<char>& data, size_t start, size_t end, size_t minLength, const std::string& targetMD5) {
    std::string currentString;

    for (size_t i = start; i < end && !found.load(); ++i) {
        char c = data;
        if (c >= 32 && c <= 126) {  // 可打印字符
            currentString += c;
        }
        else {
            if (currentString.length() >= minLength) {
                std::string md5 = CalculateMD5(currentString);
                if (md5 == targetMD5) {
                    std::lock_guard<std::mutex> lock(resultMutex);
                    std::cout << "Found matching string: " << currentString << std::endl;
                    found.store(true);
                    return;
                }
            }
            currentString.clear();
        }
    }

    if (currentString.length() >= minLength && !found.load()) {
        std::string md5 = CalculateMD5(currentString);
        if (md5 == targetMD5) {
            std::lock_guard<std::mutex> lock(resultMutex);
            std::cout << "Found matching string: " << currentString << std::endl;
            found.store(true);
        }
    }
}

int test_mumu(DWORD pid, std::string targetStr) {
    std::string dumpFilePath = "process_dump.dmp";   

    // 创建内存转储
    if (!CreateMemoryDump(pid, dumpFilePath)) {
        std::cerr << "Failed to create memory dump." << std::endl;
        return 1;
    }

    // 加载内存转储数据
    std::vector<char> dumpData;
    if (!LoadMemoryDump(dumpFilePath, dumpData)) {
        std::cerr << "Failed to load memory dump." << std::endl;
        return 1;
    }

    // 并行搜索内存中的字符串
    const size_t numThreads = std::thread::hardware_concurrency();
    std::vector<std::thread> threads;
    size_t chunkSize = dumpData.size() / numThreads;

    for (size_t i = 0; i < numThreads; ++i) {
        size_t start = i * chunkSize;
        size_t end = (i == numThreads - 1) ? dumpData.size() : start + chunkSize;

        threads.emplace_back(SearchStrings, std::ref(dumpData), start, end, 4, std::ref(targetStr));
    }

    for (auto& t : threads) {
        t.join();
    }

    if (!found.load()) {
        std::cout << "No matching string found." << std::endl;
    }

    return 0;
}

点评

不要讨论猪脚是哪几个人,不要讨论谁对谁错,就来说说功能怎么用代码实现   湖南省长沙市  发表于 2024-8-23 18:29
结帖率:96% (50/52)

签到天数: 8 天

 楼主| 发表于 2024-8-24 10:31:51 | 显示全部楼层   湖南省长沙市

你不知道论坛都被整治好几次了吗
回复 支持 反对

使用道具 举报

结帖率:96% (50/52)

签到天数: 8 天

 楼主| 发表于 2024-8-24 10:31:05 | 显示全部楼层   湖南省长沙市
znkyb5 发表于 2024-8-24 09:29
什么瓜,有没有传送

不讨论瓜 ,群里讨论的还不够啊
回复 支持 反对

使用道具 举报

结帖率:100% (10/10)
发表于 2024-8-24 09:29:47 | 显示全部楼层   湖南省永州市
什么瓜,有没有传送
回复 支持 反对

使用道具 举报

结帖率:96% (50/52)

签到天数: 8 天

 楼主| 发表于 2024-8-23 22:05:44 | 显示全部楼层   湖南省长沙市
虚拟易友 发表于 2024-8-23 19:48
那他能把RSA的公钥私钥都给你扒出来你怎么看?

@虚拟易友 寻找rsa key的 都是很多年前的开源项目,或者找gpt写一个也行


QQ截图20240823220315.png


回复 支持 反对

使用道具 举报

结帖率:96% (50/52)

签到天数: 8 天

 楼主| 发表于 2024-8-23 21:01:22 | 显示全部楼层   湖南省长沙市
虚拟易友 发表于 2024-8-23 19:48
那他能把RSA的公钥私钥都给你扒出来你怎么看?

rsa的公钥私钥特征比较明显
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 1 天

发表于 2024-8-23 19:48:03 | 显示全部楼层   四川省南充市
那他能把RSA的公钥私钥都给你扒出来你怎么看?

点评

不要啦对立,你有技术方面的欢迎指教   湖南省长沙市  发表于 2024-8-23 21:02
回复 支持 反对

使用道具 举报

结帖率:96% (50/52)

签到天数: 8 天

 楼主| 发表于 2024-8-23 19:41:09 | 显示全部楼层   湖南省长沙市

关键不是怎么实现快速搜索内存吗
回复 支持 反对

使用道具 举报

结帖率:70% (14/20)

签到天数: 22 天

发表于 2024-8-23 19:22:50 | 显示全部楼层   河南省郑州市
什么网警
回复 支持 反对

使用道具 举报

结帖率:96% (50/52)

签到天数: 8 天

 楼主| 发表于 2024-8-23 18:33:51 | 显示全部楼层   湖南省长沙市
空竹 发表于 2024-8-23 14:48
论迹不论人,sunny网络中间件还是伟大的开源项目,

你看嘛 ,哪里有指人,没有指出姓名,也没有关联帖子,就是从这个话题引出这个搜索字符串的功能,他们谁对谁错,跟我们没什么关系
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表