吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1200|回复: 13
收起左侧

[学习记录] 学习记录-用C语言写补丁

[复制链接]
liwj 发表于 2023-10-12 03:46
// ConsoleApplication_GetBaseAddress.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<stdio.h>
#include<windows.h>
#include<psapi.h>
#include<direct.h>
#include <string.h>

int _tmain(int argc, _TCHAR* argv[])
{
        //获取当前目录
        char path[100];
        getcwd(path, 100);
        //printf("current work path:%s\n", path);
        char *zifu = getcwd(path, 100);
        //printf("current work path:%s\n", zifu);
        char *zifu2 = "\\MindMaster.exe";//修改该值即可
        char *zifu3 = strcat(zifu, zifu2);
        printf("启动MindMaster:%s\n", zifu3);
        //运行外部的程序
        WinExec(zifu3, SW_SHOW);
        //延时
        int a;
        a = 15000;
        Sleep(a);
        //获取窗口句柄
        HWND hWnd = FindWindow(NULL, "MindMaster");
        if (hWnd == NULL){        //如果无法获取句柄则报错
                printf("无法获取窗口句柄,请检查进程是否存在!\n");
                system("pause");
                return -1;
        }
        DWORD pro_id;
        GetWindowThreadProcessId(hWnd, &pro_id);        //获取进程ID  
        if (pro_id == 0){
                printf("无法获取进程ID\n");
                system("pause");
                return 0;
        }
        printf("进程id: %d\n", pro_id);

        HANDLE hpro = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, pro_id);
        if (hpro == 0){
                printf("无法获取进程句柄");
        }
        printf("进程句柄id: %d\n", hpro);

        // 获取每一个模块加载基址
        DWORD pro_base = NULL;
        DWORD prodll_base = NULL;
        HMODULE hModule[100] = { 0 };
        DWORD dwRet = 0;
        int num = 0;
        int bRet = EnumProcessModulesEx(hpro, (HMODULE *)(hModule), sizeof(hModule), &dwRet, NULL);
        if (bRet == 0){
                printf("EnumProcessModules");
        }

        // 总模块个数
        num = dwRet / sizeof(HMODULE);
        printf("总模块个数: %d\n", num);

        // 打印每一个模块加载基址
        char lpBaseName[100];
        for (int i = 0; i < num; i++){
                GetModuleBaseNameA(hpro, hModule[i], lpBaseName, sizeof(lpBaseName));
                printf("%-2d %-25s基址: 0x%p\n", i, lpBaseName, hModule[i]);
        }

        pro_base = (DWORD)hModule[0]; prodll_base = (DWORD)hModule[49];
        printf("程序基址: 0x%p\n", pro_base); printf("objectmodule基址: 0x%p\n", prodll_base);
/////////////////////////////////////////////////////////////////////////////
        DWORD tounaofenbao = pro_base + 0x78eb95;
        printf("头脑风暴基地址: 0x%p\n", tounaofenbao);
        //ReadProcessMemory(hpro, (PVOID)tounaofenbao, &tounaofenbao, 4, 0); 为什么注释掉,因为把eb95的值7C 79 FA 83 转换成了地址
        //tounaofenbao = tounaofenbao + 0x0;
        DWORD Tnfb_value = 2088368771;//OD显示的二进制顺序是 83 FA 79 7C 在换算的时候要倒着念 7C 79 FA 83 把7C 79 FA 83换成十进制就得到2088368771
        WriteProcessMemory(hpro, (LPVOID)tounaofenbao, &Tnfb_value, 4, 0);//是修改成功了 但程序确自动退出了 找到原因了 加上7C后就正确了 保持4个字节
        //甘特图
        DWORD gantetu = pro_base + 0x6122E1;
        printf("甘特图基地址: 0x%p\n", gantetu);
        //DWORD GTU_value = 2425393296;
        char GTU_value[6] = {0x90,0x90,0x90,0x90,0x90,0x90};
        WriteProcessMemory(hpro, (LPVOID)gantetu, GTU_value, 6, 0);
        DWORD gantetu2 = pro_base + 0x6122E9;
        printf("甘特图基地址: 0x%p\n", gantetu2);
       
        char GTU_value2[6] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
        WriteProcessMemory(hpro, (LPVOID)gantetu2, GTU_value2, 6, 0);
        //主题风格
        DWORD zhutifengge = pro_base + 0x68C118;
        printf("主题风格基地址: 0x%p\n", zhutifengge);
       
        char zhutifengge_value[6] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
        WriteProcessMemory(hpro, (LPVOID)zhutifengge, zhutifengge_value, sizeof(zhutifengge_value), 0);
