编写一个文件补丁

本文介绍如何使用MASM编写一个文件补丁程序,详细解释了如何通过API调用来打开、读取和修改文件中的特定字节,以实现对程序的补丁应用。示例代码针对Crackme5.exe,将特定位置的字节替换为NOP指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者 : Detten    Detten@tiscali.be

 

翻译 : nbw       www.vxer.com

 

来源 : http://biw.rult.at/

 

1、前言

    但破解了一个程序,你就想把成果共享给别人。为了不用把整个破解后的程序上传,你可以制作一个小补丁来修改程序中必要的字节。

    那如何来写呢?

===首先找到需要打补丁的文件。大多数补丁认为该文件处在自己当前目录下。

 

===如果找到,打开该文件。

 

===然后检查打开的文件是不是和所破解的文件。比如我们可以检查文件大小,或者随机检查一些字节,或者最好检查将要被修改的字节。

 

===如果以上都无误,我们可以做需要调整:)

    把文件指针移动到指定位置,然后写入新的操作码。

 

===关闭文件,给出提示结果。

 

下面找一个你破解的文件,然后开始....

 

2、必要的API

   做这个程序需要用到什么API呢?

 

HANDLE CreateFile(

 

LPCTSTR lpFileName, // pointer to name of the file

DWORD dwDesiredAccess, // access (read-write) mode

DWORD dwShareMode, // share mode

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes

DWORD dwCreationDistribution, // how to create

DWORD dwFlagsAndAttributes, // file attributes

HANDLE hTemplateFile // handle to file with attributes to copy

);

 

 

 

 

   这个API函数用来打开或者创建文件。

dwDesiredAccess 应该设置为: 'GENERIC_WRITE OR GENERIC_READ' ,因为需要读写文件;

dwShareMode = 'FILE_SHARE_WRITE OR FILE_SHARE_READ'

dwCreationDistribution = 'OPEN_EXISTING'  我们只需要打开文件,如果文件不存在函数将返回失败,然后我们给出提示信息。

   可以察看WIN32.HLP获取详细信息,如果你没有这个API库,可以找相关资料。

   如你所见,这个API函数返回我们需要文件句柄。我们可以利用这个句柄做下一步:写文件。

 

BOOL WriteFile(

HANDLE hFile, // handle to file to write to

LPCVOID lpBuffer, // pointer to data to write to file

DWORD nNumberOfBytesToWrite, // number of bytes to write

LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written

LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O

);

 

   我们用这个函数把2个字节写入需要打补丁的文件(当然是在正确的位置)[译者:作者的例子是写2个字节,我们做的时候根据需要]

   涉及到的hFile句柄就是CreateFile函数的返回值。

 

lpOverlapped应该指向一个 OVERLAPPED 结构,我们需要用它设定正确的文件指针。

 

typedef struct _OVERLAPPED { // o

DWORD Internal;

DWORD InternalHigh;

DWORD Offset;

DWORD OffsetHigh;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值