仙剑奇侠传吧 关注:1,005,805贴子:26,316,284
  • 8回复贴,共1

仙剑4 修改器(原创+代码)

只看楼主收藏回复

    无聊研究了2天    终于完成了    希望大家喜欢     不喜欢修改游戏的人别拿鸡蛋扔我哦      
我的主页是: http://hi.baidu.com/ciw%5Fblue
里面有完整的代码.O(∩_∩)O哈哈~
功能:
1.无限物品
2.无限金钱
3.不遇敌人
4.无敌状态
5.物品列表(好像没有什么用,因为有点研究价值,就随便写了)
6.角色属性修改:
A.等级
B.攻击力
C.是否出场(\(^o^)/~,开始玩的时候马上就可以有4个人了)
D.等等.....

主要代码:
type
stGoodsInfo = record//物品结构
dwGoodsID:DWORD;//ID
dwGoodsAmount:DWORD;//数量
szName:PChar;//名称
szComment:PChar;//说明
szFunc:PChar;//作用
end;
type
stPlayerInfo = record//人物的角色对象
dwLevel:DWORD;
dwCurHP:DWORD;
dwCurMP:DWORD;
dwCurQi:DWORD;
dwMaxHP:DWORD;
dwMaxMP:DWORD;
dwGJ:DWORD;
dwFY:DWORD;
dwMJ:DWORD;
dwIsRun:DWORD;
dwIsExist:DWORD;
end;
var
Form1: TForm1;
szGameName:array[0..255] of char;
procedure GetGoods(nBagIndex, nGoodsIndex:integer; var stInfo:stGoodsInfo);
var
dwGoodsID:DWORD;//ID
dwGoodsAmount:DWORD;//数量
szName:PChar;//名称
szComment:PChar;//说明
szFunc:PChar;//作用
begin
asm
     pushad
     push nGoodsIndex//物品的索引
     push nBagIndex//那个物品栏
     mov edi, $004C56E0
     call edi
     mov ecx, eax
     mov edi, $004C6C00
     call edi//获取物品的指针
     mov edi, [eax + 8]
     mov dwGoodsAmount, edi
     mov edi, [eax]//物品属性的指针
     mov ecx, [edi]//物品的ID
     mov dwGoodsID, ecx
     mov ecx, [edi + $14]//物品名称的指针
     mov szName, ecx
     mov ecx, [edi + $24]//物品说明
     mov szComment, ecx
     mov ecx, [edi + $34]//物品作用
     mov szFunc, ecx
     popad
end;
stInfo.dwGoodsID:= dwGoodsID;
stInfo.dwGoodsAmount:= dwGoodsAmount;
stInfo.szName:= szName;
stInfo.szComment:= szComment;
stInfo.szFunc:= szFunc;
end;
function GetGoodsBagAmount(nBagIndex:integer):integer;
var
dwAmount:DWORD;
begin
asm
     pushad
     push nBagIndex //获取第n个物品栏的物品数量
     mov edi, $004C56E0



