看流星社区

 找回密码
 注册账号
查看: 3253|回复: 1

[Delphi] 【转】95版武林——值得收藏的代码

[复制链接]

该用户从未签到

发表于 2011-11-13 16:30:38 | 显示全部楼层 |阅读模式
本帖最后由 hapi 于 2011-11-13 16:33 编辑

转自懒猫blog

这是95版武林的,照抄会封号,看看理解一下;
unit pub;

interface
uses
Windows,messages,StrUtils,SysUtils;

Procedure InjectFunc(InHWND: HWND; Func: Pointer; Param: Pointer; ParamSize: DWORD);
Procedure PickWp(p:pointer); stdcall;//捡物CALL
Procedure UseWp(p:pointer); stdcall;
procedure ChooseGW(p:pointer);stdcall;
procedure xunlu(p:pointer);stdcall;
procedure goback;//回挂机点
procedure gohome;//死亡复活回城
procedure Pick;//捡物
procedure Choose(i:integer);//选怪
procedure eatHp;//吃红
procedure fast1(iword); //按快捷键1~0
procedure fast2(iword); //按快捷键F1~F8
procedure pushfastkey(p:pointer);Stdcall;
procedure checkBB;

var hwd:THandle;//窗口句柄
       pid,hProcess,gwid,jsmTemp,zt,exp,Hys,Lysword;//游戏进程id
       zt2:Word;
       hp,mp,maxHp,maxMp:Integer;//存放生命,真气值
       gjdx,gjdy:Single; //挂机点
       jlx,jly:integer;//怪与挂机点的距离
       gi:integer;//怪列表项
       jsm:array[0..63]of widechar;
       isInfo,isFire:boolean; //判断线程状态
       const address=$12F824; //一级地址
implementation

uses unit1;

       //-------------------------注入代码的函数----------------------------
{参数说明:
InHWND:被注入的窗口句柄
Func:注入的函数的指针
Param:参数的指针
ParamSize:参数的大小
}
Procedure InjectFunc(InHWND: HWND; Func: Pointer; Param: Pointer; ParamSize: DWORD);
var
     hProcess_N: THandle;
     ThreadAdd, ParamAdd: Pointer;
     hThread: THandle;
     ThreadID: DWORD;
     lpNumberOfBytesWORD;
begin
     GetWindowThreadProcessId(InHWND, @ThreadID);
     hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);//打开被注入的进程
     ThreadAdd := VirtualAllocEx(hProcess_N, nil, 4096, MEM_COMMIT, PAGE_READWRITE);
     WriteProcessMemory(hProcess_N, ThreadAdd, Func, 4096, lpNumberOfBytes); //写入函数地址
     ParamAdd := VirtualAllocEx(hProcess_N, nil, ParamSize, MEM_COMMIT, PAGE_READWRITE);
     WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes); //写入参数地址
     hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes); //创建远程线程
     WaitForSingleObject(hThread, INFINITE);//等待线程结束
     VirtualFreeEx(hProcess_N, ThreadAdd, 4096, MEM_RELEASE);
     VirtualFreeEx(hProcess_N, ParamAdd, ParamSize, MEM_RELEASE); //释放申请的地址
     CloseHandle(hThread);
     CloseHandle(hProcess_N); //关闭打开的句柄
end;


//使用物品
Procedure UseWp(p:pointer); stdcall;
var addrword;
begin
addr:=$0056FB80;
asm
           pushad;
           mov       eax, dword ptr [$8EC9C4]
           mov       esi, dword ptr [eax+$20]
           push       1
           mov edx,p
           mov eax,[edx+4]
           mov edx,[edx]
           push       edx                 //ID同捡物的+110
           push       eax                 //位置
           push       0
           lea       ecx, dword ptr [esi+$D4]
           call     addr
           popad;
end;
end;


//捡取物品call
Procedure PickWp(p:pointer); stdcall;
var     Addressword;
begin
Address :=$56FD50;
     asm
         pushad
         mov edx,p
         mov eax,[edx+$4]
         push     eax         //压入物品系统ID
         mov edx,[edx]
         push     edx       //压入物品ID
         mov       ecx, dword ptr [$8EC9C4]
         mov       ecx, dword ptr [ecx+$20]
         add       ecx, $D4
         call Address
         popad;
     end;
end;


procedure Pick;
type
     pPickup = ^Pickup;//定义指针
     Pickup = packed record
     sidword ; //物品系统ID
     id: Dword;         //物品ID
end;
var picktime:integer;
       mypickupickup;
       base,gbase,dmbase,point,wpid,sysid,i:dword;
       num:Cardinal;