DWORD zhutifengge2 = pro_base + 0x68C122;
       
        printf("主题风格基地址2: 0x%p\n", zhutifengge2);
       
        char zhutifengge_value2[6] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
        WriteProcessMemory(hpro, (LPVOID)zhutifengge2, zhutifengge_value2, sizeof(zhutifengge_value2), 0);
        //复制图片功能
        DWORD tup = prodll_base + 0x127B60;
        printf("复制图片功能基地址: 0x%p\n", tup);
       
        char tup_value[2] = { 0xeb, 0x3b};
        WriteProcessMemory(hpro, (LPVOID)tup, tup_value, sizeof(tup_value), 0);

        //图标功能
        DWORD tub = pro_base + 0x706206;
        printf("图标功能基地址: 0x%p\n", tub);
       
        char tub_value[2] = { 0x90, 0x90 };
        WriteProcessMemory(hpro, (LPVOID)tub, tub_value, sizeof(tub_value), 0);
        DWORD tub2 = pro_base + 0x70620C;
        printf("图标功能基地址: 0x%p\n", tub2);
       
        char tub2_value[2] = { 0xeb, 0x22 };
        WriteProcessMemory(hpro, (LPVOID)tub2, tub2_value, sizeof(tub2_value), 0);

        return 0;
}

免费评分

参与人数 6吾爱币 +4 热心值 +5 收起 理由
cube + 1 + 1 用心讨论,共获提升!
random1 + 1 + 1 热心回复!
woyucheng + 1 + 1 谢谢@Thanks!
董督秀 + 1 我很赞同!很基础的补丁代码。
Ming2022 + 1 热心回复!
danielau + 1 用心讨论,共获提升!

查看全部评分

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

爱飞的猫 发表于 2023-10-12 07:16
本帖最后由 爱飞的猫 于 2023-10-12 07:20 编辑
  1. 请使用代码框功能格式化代码
  2. prodll_base = (DWORD)hModule[49]; 请判断 DLL 名称,而非写死。系统更新/旧版本可能偏移就错了
    • MSVC 实际上是 C++ 编译器,你可以用 std::map<std::string, HMODULE> 来记录模块信息或访问。
  3. 使用 CreateProcess 并带上 CREATE_SUSPENDED,可以已暂停模式启动进程,补丁完后再继续主程序运行。
  4. 为什么不直接用字节数组呢?相比你现在的写法并不会带来额外的性能上的开销。
  5. 你可以使用数值或表达式,不需要全都先赋值到变量再使用,如 Sleep(15'000);

(4) 直接使用字节数组:

        char Tnfb_value[] = {0x83, 0xFA, 0x79}; // 如果只需要补 3 个字节,那就写 3 个字节即可。
        WriteProcessMemory(hpro, (LPVOID)tounaofenbao, Tnfb_value, sizeof(Tnfb_value), 0);//是修改成功了 但程序确自动退出了 找到原因了 加上7C后就正确了 保持4个字节

(2) 使用 std::map 储存数据

#include <iostream>
#include <string>
#include <map>

int main()
{
    std::map<std::string, int> map1{};
    map1["abc"] = 123;
    map1["def"] = 456;

    std::cout << "map1[abc]: " << map1["abc"] << std::endl;
    std::cout << "map1[def]: " << map1["def"] << std::endl;
    std::cout << "map1[zzz]: " << map1["zzz"] << std::endl;

    /*
     * 输出:
     *   map1[abc]: 123
     *   map1[def]: 456
     *   map1[zzz]: 0
     */
}

免费评分

参与人数 6吾爱币 +9 热心值 +6 收起 理由
610100 + 3 + 1 热心回复!
JuncoJet + 3 + 1 直接 #define ABC 123
Lishi8 + 1 + 1 用心讨论,共获提升!
LuckyClover + 1 + 1 谢谢@Thanks!
tlf + 1 谢谢@Thanks!
liyitong + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

王成 发表于 2023-10-12 07:47
dubuqingyun 发表于 2023-10-12 07:48
yaphoo 发表于 2023-10-12 08:14
感谢分享
头像被屏蔽
tlf 发表于 2023-10-12 08:37
提示: 作者被禁止或删除 内容自动屏蔽
sunnyAlvis 发表于 2023-10-12 08:47
非常不错,感谢分享
danielau 发表于 2023-10-12 08:52
楼主很强!进来学习
hiilink 发表于 2023-10-12 08:53
感谢分享,学习了。
LuckyClover 发表于 2023-10-12 08:59
爱飞的猫 发表于 2023-10-12 07:16
[md]1. 请使用代码框功能格式化代码
2. `prodll_base = (DWORD)hModule[49];` 请判断 DLL 名称,而非写死 ...

大佬牛批
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 17:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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