zyjsuper 发表于 2020-2-29 21:31

C++实现小巧玲珑并且无毒的文件补丁

本帖最后由 zyjsuper 于 2020-2-29 22:59 编辑

从网上找到了一段使用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, 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, SW_SHOW);
    getchar();
    return 0;
}

我的爱是你 发表于 2020-3-1 10:14

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

怎么说呢,不知道你从哪里找的代码 其中WinExec更是支持16的也就是xp ,在我这里根本没用。
其他也没啥好说的就是 打开文件 读 和 写操作,是个c语言新手都可以写好不。
这是我们要改的原:

可以看到到 jnz 偏移为 0x48
下面再加上pe头大小就是确切偏移了。

最后是代码执行后效果

再次将程序载入OD可以看到更改成功 为 je
下面代码很简单
#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 ReadProcessMemoryWriteProcessMemory也没啥可说的稍微有点语言基础都能调用后对运行软件更改。

我的爱是你 发表于 2020-3-1 10:17

好吧看错了以为求助帖。。。

zyjsuper 发表于 2020-3-1 10:55

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

谢谢回复。
页: [1]
查看完整版本: C++实现小巧玲珑并且无毒的文件补丁