比如程序中定义了一个常量,这个常量的值是 aaaa 编译成exe后,要对这个aaaa进行修改,如果长度不够或者多了,是否可以!本贴剩余分,另开帖酬谢!
原理就是用工具找其位置,然后写,知道的兄弟们献上代码,稍后分加上
原理就是用工具找其位置,然后写,知道的兄弟们献上代码,稍后分加上
解决方案 »
- idhttp post提交网页时报'HTTP/1.1 405 Method Not Allowed'
- 求救,如何过滤中文和英文?
- 怎么delphi5的ADO能连接上网站数据库,delphi7就不行?
- SQL数据库怎样进行配置。
- AdoTable打开时提示错误:Invalid variant type conversion.
- Unit 'ShellCtrls' is specific to a platform
- ISAPI程序如何读取文件列表?
- command contains unrecognized phrase/keyword
- newyj(老鬼前辈),能再帮帮忙吗?
- 说你胖,你就喘,给你点分你就抢
- delphi怎么嵌入字体?
- 这是什么控件
ff ff ff ff // refCount: Integer = -1 常量string的引用计数
04 00 00 00 // strLength: Integer = 4 串长度
61 61 61 61 // 'aaaa'
00 00 00 00 // 第1个0是字符串结尾,剩下3个是为个按4字节对齐加上的
所以这种可以改成:
ff ff ff ff 07 00 00 00 61 61 61 61 62 62 62 00 // 'aaaabbb'如果大于7字节就比较麻烦,就要在其它全0的地方新建一个串,然后查找指向它的地址的指针,把那几个地方也改过来
函数:
function ReadFile ( FileName, WriteStr: string; PianYiDiZhi: Integer ):Boolean ;//格式 (文件,写入的数据; 便宜地址 )
var
vFS : TFileStream;
begin
try
vFS := TFileStream.Create(FileName, fmOpenReadWrite); //为要写入的文件
vFS.Position := PianYiDiZhi ; // 偏移地址 比如用16进制找出常量'aaaa'的第一个字符在$1000,就填写$1000
vFS.WriteBuffer(pointer(WriteStr)^, Length(WriteStr)); // 写入的长度
Result := True;
except
Result := False;
end;
FreeAndNil(vFS);
end;例子:
比如你要修改指定文件(c:\1.exe)'aaaa'为'bbbb',假如'aaaa'的第一个字符串在$1000,那么代码可以这样写
ReadFile('C:\1.EXE','bbbb',$1000),修改成功返回值为true,否则放回false
比如你定义的是
const
cStr = 'aaaa';
就改为
var
vStr : string = 'aaaa';
为什么呢?因为要是你使用程序中多次用到那个常量那么编译出来的话,那个常量也会出现在多个位置,因此要修改多次位置。
如果你用作变量就不会出现在多个位置。
procedure TForm1.Button1Click(Sender: TObject);
const
C_A='aaaa';
var
F:File;
WriteStr:array[1..4] of Char;
i:Integer;
begin
//非Unicode情况下,长度只能短,如果要写的数据大于原来的话,除非原来的定义足够大
AssignFile(F,'ExePath');
try
Reset(F,1);
Seek(F,1234); //用16进制编辑器看字符串的起始位置
FillChar(WriteStr,SizeOf(WriteStr),#0);
for i:=1 to Length(C_A) do WriteStr[i]:=C_A[i];
BlockWrite(F,WriteStr,4);
finally
CloseFile(F);
end;
end;