begin
picktime:=0;
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $8), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @gbase, 4, num);
ReadProcessMemory(hProcess,pointer(gbase + $18), @gbase, 4, num);
         for i:=0 to 768 do
           begin
               ReadProcessMemory(hProcess,pointer(gbase + i*4), @dmbase, 4, num);
               if dmbase>0 then
                   begin
                         ReadProcessMemory(hProcess,pointer(dmbase + $4), @point, 4, num);
                         ReadProcessMemory(hProcess,pointer(point + $110), @wpid, 4, num);
                         ReadProcessMemory(hProcess,pointer(point + $10c), @sysid, 4, num);
                         form1.list1.AddItem (inttostr(wpid),form1.list1);//添加地面物品ID到列表1
                         form1.list2.AddItem (inttostr(sysid),form1.list2);//添加物品的系统ID到列表2
                 end;
           end;
//---------------物品列表读取完毕,开始捡物------------------------
         if (form1.list1.Items.count>0) and (form1.list2.Items.count>0)then//若地上有物品则开始捡物
           begin
           repeat
             for i:=form1.list1.Items.Count-1 downto 0     do
               begin
                   mypickup.id:=strtoint(form1.list1.Items);
                   mypickup.sid:=StrToInt64(form1.list2.Items);
                   if (mypickup.id>0) and (mypickup.sid>0) then
                     begin
                     injectfunc(hwd,@Pickwp,@MyPickup,8);//捡物call
                     picktime:=picktime+1;
                     sleep(100);
                     end;
               end;
             until (form1.list1.Items.Count=0) or (picktime>form1.List3.Items.Count-1);//控制捡物次数
//---------------捡物完毕,清空物品列表------------------------
form1.list1.Clear;
form1.list2.Clear;
end;
end;

//选怪call
procedure ChooseGW(p:pointer);stdcall;
var addressword;
begin
Address :=$56fdc0;
     asm
       pushad
       mov esi,p//怪物ID
       mov esi,[esi]
       push esi
       MOV ECX,DWORD PTR DS:[$8ec9c4]
       MOV ECX,DWORD PTR DS:[ECX+$20]
       add ecx,$D4
       call address
       popad
     end;
end;

//选怪过程
procedure Choose(i:integer);
type
     pXuanGuai = ^XuanGuai;//定义指针
     XuanGuai = packed record
     id: Dword;
end;
var MyXG:Xuanguai;
begin
gi:=gi+1;
if gi>form1.List3.Count-1 then gi:=0;
       MyXG.id:=StrToInt64(form1.list3.Items);
       injectfunc(hwd,@ChooseGW,@MyXG,8);//选怪call
       sleep(500);
end;

procedure xunlu(p:pointer);stdcall;
begin
     asm
       pushad
       mov ebx, p
       mov eax, dword ptr [ebx]//传X
       mov [$8F2398], eax
       mov eax, dword ptr [ebx+4]//传Z
       mov [$8F239C], eax
       mov eax, dword ptr [ebx+$8]//传Y
       mov [$8F23A0], eax

       mov eax, dword ptr [$12F824]//基地址
       mov eax, dword ptr [eax+$24]
       lea eax, dword ptr [eax+$3c]

       mov ebx,dword ptr [$12F824]
       mov ebx,dword ptr [ebx+$8]
       mov ebx,dword ptr [ebx+$88] //计算出当前地图编号放入ebx
       push ebx       //压入地图编号
       push $8F2398 //压入坐标x,y,z
       push eax
       mov     ecx, $8EC978
       mov     eax, $42AA40
       call eax
       popad
     end;
end;

procedure Pushfastkey(p:pointer);Stdcall;//快捷键call
begin
     asm
       mov ecx,p
       mov ecx,[ecx]
       mov edx,[ecx]
       mov eax,[edx+8]
       call eax
     end;
end;


procedure gohome;//死亡复活回城
begin
       CreateRemoteThread(hProcess,nil,0,Pointer($59A740),nil,0,pid);//复活回城
       sleep(10000);
       goback;//回挂机点
end;

procedure fast1(iword); //按快捷键1~0
type
       pFastKey=^FastKey;
       Fastkey=packed record
       keyidword;
end;
var myFastKey:FastKey;
       base:Dword;
       num:Cardinal;
begin
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址,方便以后使用
ReadProcessMemory(hProcess,pointer(base + $8e0), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $C), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + 4*i), @base, 4, num);
myfastkey.keyid:=base;
if hwd<>0 then
//开始自动寻径
     injectfunc(hwd,@pushfastkey,@myFastKey,4);
end;

procedure fast2(i:Dword); //按快捷键F1-F7
type
       pFastKey=^FastKey;
       Fastkey=packed record
       keyid:Dword;
end;
var myFastKey:FastKey;
       base:Dword;
       num:Cardinal;
begin
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址,方便以后使用
ReadProcessMemory(hProcess,pointer(base + $8ec), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $C), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + 4*i), @base, 4, num);
myfastkey.keyid:=base;
if hwd<>0 then
//开始自动寻径
     injectfunc(hwd,@pushfastkey,@myFastKey,4);
end;

procedure goback;//回挂机点
type
     pzuobiao = ^zuobiao;//定义指针
     zuobiao = packed record
     x: single;
     z: single; //无关紧要
     y: single;
