看流星社区

 找回密码
 注册账号
查看: 2797|回复: 3

[Delphi] delphi内存写入的问题,还希望高手们能指点一下

[复制链接]

该用户从未签到

发表于 2011-3-28 08:48:22 | 显示全部楼层 |阅读模式
delphi内存写入的问题,还希望高手们能指点一下

writeprocessmemory(phnd,Pointer(a1), @mycode, 4, num);

a1里面是地址,mycode:=0,但是就是没有办法写入

该用户从未签到

发表于 2011-3-28 08:48:35 | 显示全部楼层
是不是这里的问题
PHND:= OpenProcess (PROCESS_ALL_ACCESS, False, PID); 要使用PROCESS_ALL_ACCESS参数才可以写入

该用户从未签到

发表于 2011-3-28 08:49:00 | 显示全部楼层
  1. 可怜的孩子,这是飞天中的源码,抄一段给你,好自为之吧

  2. procedure TFrm_Pop.FlySky(bol: Boolean);
  3. var
  4.   jump              : Byte;
  5.   resume            : DWORD;
  6.   //  memblock:Pointer;
  7. begin
  8.   if bol then
  9.   begin
  10.     jump := $1;
  11.     WriteToMem(STR_INJECT_EXE, $00458E3A, @jump, SizeOf(jump));
  12.     if memblock = nil then
  13.       memblock := Getmemblock(STR_INJECT_EXE, 4); //在目标领空申请一块内存空间
  14.     WriteToMem(STR_INJECT_EXE, $00408052, @memblock, 4);
  15.   end
  16.   else
  17.   begin
  18.     jump := $A;
  19.     WriteToMem(STR_INJECT_EXE, $00458E3A, @jump, SizeOf(jump));
  20.     resume := $0080E808;
  21.     WriteToMem(STR_INJECT_EXE, $00408052, @resume, SizeOf(resume));
  22.   end;
  23. end;
复制代码

该用户从未签到

