做為一個老新手,我想我以自已的經驗為例,希望能給一些新手說明,少走一些彎路…
我們寫掛時常用的有3種方法…以完美的撿東西為例
1. 模擬按鍵 - 這個應該很好理解,就是由外掛來幫我們按鍵。
2. 呼叫程式內建的函數來達成我們要的功能。
3. 直接傳送撿東西的封包給伺服器
下面是我的例子…
1. 模擬按鍵 - 這個應該很好理解,就是由外掛來幫我們按鍵。
這種方式缺點不少,比如說按鍵的安排不同的角色必須相同,按鍵也必須要有 delay 的時間等等。
但是這種方式簡單,程式非常容易寫…例如 F4撿東西
handle := FindWindow(nil, pchar(edit1.text));
SendMessageW(handle,WM_KEYDOWN ,115,0);
2. 呼叫程式內建的函數來達成我們要的功能。
這種方式不用理會使用者的按鍵安排,但是缺點是必須要知道內建函數的位址或偏移,參數與堆疊也要小心。
程式的撰寫就比較麻煩了,而且改版之後位址也會變更。例如…
const W2I_PICKITEM_CALL=$5DA480;
//dll使用------------------------------------------
procedure CallSendPickItem(p: PCallParam); stdcall;
var
len: integer;
buf: array[0..9] of byte;
pbuf: pointer;
tmp1,itemsn,itemid: dword;
begin
itemsn:=p^.general_use1;
itemid:=p^.general_use2;
asm
pushad
push itemsn
push itemid
mov ecx, W2I_CALL_BASE
mov ecx,dword ptr [ecx+20]
add ecx,$0ec
mov eax, W2I_PICKITEM_CALL//呼叫撿東西的內部函數
call eax
add esp,8
popad
end;
end;
//外掛程式使用----------------------------------------
procedure TForm1.SendPickItem(itemsn, itemid: dword);
begin
callparam.general_use1:=itemsn;
callparam.general_use2:=itemid;
InjectFunc(handle,@CallSendPickItem,@callparam,SizeOf(callparam));
end;
3. 直接傳送撿東西的封包給伺服器
這種方式最直接,而且改版也不需要修改地址,通常封包的結構也不會改(只會變更內容, 例如有新的物品)。
事實上這種方法的程式也並不麻煩,麻煩的是你要知道封包的結構而已。例如…
const W2I_CALL_BASE=$98ADDC;
const W2I_SEND_PACK_CALL=$5BD9A0;
//dll使用------------------------------------------
procedure CallSendPickItem(p: PCallParam); stdcall;
var
len: integer;
buf: array[0..9] of byte;
pbuf: pointer;
tmp1,itemsn,itemid: dword;
begin
buf[0]:=$06;
buf[1]:=$0;
pbuf:=@buf;
len:=10;
tmp1:=p^.general_use2;
asm
pushad
mov esi, tmp1
mov edi, pbuf
mov dword ptr[edi+2], esi
popad
end;
tmp1:=p^.general_use1;
asm
pushad
mov esi, tmp1
mov edi, pbuf
mov dword ptr[edi+6], esi
popad
end;
asm
pushad
mov ecx, W2I_CALL_BASE
mov ecx, [ecx]
push len
push pbuf
mov ecx, dword ptr [ecx+$20]
mov eax, W2I_SEND_PACK_CALL//發送封包
call eax
popad;
end;
end;
//外掛程式使用----------------------------------------
procedure TForm1.SendPickItem(itemsn, itemid: dword);
begin
callparam.general_use1:=itemsn;
callparam.general_use2:=itemid;
InjectFunc(handle,@CallSendPickItem,@callparam,SizeOf(callparam));
end;
這是我的經驗,希望能對新手有些幫忙。 |