首页
社区
课程
招聘
[求助]如何实现WinHex的这个功能?
发表于: 2006-1-1 16:51 5496

[求助]如何实现WinHex的这个功能?

2006-1-1 16:51
5496
小弟今天突发奇想
想试下在Delphi下
实现对某进程的内存进行16进制数值的查找替换

苦于功底有限,,,大哥门帮忙下哦~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 212
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我也学这个,帮你顶!
2006-1-1 18:43
0
雪    币: 214
活跃值: (70)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
Delphi不懂,VC我会,帮你顶
2006-1-1 21:38
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 fengercn 发布
Delphi不懂,VC我会,帮你顶

兄弟把VC下怎么实现放出来嘛。
多一个思路多一种途径
让大家也学习学习~
2006-1-1 23:56
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这是我写英雄无敌4修改器部分代码:

HeroInfo.WinHand := FindWindow('Heroes4', 'Heroes 4');
  If HeroInfo.WinHand = 0 Then
  Begin
    ShowMessage('没有找到游戏窗口!!');
    Exit;
  End;
  HeroInfo.ThreadId := GetWindowThreadProcessId(HeroInfo.WinHand, @HeroInfo.pId);
  If HeroInfo.ThreadId = 0 Then
  Begin
    ShowMessage('没有找到游戏窗口!!');
    Exit;
  End;
  //HeroInfo.hProcess := OpenProcess(PROCESS_ALL_ACCESS, true, HeroInfo.pId);
  HeroInfo.hProcess := OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_QUERY_INFORMATION, false, HeroInfo.pId);
  If HeroInfo.hProcess = 0 Then
  Begin
    ShowMessage('没有找到游戏窗口!!');
    Exit;
  End;

  GetSystemInfo(SysInfo);
  PMemoAddr := SysInfo.lpMinimumApplicationAddress;
  MaxMemoAddr := DWORD(SysInfo.lpMaximumApplicationAddress);
  ProgressBar1.Visible := True;
  ProgressBar1.Min := 1;
  ProgressBar1.Max := Trunc((DWord(SysInfo.lpMaximumApplicationAddress) - DWord(SysInfo.lpMinimumApplicationAddress)) / $10000);
  Try
    While true Do
    Begin
      VirtualQueryEx(HeroInfo.hProcess, PMemoAddr, MBI, SizeOf(MBI));
      nSize := MBI.RegionSize;
      If MBI.State = MEM_COMMIT Then
      Begin
        FreeMem(DataBuffer);
        GetMem(DataBuffer, nSize);
        ReadProcessMemory(HeroInfo.hProcess, PMemoAddr, DataBuffer, nSize, lpNumberOfBytesRead);
        j := Trunc(lpNumberOfBytesRead / 4);
        ResultFind := False;
        ProgressBar1.Position := Trunc((DWord(DWORD(PMemoAddr)) - DWord(SysInfo.lpMinimumApplicationAddress)) / $10000);
        Application.ProcessMessages;
        For i := 1 To j Do
        Begin
//          If (i Shr 10) Shl 10 = i Then
//          Begin
//            ProgressBar1.Position := Trunc((DWord(DWORD(PMemoAddr)) - DWord(SysInfo.lpMinimumApplicationAddress) + i * 4) / $10000);
//            Application.ProcessMessages;
//          End;
          If DataBuffer^[i] = SearchDate1 Then //检查经验值
            If DataBuffer^[i + Trunc(AddInfo.Offset4 / 4)] = SearchDate2 Then //检查剩余魔法点
              If DataBuffer^[i + Trunc(AddInfo.Offset5 / 4)] = SearchDate3 Then //检查英雄等级
              Begin
              //检查辅助技能
                CopyMemory(@Skill2Info, @DataBuffer^[i + Trunc(AddInfo.Offset2 / 4)], SizeOf(TSkill2Info));
                For K := 1 To 36 Do If Skill2Info.Integer[k] > 4 Then Break;
                If K = 37 Then //循环正常结束,没有执行过Break
                Begin
                  Inc(ResultCount);
                  If ResultCount > 1 Then Break;
                  EditExp.Text := IntToHex(DWORD(PMemoAddr) + i * 4, 8);
                End;
              End;
        End;
      End;
      If ResultCount > 1 Then Break;
      MemoAddr := DWORD(PMemoAddr) + nSize;
      If MemoAddr >= MaxMemoAddr Then Break;
      PMemoAddr := Pointer(MemoAddr);
    End;
  Except
  End;
  FreeMem(DataBuffer);
  CloseHandle(HeroInfo.hProcess);
  HeroInfo.hProcess := 0;
  If ResultCount = 0 Then
  Begin
    EditExp.Text := '';
    ShowMessage('没有找到游戏数据,请检查查询条件!!');
  End
  Else
    If ResultCount = 1 Then
    Begin
      Button1Click(Application);
      //ShowMessage('找到一个合适的结果!!')
    End
    Else
      ShowMessage('找到游戏数据太多,去玩一会再试!!');
2006-1-3 01:26
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢大哥~可以查找16进制的数值吗~?
2006-1-3 01:53
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

什么叫16进制的数值啊,数值就是数值,难道必须0x0A=0x0A就不能 0x0A=10?
2006-1-3 16:28
0
雪    币: 431
活跃值: (442)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
楼主的意思是做个像游侠之类的内存搜索工具吧?
2006-1-6 15:50
0
游客
登录 | 注册 方可回帖
返回
//