1楼2009-08-12 04:22回复
         call edi
         mov ecx, eax
         mov edi, $004C6BC0
         call edi
         mov dwAmount, eax
         popad
    end;
    Result:= dwAmount;
    end;
    procedure GetAllGoods();
    var
        stInfo:stGoodsInfo;
        nBagIndex:integer;
        nGoodsIndex:integer;
        cItem:TListItem;
    begin
    for nBagIndex:= 0 to 4 do //有4个物品栏
    begin
        for nGoodsIndex:= 0 to (GetGoodsBagAmount(nBagIndex) - 1) do
         begin
           GetGoods(nBagIndex, nGoodsIndex, stInfo);
           cItem:= form1.RzListView1.Items.Add;
           cItem.Caption:= string(stInfo.szName);
           cItem.SubItems.Add(IntToStr(stInfo.dwGoodsID));
           cItem.SubItems.Add(IntToStr(stInfo.dwGoodsAmount));
           cItem.SubItems.Add(stInfo.szComment);
           cItem.SubItems.Add(stInfo.szFunc);
         end
    end;
    end;
    function WriteMemory(szProcName:PChar; pAddr:Pointer; szBuf:array of char; dwSize:DWORD):boolean;
    var
    hGameWnd:HWND;
    dwID:DWORD;
    hProc:THandle;
    dwWriteByte:DWORD;
    begin
    hGameWnd:= FindWindow(nil, szProcName);
    GetWindowThreadProcessId(hGameWnd, dwID);
    hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, dwID);
    if hProc = 0 then
         begin
         Result:= false;
         exit;
         end;
    WriteProcessMemory(hProc, pAddr, @szBuf, dwSize, dwWriteByte);
    CloseHandle(hProc);
    Result:= true;
    end;
    function ReadMemory(szProcName:PChar; pAddr:Pointer; szBuf:Pointer; dwSize:DWORD):boolean;
    var
    hGameWnd:HWND;
    dwID:DWORD;
    hProc:THandle;
    dwReadByte:DWORD;
    begin
    hGameWnd:= FindWindow(nil, szProcName);
    GetWindowThreadProcessId(hGameWnd, dwID);
    hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, dwID);
    if hProc = 0 then
         begin
         Result:= false;
         exit;
         end;
    ReadProcessMemory(hProc, pAddr, szBuf, dwSize, dwReadByte);
    CloseHandle(hProc);
    Result:= true;
    end;
    procedure InfiniteGoods(nIndex:integer);//nIndex=1时是无限药品,nIndex=2的是用了药品反而增加药品
    var
    hGameWnd:HWND;
    dwID:DWORD;
    hProc:THandle;
    szBuf1:array[0..2] of char;
    szBuf2:array[0..3] of char;
    dwAddr1:DWORD;
    dwAddr2:DWORD;
    begin
    szBuf1[0]:= Char($90);
    szBuf1[1]:= Char($90);
    szBuf2[0]:= Char($ff);
    szBuf2[1]:= Char($40);
    szBuf2[2]:= Char($08);
    dwAddr1:= $4C6A9D;
    dwAddr2:= $4c6b04;
    hGameWnd:= FindWindow(nil, szGameName);
    GetWindowThreadProcessId(hGameWnd, dwID);
    


    2楼2009-08-12 04:22
    回复
      2025-05-29 02:17:24
      广告
      hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, dwID);
      if nIndex = 1 then
           begin
           WriteProcessMemory(hProc, Pointer(dwAddr1), @szBuf1, 2, dwID);
           CloseHandle(hProc);
           exit;
           end;
      WriteProcessMemory(hProc, Pointer(dwAddr2), @szBuf2, 3, dwID);
      CloseHandle(hProc);
      end;
      function GetPlayerBase(nIndex:integer):Pointer;//获取角色基址:0.天河 1.菱纱 2.梦璃 3.紫英
      var
      pTianHeBase:Pointer;//天河的基址
      pPlayerBase:Pointer;//其他角色基址
      begin
      asm
           pushad
           mov edi, $00440690//获取天河基址的Call
           call edi
           mov pTianHeBase, eax
           mov ecx, eax
           push nIndex//角色的索引
           mov edi, $00441210
           call edi
           mov pPlayerBase, eax
           popad
      end;
      if nIndex = 0 then
      begin
           Result:= pTianHeBase;
      end
      else
      begin
           Result:= pPlayerBase;
      end;
      end;
      procedure GetPlayerInfo(nIndex:integer; var stInfo:stPlayerInfo);
      var
      pBase:Pointer;
      begin
      pBase:= GetPlayerBase(nIndex);
      stInfo.dwLevel:= PDWORD(DWORD(pBase) + $884)^;
      stInfo.dwCurHP:= PDWORD(DWORD(pBase) + $890)^;
      stInfo.dwCurQi:= PDWORD(DWORD(pBase) + $894)^;
      stInfo.dwCurMP:= PDWORD(DWORD(pBase) + $898)^;
      stInfo.dwMaxHP:= PDWORD(DWORD(pBase) + $7AC)^;
      stInfo.dwMaxMP:= PDWORD(DWORD(pBase) + $7B8)^;
      stInfo.dwGJ:= PDWORD(DWORD(pBase) + $7B8)^;
      stInfo.dwFY:= PDWORD(DWORD(pBase) + $7BC)^;
      stInfo.dwMJ:= PDWORD(DWORD(pBase) + $7C0)^;
      stInfo.dwIsRun:= PDWORD(DWORD(pBase) + $8F0)^;
      stInfo.dwIsExist:= PDWORD(DWORD(pBase) + $B08)^;
      end;
      procedure GetAllPlayerInfo(nIndex:integer);
      var
      stInfo:stPlayerInfo;
      begin
      GetPlayerInfo(nIndex, stInfo);
      form1.RzNumericEdit1.IntValue:= stInfo.dwLevel;
      form1.RzNumericEdit2.IntValue:= stInfo.dwCurHP;
      form1.RzNumericEdit3.IntValue:= stInfo.dwCurQi;
      form1.RzNumericEdit4.IntValue:= stInfo.dwCurMP;
      form1.RzNumericEdit5.IntValue:= stInfo.dwMaxHP;
      form1.RzNumericEdit6.IntValue:= stInfo.dwMaxMP;
      form1.RzNumericEdit7.IntValue:= stInfo.dwGJ;
      form1.RzNumericEdit8.IntValue:= stInfo.dwFY;
      form1.RzNumericEdit9.IntValue:= stInfo.dwMJ;
      form1.RzCheckBox1.Checked:= Boolean(stInfo.dwIsExist);
      if stInfo.dwIsRun = 0 then
          form1.RzCheckBox2.Checked:= true
      else
          form1.RzCheckBox2.Checked:= false;
      end;
      procedure SetPlayerInfo(nIndex:integer);
      var
      pBase:^PDWORD;
      i:integer;
      begin
      pBase:= GetPlayerBase(nIndex);
      PDWORD(DWORD(pBase) + $884)^ := form1.RzNumericEdit1.IntValue;
      PDWORD(DWORD(pBase) + $890)^ := form1.RzNumericEdit2.IntValue;
      PDWORD(DWORD(pBase) + $894)^ := form1.RzNumericEdit3.IntValue;
      PDWORD(DWORD(pBase) + $898)^ := form1.RzNumericEdit4.IntValue;
      PDWORD(DWORD(pBase) + $7AC)^ := form1.RzNumericEdit5.IntValue;
      PDWORD(DWORD(pBase) + $7B8)^ := form1.RzNumericEdit6.IntValue;
      PDWORD(DWORD(pBase) + $668)^ := form1.RzNumericEdit7.IntValue;
      PDWORD(DWORD(pBase) + $66C)^ := form1.RzNumericEdit8.IntValue;
      PDWORD(DWORD(pBase) + $670)^ := form1.RzNumericEdit9.IntValue;
      PDWORD(DWORD(pBase) + $B08)^ := DWORD(form1.RzCheckBox1.Checked);
      if form1.RzCheckBox2.Checked = true then
      begin
           for i:= 0 to 3 do//把其他3个人设置为不出场
           begin
             if i <> nIndex then
             begin
               pBase:= GetPlayerBase(i);
               PDWORD(DWORD(pBase) + $8F0)^ := 1;//不出来行走
             end;
           end;
      pBase:= GetPlayerBase(nIndex);
      PDWORD(DWORD(pBase) + $8F0)^ := 0;//出来行走
      PDWORD(DWORD(pBase) + $B08)^ := 1;
      form1.RzCheckBox1.Checked:= true;
      end;
      end;


      3楼2009-08-12 04:22
      回复
        sf


        4楼2009-08-12 04:27
        回复
          人才


          5楼2009-08-12 04:28
          回复
            你把修改器放个下载地址不是更方便些吗


            6楼2009-08-12 04:33
            回复
              !


              7楼2009-08-12 04:35
              回复
                看样还是个帅哥


                9楼2011-04-16 16:53
                回复
                  2025-05-29 02:11:24
                  广告
                  秋天笑而不语


                  10楼2011-04-16 16:55
                  回复