procedure TForm1.Button1Click(Sender: TObject); var hMap: THandle; hFile:integer; MapFp: Pointer ; fs:DWORD; i:integer; begin hFile:=FileOpen('c:\temp\1.rm',fmOpenReadWrite); if hFile<0 then begin ShowMessage('file open fail!'); exit; end; fs:=GetFileSize(hfile,Nil); hMap:=CreateFileMapping(hFile,nil, page_ReadWrite, 0,0,nil); if hMap=0 then begin FileClose(hFile); ShowMessage('map file open fail!'); exit; end; MapFp:=MapViewOfFile(hMap,File_Map_All_Access,0, 0, 0); if MapFp = nil then begin CloseHandle(hMap); FileClose(hFile); ShowMessage ('MapFile data pointer failed'); exit; end; for i:=0 to fs-1 do Byte(PChar(Mapfp)[i]):=Byte(PChar(mapfp)[i]) xor $11; UnmapViewOfFile(MapFp); CloseHandle(hMap); FileClose(hFile); end;
var
hMap: THandle;
hFile:integer;
MapFp: Pointer ;
fs:DWORD;
i:integer;
begin hFile:=FileOpen('c:\temp\1.rm',fmOpenReadWrite);
if hFile<0 then
begin
ShowMessage('file open fail!');
exit;
end;
fs:=GetFileSize(hfile,Nil);
hMap:=CreateFileMapping(hFile,nil, page_ReadWrite, 0,0,nil);
if hMap=0 then
begin
FileClose(hFile);
ShowMessage('map file open fail!');
exit;
end;
MapFp:=MapViewOfFile(hMap,File_Map_All_Access,0, 0, 0);
if MapFp = nil then
begin
CloseHandle(hMap);
FileClose(hFile);
ShowMessage ('MapFile data pointer failed');
exit;
end;
for i:=0 to fs-1 do
Byte(PChar(Mapfp)[i]):=Byte(PChar(mapfp)[i]) xor $11;
UnmapViewOfFile(MapFp);
CloseHandle(hMap);
FileClose(hFile);
end;
修改它就相当于修改文件本身
例如我要修改的EXE文件的
偏移地址 57H 58H 59H 5aH 5bH
16进制数 30 2E 32 34 30 (这个就是0.240)要修改他的16进制数为
31 2E 31 33 31 (也就是1.131)这个值最好是能用Edit控制.Edit读出 0.240
然后用户来修改这值1.131或1.3231 不只是数值,也有可能是字符.
Byte(PChar(Mapfp)[$58]):=$2e;
Byte(PChar(Mapfp)[$59]):=$31;
Byte(PChar(Mapfp)[$5a]):=$33;
Byte(PChar(Mapfp)[$5b]):=$31;
//达到你的效果
结贴了我怕地址会变他找不到.
我还有一个问题是关于一个程序生成另一个程序的.不过不是木马什么.情况是这样的.
我做的是一个http定时下载的程序,给一大批用户,而每个用户的下载地址都不一样,每次都要重复的到源码里去修改下载地址. 最近我发现有一种这样的技术.在一个程序上修改完,一点生成就可以了.不用DELPHI来生成了.
其偏移量为1234H,望解答,谢谢! 针对你的情况,可以使用二进制方式打开文件,如。
var f:file;
......
AssignFile(f, 'ABC.EXE');
Reset(f, 1);
Seek(f, $1234);
这里需要注意:Delphi的Seek语句认为第一个字节的位置号为0,所以如果你的偏移量定义与此不同,注意调整一下。
你所说的把EDIT1.TEXT的内容(如:06112233)转为16进制,实际上是把字符串转换为数字,这可以使用StrToInt函数。如:
n := StrToInt('$' + Edit1.Text);
BlockWrite(f, n, SizeOf(n));
这里假设Edit中输入的是十六进制的。
---------------------------------------
这是我在一个网站里找到的例子.他是假设Edit中输入的是16进制的
如果是字符,或整数该如果操作呢?
用Trim(Edit1.text); 就可以了吗?
// 若是字符
var s:String;
s:=Trim(Edit1.text);
move(s[1],PChar(Mapfp)[$1234],length(s)) // 若是整数
var s:integer;
s:=StrToInt(Edit1.text);16进制同上(StrToInt('$'+Edit1.text);
move(s,PChar(Mapfp)[$1234],sizeof(s))