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: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:14
怎么说呢,不知道你从哪里找的代码 其中WinExec更是支持16的也就是xp ,在我这里根本没用。
其他也没啥好 ...
谢谢回复。
页:
[1]