吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1123|回复: 5
收起左侧

[求助] printf打印结果在部分情况下有误?

[复制链接]
董督秀 发表于 2023-9-24 01:23
300吾爱币
1.printf打印结果在部分情况下有误?具体情况和出现的问题,我已经在下面两张图里详细描述:

VB_FF25.jpg

MFC_33CD.jpg

问题代码:
https://t.wss.ink/f/c98jlroq57n

2.该如何解决这个问题?
@爱飞的猫 大佬麻烦帮忙看下吧,谢谢。

最佳答案

查看完整内容

[md]3L 说得对,需要映射文件地址到虚拟地址。 首先加一些头文件,写起来方便: ```cpp #include #include ``` 为了方便,启动时自动获取进程 PID: ```cpp // 辅助方法: 进程名到 PID std::vector find_all_pid_with_name(const wchar_t* process_name) { auto hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) { return {}; } PROCESSENTRY32W p ...

免费评分

参与人数 1热心值 +1 收起 理由
朱朱你堕落了 + 1 补个血!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2023-9-24 01:23

3L 说得对,需要映射文件地址到虚拟地址。

首先加一些头文件,写起来方便:

#include <vector>
#include <algorithm>

为了方便,启动时自动获取进程 PID:

// 辅助方法: 进程名到 PID
std::vector<DWORD> find_all_pid_with_name(const wchar_t* process_name) {
    auto hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap == INVALID_HANDLE_VALUE) {
        return {};
    }

    PROCESSENTRY32W pe32{};
    pe32.dwSize = sizeof(pe32);
    if (!Process32FirstW(hSnap, &pe32)) {
        CloseHandle(hSnap);
        return {};
    }

    std::vector<DWORD> result{};
    do {
        if (_wcsicmp(pe32.szExeFile, process_name) == 0) {
            result.push_back(pe32.th32ProcessID);
        }
    } while (Process32NextW(hSnap, &pe32));
    CloseHandle(hSnap);
    return result;
}

// main 函数下
    auto pids = find_all_pid_with_name(L"MFC_33CD.exe");
    if (pids.size() == 0) {
        throw std::runtime_error("could not find process");
    }
    dwPid = pids[0];

将文件读入内存后需要解析 PE 文件的段(Section):


// 简单定义些东西
struct SectionInfo {
    char* raw_addr;
    size_t raw_size;

    char* virt_addr;
    size_t virt_size;
};

// 回到 main
    auto nt_header = PIMAGE_NT_HEADERS(buffer + PIMAGE_DOS_HEADER(buffer)->e_lfanew);
    std::vector<SectionInfo> sections;
    if (nt_header->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) {
        // 32 位
        auto nt_header_32 = PIMAGE_NT_HEADERS32(nt_header);
        auto n_headers = nt_header_32->FileHeader.NumberOfSections;
        auto section_hdrs = PIMAGE_SECTION_HEADER(((char*)&nt_header_32->OptionalHeader) + nt_header_32->FileHeader.SizeOfOptionalHeader);
        sections.reserve(n_headers);
        for (int i = 0; i < n_headers; i++, section_hdrs++) {
            SectionInfo section{};
            section.raw_addr = (char*)section_hdrs->PointerToRawData;
            section.raw_size = section_hdrs->SizeOfRawData;
            section.virt_addr = (char*)section_hdrs->VirtualAddress;
            section.virt_size = section_hdrs->Misc.VirtualSize;
            sections.push_back(section);
        }
    }
    else if (nt_header->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) {
        // 64 位 - 作业自己做吧
    }

    // 将他们排序,按照虚拟地址从小到大排序
    std::sort(sections.begin(), sections.end(), [&](SectionInfo &a, SectionInfo& b) {
        return a.raw_addr < b.raw_addr;
    });

    auto map_address = [&](void* addr) -> void* {
        auto p_addr = (char*)((char*)addr - buffer); // 文件偏移

        // 找第一个符合条件的
        for (auto& section : sections) {
            if (p_addr >= section.raw_addr) {
                return p_addr - section.raw_addr + section.virt_addr;
            }
        }

        return p_addr; // 找不到
    };

最后打印的时候从辅助函数里映射地址:

        printf("  搜索到的偏移: 0x%p\n", (uintptr_t)map_address((char*)地址数组[i]) + (uintptr_t)me32.modBaseAddr);

addr_search.png

修改后的 代码调试.cpp

代码调试.cpp@爱飞的猫.txt (5.48 KB, 下载次数: 3)


免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
董督秀 + 2 + 1 谢谢@Thanks!谢谢大佬。

查看全部评分

zpy2 发表于 2023-9-24 06:28
小顺_自用函数.h

函数体直接放到 .h?不是.cpp

另外,小顺_本进程_特征码_搜索_模糊,你这个明显是搜索跨进程的,用dll远程注入吧!

免费评分

参与人数 1热心值 +1 收起 理由
董督秀 + 1 热心回复!

查看全部评分

woflant 发表于 2023-9-24 07:53
[C++] 纯文本查看 复制代码
HANDLE hFile = CreateFile(me32.szExePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


你这句代码是打开程序文件,xdbg是在进程内存中搜索,一个是FOA,一个是RVA

免费评分

参与人数 1热心值 +1 收起 理由
董督秀 + 1 谢谢@Thanks!

查看全部评分

bester 发表于 2023-9-24 11:50

免费评分

参与人数 1热心值 +1 收起 理由
董督秀 + 1 我很赞同!

查看全部评分

冥界3大法王 发表于 2023-9-26 16:07
好牛拜的插件捕获进程快照这函数delphi里也用过。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 01:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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