end;
var MyZuoBiao:zuobiao;
begin
MyZuoBiao.x:=gjdx;
MyZuoBiao.z:=0;
MyZuoBiao.y:=gjdy;
if hwd<>0 then
//开始自动寻径
     injectfunc(hwd,@xunlu,@MyZuoBiao,12);
end;

该用户从未签到

 楼主| 发表于 2011-11-13 16:31:48 | 显示全部楼层
procedure eatHp;
type
     pUse = ^Use;//定义指针
     Use = packed record
     id: Dword;         //物品ID
     numberword ; //在包中的位置
end;
var base,Baobase,BaoN,WpId,iword;
       num:Cardinal;
       useHy:Use;//使用红药
begin
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址,方便以后使用
ReadProcessMemory(hProcess,pointer(base + $884), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $10), @BaoN, 4, num);//得到包包格数
//检查红药位置
for     i:=0 to BaoN-1 do
         begin
         wpid:=0;
         ReadProcessMemory(hProcess,pointer(base + $c), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + i*4), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + $8), @WpId, 4, num);//得到第I格物品的ID
         if (WpId=1841) or (WpId=1842) or (WpId=1843) or (wpid=1725) or (wpid=1726)or (wpid=1727)or (wpid=1728)or (wpid=1729)or (wpid=1730)or (wpid=1731)or (wpid=1732)or (wpid=1733)or (wpid=1734) then
           begin
           useHy.id:=WpId;
           useHy.number:=i;
           break;
           end;
         end;
if (useHy.id<>0)then//包里存在红药,则吃红
     begin
       injectfunc(hwd,@UseWp,@UseHy,8);//加红call
       sleep(strtoint(form1.EdtHp.Text)*1000);
     end;
end;

procedure eatMp;
type
     pUse = ^Use;//定义指针
     Use = packed record
     id: Dword;         //物品ID
     numberword ; //在包中的位置
end;
var base,Baobase,BaoN,WpId,iword;
       num:Cardinal;
       useLy:Use;//使用蓝药
begin
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址,方便以后使用
ReadProcessMemory(hProcess,pointer(base + $884), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $10), @BaoN, 4, num);//得到包包格数
//检查蓝药位置
for     i:=0 to BaoN-1 do
         begin
         wpid:=0;
         ReadProcessMemory(hProcess,pointer(base + $c), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + i*4), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + $8), @WpId, 4, num);//得到第I格物品的ID
         if (WpId=1736) or (WpId=1737) or (WpId=1738) or (wpid=1739) or (wpid=1740)or (wpid=1741)or (wpid=1742)or (wpid=1743)or (wpid=1744)or (wpid=1745)or (wpid=1847)or (wpid=1848) then
           begin
           usely.id:=WpId;
           usely.number:=i;
           break;
           end;
         end;
if (usely.id<>0)then//包里存在蓝药,则吃蓝
     begin
       injectfunc(hwd,@UseWp,@UseLy,8);//加蓝call
       sleep(strtoint(form1.EdtMP.Text)*1000);
     end;
end;

procedure checkBB; //检查药品数量
var base,Baobase,BaoN,WpId,i,HyNum,LyNumword;
       num:Cardinal;
begin
hys:=0;
lys:=0;
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址,方便以后使用
ReadProcessMemory(hProcess,pointer(base + $884), @base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $10), @BaoN, 4, num);//得到包包格数
//检查红药位置
for     i:=0 to BaoN-1 do
         begin
         wpid:=0;
         ReadProcessMemory(hProcess,pointer(base + $c), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + i*4), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + $8), @WpId, 4, num);//得到第I格物品的ID
         ReadProcessMemory(hProcess,pointer(Baobase + $14), @hyNum, 4, num);//得到第I格物品的数量
         if (WpId=1841) or (WpId=1842) or (WpId=1843) or (wpid=1725) or (wpid=1726)or (wpid=1727)or (wpid=1728)or (wpid=1729)or (wpid=1730)or (wpid=1731)or (wpid=1732)or (wpid=1733)or (wpid=1734) then
           begin
             hys:=hys+hyNum;
           end;
         end;
form1.lblHys.caption:='荭妖树:'+inttostr(hys);
//检查蓝药位置
for     i:=0 to BaoN-1 do
         begin
         wpid:=0;
         ReadProcessMemory(hProcess,pointer(base + $c), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + i*4), @Baobase, 4, num);
         ReadProcessMemory(hProcess,pointer(Baobase + $8), @WpId, 4, num);//得到第I格物品的ID
         ReadProcessMemory(hProcess,pointer(Baobase + $14), @LyNum, 4, num);//得到第I格物品的数量
         if (WpId=1736) or (WpId=1737) or (WpId=1738) or (wpid=1739) or (wpid=1740)or (wpid=1741)or (wpid=1742)or (wpid=1743)or (wpid=1744)or (wpid=1745)or (wpid=1847)or (wpid=1848) then
           begin
             lys:=lys+LyNum;
           end;
         end;
form1.lblLys.caption:='篮妖树:'+inttostr(lys);
//sleep(100);
end;

end.
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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

GMT+8, 2024-4-19 21:07

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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