吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1762|回复: 3
收起左侧

[C&C++ 转载] C++实现小巧玲珑并且无毒的文件补丁

[复制链接]
zyjsuper 发表于 2020-2-29 21:31
本帖最后由 zyjsuper 于 2020-2-29 22:59 编辑

从网上找到了一段使用C++完成的文件补丁代码,觉得挺好的,其他补丁制作工具制作出来的补丁均可以扫描出病毒,但是C++原生实现的,基本无毒,并且小巧,觉得非常不错,分享给大家,希望大家有好的思路共同讨论下。

代码如下:
[C++] 纯文本查看 复制代码
#include <Windows.h>
#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
    DWORD dwFileOffset = 0x449;  //文件偏移地址

    BYTE bCode = 0;
    DWORD dwReadNum = 0;

    if (argc!=2)
    {
     cout << "FilePatch V1.0\n" << endl;
     cout << "Usage:FilePatch.exe filename" << endl;
     return -1;
    }
    //打开文件
    HANDLE hFile = CreateFile(argv[1], GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (INVALID_HANDLE_VALUE == hFile)
    {
        cout << "File not exsit or it's already opened!" << endl;
        return -1;
    }
    SetFilePointer(hFile, dwFileOffset, 0, FILE_BEGIN);
    bCode=ReadFile(hFile, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum, NULL);

    //比较当前位置是否为JNZ
    if (TEXT('\x75') != bCode)
    {
        cout << "The bCode is:" << bCode << endl;
        cout << "\nPlease close file and try again." << endl;

        CloseHandle(hFile);

    }
    //修改为JZ
    else
    {
        bCode = TEXT('\x74');
        SetFilePointer(hFile, dwFileOffset, 0, FILE_BEGIN);
        WriteFile(hFile, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum, NULL);
        cout << "Write the hex code Successfully !" << endl;
        CloseHandle(hFile);
    }
    //运行修改后的程序
    WinExec(argv[1], SW_SHOW);
    getchar();
    return 0;
}

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

我的爱是你 发表于 2020-3-1 10:14
本帖最后由 我的爱是你 于 2020-3-1 10:17 编辑

怎么说呢,不知道你从哪里找的代码 其中WinExec更是支持16的也就是xp ,在我这里根本没用。
其他也没啥好说的就是 打开文件 读 和 写操作,是个c语言新手都可以写好不。
这是我们要改的原:
原jnz.jpg
可以看到到 jnz 偏移为 0x48
下面再加上pe头大小就是确切偏移了。
PE.jpg
最后是代码执行后效果
改.jpg
再次将程序载入OD可以看到更改成功 为 je
下面代码很简单
[C] 纯文本查看 复制代码
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <tchar.h>

using namespace std;

int main(int argc, char* argv[])
{
        DWORD dwFileOffset = 0x448;
        DWORD x = 0x74;

        FILE* fp;
        errno_t err;
        const char* name = "D:/2.exe";   //要改的文件所在路径,可以自己改
        BYTE by;
        
        err = fopen_s(&fp, name, "r+b");  //打开文件
        if (err != 0)
        {
                return -1;
        }
        fseek(fp,dwFileOffset, SEEK_SET);  //文件指针
        fread(&by, sizeof(by), 1, fp);  //读
        if (by == 0x75)  //判断
        {
                fseek(fp, dwFileOffset, SEEK_SET);    //重置指针
                fwrite(&x, sizeof(by), 1, fp);  //写
        }
        if (fp != NULL)
        {
                fclose(fp);  //关
        }
        //CreateProcess  参数太多有那时间写代码不如自己点开程序
        
        return 0;
}


另一种直接使用
OpenProcess ReadProcessMemory  WriteProcessMemory也没啥可说的稍微有点语言基础都能调用后对运行软件更改。


我的爱是你 发表于 2020-3-1 10:17
 楼主| zyjsuper 发表于 2020-3-1 10:55
我的爱是你 发表于 2020-3-1 10:14
怎么说呢,不知道你从哪里找的代码 其中WinExec更是支持16的也就是xp ,在我这里根本没用。
其他也没啥好 ...

谢谢回复。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-26 07:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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