首页
社区
课程
招聘
读取EXE文件中的字符串
发表于: 2009-2-8 22:54 9360

读取EXE文件中的字符串

2009-2-8 22:54
9360
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
沙发还得自己坐,没人来帮忙解决下?
2009-2-8 23:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
找对地址然后WriteProcessMemory一下不就行了?
2009-2-8 23:28
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我说的是静态读取,楼上好像没有看明白我的意思
2009-2-8 23:29
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
如果知道那串字符串位置在哪里的话就比较简单。
1、创建一个TFileStream流,用TFileStream流打开*.exe文件
2、用GetMem申请一个和TFileStream.Size大小的内存缓冲
3、用TFileStream.Read方法读取文件
4、定位到要修改的文件偏移地址(如果不知具体偏移的话,那只好用pos函数查找字符串取得偏移了)。用move函数进行修改内容。
5、用TFileStream.Write方法写回*.exe文件。
6、FreeMem释放申请到的内存
7、释放TFileStream流。
2009-2-9 00:00
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上,我先试一试!
2009-2-9 00:03
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
版主,这是啥语言的?
2009-2-9 00:45
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
FileStream:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
     FileSize:=FileStream.Size;
     GetMem(pBuffer,FileSize);
     for i:=$xxxxxxxx to $xxxxxxxx do
       begin
        FileStream.ReadBuffer(pBuffer[i]^,FileSize);
        TmpStr:='$'+IntToHex(pBuffer[i]^,2);
        s:=s+chr(StrToInt(TmpStr));
       end;
循环到第二次就出现错误了,小虾可否提供一份测试通过的源码!
2009-2-9 00:58
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
顺便问下WinHex打开一个EXE文件是属于静态分析还是动态分析。像WinHex那样的分析代码该如何写?
2009-2-9 01:02
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
Delphi的Object Pascal语言



var fs:TFileStream;
    od:TOpenDialog;
    s:String;
begin
  od := TOpenDialog.Create(self);
  try
    od.Filter := 'Exe Files(*.exe)|*.exe|All Files(*.*)|*.*||';
    if od.Execute then // 选取要修改的*.exe文件
    begin
      fs := TFileStream.Create(od.FileName,fmOpenReadWrite); //打开要修改的*.exe文件
      try
        fs.Position := FileOffset; // 定位到要修改的文件偏移地址
        s := 'xxxxxxxxxxx'; // 要修改的字符串(注意:除非你确定更改写入的字符串大小不会影响原*.exe文件,你所要修改的字符串最好还是和*.exe中的字符串长度一样比较好)。
        fs.Write(Pointer(s)^,StringLength); // 写入要修改的字串。
      finally
        fs.Free;
      end;
    end;
  finally
    od.Free;
  end;
end;


用打开命令打开的文件是属于分析静态文件,打开ROM的文件是属于分析执行中的文件。


不太清楚。可能是使用了内存映射流操作内存数据。
2009-2-9 09:02
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
就是读配置信息嘛,把字符串放到文件末尾处。
2009-2-9 09:34
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
var fs:TFileStream;
    od:TOpenDialog;
    s:String;
begin
  od := TOpenDialog.Create(self);
  try
    od.Filter ...[/QUOTE]

我试了一下,用WinHex打开的EXE可以搜索到的字符串,而用UE和C32ASM等静态分析工具不能搜索到的字符串,好像不能用这种方法去读写,只能通过内存映射操作?说下思路或附下源码.谢谢
2009-2-9 12:28
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
类似OD或者WinHex这样的工具有人写过没?讲下原理。。。
2009-2-10 19:22
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
楼主向做生成器。。
2009-2-11 12:26
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
-------------------------------------------------------------------------
这你都看出来了,好眼力啊 呵呵
补充一点  是想做动态生成器!呵呵
不知道能否提供点思路!
2009-2-11 13:43
0
游客
登录 | 注册 方可回帖
返回
//