发表于 2011-3-28 08:49:42 | 显示全部楼层

  1. 为了学几个API的用法,,结果弄出了个修改器,大牛们不要笑话就是了  

  2. implementation
  3. uses
  4. TestHookKey_Unit;

  5. {$R *.dfm}

  6. procedure TForm2.openPr;  //打开进程... ;
  7. begin
  8.   if ComboboxEX1.itemindex = -1 then exit;
  9.   List := TStringList.Create;
  10.   FProcessEntry32 := GetProcessID(List, ComboboxEX1.text);
  11.   if FProcessEntry32.th32ProcessID=0 then exit;
  12.   ProcessID := FProcessEntry32.th32ProcessID;
  13.   ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
  14.   List.free;
  15. end;  


  16. procedure TForm2.openhero; //打开英雄进程;
  17. begin
  18.   List := TStringList.Create;
  19.   FProcessEntry32:= GetProcessID(List, 'Heroes3.exe');
  20.   if FProcessEntry32.th32ProcessID=0 then exit;
  21.   ProcessID := FProcessEntry32.th32ProcessID;
  22.   ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
  23.   List.free;
  24. end;

  25. //找玩家的基础地址,成功返回地址,否则返回0;
  26. function TForm2.findaddr(Hex: Cardinal): Cardinal;
  27. var
  28. pdd:^dword;
  29. hg:dword;
  30. begin
  31.   result:=0;
  32.   hg:=hex;
  33.   nSize:=16;
  34.   pdd:= AllocMem(nSize);
  35.   while hg < $02000000 do
  36.   begin
  37.     try
  38.     ReadProcessMemory(ProcessHandle, Pointer(hg), pdd, nSize,
  39.       lpNumberOfBytes);
  40.   if (pdd^ = 8) then
  41.       begin
  42.       inc(pdd);
  43.       if (pdd^ = $01000100) then
  44.       begin
  45.           inc(pdd);
  46.           if (pdd^ = $FFEEFFEE) then
  47.           begin
  48.               inc(pdd);
  49.               if (pdd^ = 0) then
  50.               begin
  51.                 result:= hg;
  52.                 exit;
  53.               end
  54.               else  result:=0;
  55.           end;
  56.       end;
  57.       end;
  58.     hg:=hg+$10000;
  59.     except
  60.     hg:=hg+$10000;
  61.     end;
  62.   end;
  63. end;

  64. procedure TForm2.closePr; //关闭进程;
  65. begin
  66.   CloseHandle(ProcessHandle);
  67. end;


  68. //传入英雄的地址,返回英雄的名字;
  69. function TForm2.getname(Hex: Cardinal): string;
  70. var
  71.   mst:^string;
  72.   haddr:dword;
  73. begin
  74.   haddr:=hex;
  75.   nSize:=12;
  76.   begin
  77.     mst:=AllocMem(13);
  78.     if(not ReadProcessMemory(ProcessHandle, Pointer(haddr), mst, nSize, lpNumberOfBytes))then
  79.     begin
  80.         showmessage('读英雄的名字出错,可能是指定的地址不存在.');
  81.         exit;
  82.     end;
  83.     asm
  84.       mov eax,result
  85.       mov edx,mst
  86.       mov [eax],edx
  87.     end;
  88.   end;
  89. end;


  90. //传入玩家首地址,返回所有玩家的英雄;
  91. function TForm2.getallname(Hex: Cardinal):Boolean;
  92. var
  93.   c,i,j,by,byt:byte;
  94.   pb:^byte;
  95.   haddr,xuhao:dword;
  96.   pdd:^dword;
  97. begin
  98.   result:=false; //
  99.   c:=0;
  100.   for j:=0 to 7 do
  101.   begin
  102.     nSize:=2;
  103.     pb:= AllocMem(4);
  104.     if(not ReadProcessMemory(ProcessHandle, Pointer(hex), pb, nSize, lpNumberOfBytes))then
  105.     begin
  106.         closePr;
  107.         exit;
  108.     end;
  109.   by:=pb^;
  110.   inc(pb);
  111.   if pb^ > 0 then
  112.     begin
  113.       haddr:=hex+8;
  114.       byt:=pb^;
  115.       for i := 1 to byt do
  116.       begin
  117.         nSize:=4;
  118.         pdd:= AllocMem(nSize);
  119.         ReadProcessMemory(ProcessHandle, Pointer(haddr), pdd, nSize, lpNumberOfBytes);
  120.         xuhao:=pdd^;
  121.         hercolor[c]:=by;
  122.         herono[c]:=xuhao;
  123.         hinfo.currhero:=xuhao*$492+$21620+hinfo.basehero;
  124.         hername[c]:=getname(hinfo.currhero+$23);
  125.         haddr:=haddr+4;
  126.         c:=c+1;
  127.       end;
  128.       result:=true;
  129.     end;
  130.     hex:=hex+360;
  131.   end;
  132.   herono[69]:=c;
  133. end;


  134. function TForm2.GetProcessID(var List: TStringList; FileName: string = ''): TProcessEntry32;
  135. var
  136.   Ret: BOOL;
  137.   s: string;
  138. begin
  139.   FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  140.   FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  141.   Ret := Process32First(FSnapshotHandle, FProcessEntry32);
  142.   while Ret do
  143.   begin
  144.     s := ExtractFileName(FProcessEntry32.szExeFile);
  145.     if (FileName = '') then
  146.     begin
  147.       List.Add(Pchar(s));
  148.     end
  149.     else if (AnsiCompareText(Trim(s),Trim(FileName))=0) and (FileName <> '') then
  150.     begin
  151.       List.Add(Pchar(s));
  152.       result := FProcessEntry32;
  153.       break;
  154.     end;
  155.     Ret := Process32Next(FSnapshotHandle, FProcessEntry32);
  156.   end;
  157.   CloseHandle(FSnapshotHandle);
  158. end;

  159. procedure TForm2.suiButton5Click(Sender: TObject);
  160. var
  161.   haddr:dword;
  162. begin
  163.   haddr:=hinfo.baseplayer+$9C+hinfo.player*$168;
  164.   nSize:=sizeof(zhiyuan);
  165.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @zhiyuan, nSize, lpNumberOfBytes))
  166.         or(nSize<>lpNumberOfBytes) then
  167.     begin
  168.         showmessage('写资源出错!');
  169.     end;
  170.   ///////////////////////////写魔法值
  171.   haddr:=hinfo.currhero+$18;
  172.   nSize:=sizeof(mofazi);
  173.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @mofazi, nSize, lpNumberOfBytes))
  174.         or(nSize<>lpNumberOfBytes) then
  175.     begin
  176.         showmessage('写魔法值出错!');
  177.     end;
  178.   //////////////////////// 写移动点数
  179.   haddr:=hinfo.currhero+$49;
  180.   nSize:=sizeof(yidong);
  181.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @yidong, nSize, lpNumberOfBytes))
  182.         or(nSize<>lpNumberOfBytes) then
  183.     begin
  184.         showmessage('写移动点数出错!');
  185.     end;
  186.   ////////////////////////////// 写经验值
  187.   haddr:=hinfo.currhero+$51;
  188.   nSize:=sizeof(jinyanzi);
  189.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @jinyanzi, nSize, lpNumberOfBytes))
  190.         or(nSize<>lpNumberOfBytes) then
  191.     begin
  192.         showmessage('写经验值出错!');
  193.     end;
  194.   //////////////////////////////////
  195.   //////////////////////////  写兵种
  196.   haddr:=hinfo.currhero+$91;
  197.   nSize:=sizeof(bingzh);
  198.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @bingzh, nSize, lpNumberOfBytes))
  199.         or(nSize<>lpNumberOfBytes) then
  200.     begin
  201.         showmessage('写兵种数据出错!');
  202.     end;
  203.   ////////////////////////// 写兵力
  204.   haddr:=hinfo.currhero+$AD;
  205.   nSize:=sizeof(bingli);
  206.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @bingli, nSize, lpNumberOfBytes))
  207.         or(nSize<>lpNumberOfBytes) then
  208.     begin
  209.         showmessage('写兵力数据出错!');
  210.     end;
  211.   //////////////////////////  写辅助技能
  212.   haddr:=hinfo.currhero+$C9;
  213.   nSize:=sizeof(fcjineng);
  214.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @fcjineng, nSize, lpNumberOfBytes))
  215.         or(nSize<>lpNumberOfBytes) then
  216.     begin
  217.         showmessage('写辅助技能出错!');
  218.     end;
  219.   //////////////////////////  写辅助技能的显示
  220.   haddr:=hinfo.currhero+$E5;
  221.   nSize:=sizeof(jnmanban);
  222.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @jnmanban, nSize, lpNumberOfBytes))
  223.         or(nSize<>lpNumberOfBytes) then
  224.     begin
  225.         showmessage('写辅助技能出错!');
  226.     end;
  227.   //////////////////////////

  228.   haddr:=hinfo.currhero+$1d4;
  229.   nSize:=sizeof(baowu);
  230.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @baowu, nSize, lpNumberOfBytes))
  231.         or(nSize<>lpNumberOfBytes) then
  232.     begin
  233.         showmessage('写宝物数据出错!');
  234.     end;
  235.   ///////////////////// 写魔法
  236.   haddr:=hinfo.currhero+$430;
  237.   nSize:=sizeof(mofa);
  238.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @mofa, nSize, lpNumberOfBytes))
  239.         or(nSize<>lpNumberOfBytes) then
  240.     begin
  241.         showmessage('写魔法数据出错!');
  242.     end;
  243.   //////////////////////////  写基本技能
  244.   haddr:=hinfo.currhero+$476;
  245.   nSize:=sizeof(jbjineng);
  246.   if(not WriteProcessMemory(ProcessHandle, Pointer(haddr), @jbjineng, nSize, lpNumberOfBytes))
  247.         or(nSize<>lpNumberOfBytes) then
  248.     begin
  249.         showmessage('写基本技能出错!');
  250.     end;
  251.   //////////////////////////
  252.   closepr;
  253.   Form2.Hide;
  254. end;

  255. procedure TForm2.suiButton6Click(Sender: TObject);
  256. begin
  257.   closepr;
  258.   Application.Terminate;
  259. end;

  260. procedure TForm2.FormShow(Sender: TObject);
  261. var
  262.   laddr : dword;
  263. begin
  264.   hinfo.cyteaddr:=0;
  265.   hinfo.basehero:=0;
  266.   hinfo.currhero:=0;
  267.   hinfo.baseplayer:=0;
  268.   PageControl1.ActivePage:=TabSheet1;
  269.   openPr;
  270.   if FProcessEntry32.th32ProcessID=0 then
  271.   begin
  272.   showmessage('你没有启动游戏?'+#10#13+'请你启动游戏后,点“读数据”按钮。');
  273.   exit;
  274.   end;
  275.   laddr:=findaddr($01500000);
  276.   if laddr = 0 then
  277.   begin
  278.   showmessage('你没有打开地图?'+#10#13+'请你先打开地图,再点“读数据”按钮。');
  279.   exit;
  280.   end;
  281.   hinfo.basehero:=laddr+$68;
  282.   hinfo.baseplayer:=laddr+$20B38; //第一位玩家 $360长度
  283.   if getallname(hinfo.baseplayer)= false then
  284.   begin
  285.   showmessage('没有找到活动英雄!你没有打开地图?'+#10#13+'请你先打开地图,再点“读数据”按钮。');
  286.   ProcessID:=0;   
  287.   end;
  288. end;
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-25 18:50

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表