Bardzo ładny artykuł. Właśnie biorę się za pisanie bota ;] Jak tego nie przeniosą to nie wiem co im zrobie :D !! 10/10 ziąąąąą
@Edit
Mam pytanie.. Czym i jak skanujecie tą pamięć Tibii ? tibiatech.tk nie działa ..
Wersja do druku
Bardzo ładny artykuł. Właśnie biorę się za pisanie bota ;] Jak tego nie przeniosą to nie wiem co im zrobie :D !! 10/10 ziąąąąą
@Edit
Mam pytanie.. Czym i jak skanujecie tą pamięć Tibii ? tibiatech.tk nie działa ..
@up
TSearch lub Cheat Engine.
Z niewiadomych przyczyn ostatnio TSearch caly czas mi sie wywala, ale CE daje rade ; )
Jakiego kompilatora używałeś pisząc ten poradnik??
No ja właśnie robie na Delphi 7 i kicha xDD (ale to może ja coś pierdole)
Artykuł jest poniekąd zabytkowy, i wątpię żeby na chwilę obecną cokolwiek z niego działało, tym bardziej oświadczam że postanowiłem kategorycznie skończyć z Tibią już jakiś czas temu gdyż i bez tego mam masę zajęć, więc proszę nie pytajcie mnie już o tego bota. Z Delphi (akurat wersja 7 Personal, ale na 2005 też pewnie by poszło) też dawno nie miałem styczności, więc raczej wam nie pomogę.
Sorry!
PS. Kod zawiera kilka błędów, jeżeli znajdzie się ktoś kto je poprawi będzie miło (za dużo parametrów przekazywanych do MemoryReadInt), ja nie mam niestety czasu.
function MemoryReadInt(Address: Cardinal): Longword;
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value: Longword;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcId);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
CloseHandle(tProc);
Result := Value;
end;
i może się przydac:
function MemoryWriteInt(Address, Int: Cardinal): Longword;
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value: Longword;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcId);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
WriteProcessMemory(tProc, Ptr(Address), @Int, 4, NBR);
CloseHandle(tProc);
Result := Value;
end;
wystarczy pokombinować aby napisac funkcję MemoryWriteString (podpowiedz: najpierw napisz sobie funckję memoryWriteChar, zapisująca po jednym bajcie, nie zapomnij zmienic w ReadProcessMemory 4 na 1)
Dobra chłopaki a ja wam jeszcze powiem że jak chcecie expa i lvl zobaczyć to dajcie sobie te stałe :D
PLAYER_LEVEL = $00602D30;
PLAYER_EXP = $006059C4;
Tamte były ma 7.6 więc teraz się nie dziwię że nie działało nic ;P
Co jest zebrało się na pisanie botów?? :DCytuj:
Użytkownicy aktualnie czytający ten temat: 17 (użytkowników 13 oraz gości 4)
Yaboomaster, bożydar, EgoTuitam, G!@diu$, Generalny Generał, Michaleczek, Moon the Dwarf, Ozzie Zombie, pabblo, pawianpawian, polosin, Sebox, Szudarek
@down
Nie każdy bo jak napisał autor funkcja MemoryReadInt ma coś źle ^^ Więc teraz pewnie tam tupią nóżką przed kompami że im nie idzie xD
Hmm, teraz chyba każdy będzie mógł sobie zrobić swoją własną ołntibję, wystarczy tylko podmienić adresy na te zawierające acc i pass... ;X (btw spróbuję, zobaczę czy wyciągnie te dane ;p)
//poszukajcie na forum, jest pewien poradniczek z owymi adresami ;)
Macie tu source bota :P Na formie musicie umieścić button1 i button2 :P Jeżeli znacie trochę delphi to sobie poradzicie, jeżeli nie to pytajcie ;D Jak coś napisze jeszcze to dam tutaj ^^
Kod:unit BotMForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
HookID: HHOOK;
type
PKbdDllHookStruct = ^TKbdDllHookStruct;
TKbdDllHookStruct = record
vkCode,
ScanCode,
Flags,
Time,
dwExtraInfo: Integer;
end;
const
WH_KEYBOARD_LL = 13;
BATTLELIST_START = $005F7994;
BATTLELIST_END = $005FD460;
PLAYER_X = $00602B08;
PLAYER_Y = $00602B04;
PLAYER_Z = $00602B00;
PLAYER_LEVEL = $00602D30;
PLAYER_EXP = $006059C4;
STATUS_TEXT = $0074F1D0;
STATUS_TIMER = $0074F1CC;
SPEED_USE = $0074DBD0;
PLAYER_SOUL = $006059A8;
PLAYER_MANA = $006059B0;
implementation
{$R *.dfm}
function MemoryReadInt(Address: Cardinal): Longword;
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value: Longword;
begin
GetWindowThreadProcessId(FindWindow('TibiaClient', Nil), @ProcId);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
CloseHandle(tProc);
Result := Value;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Tibia: Cardinal;
begin
Tibia := FindWindow('TibiaClient',nil);
SetWindowText(Tibia,PChar('Yaboobot'));
end;
function CalculateLeftExp: string;
var
Tibia: Cardinal;
AExp, ALevel, ASoul, AMana: Cardinal;begin
{Obliczamy zawartość zmiennych}
Tibia := FindWindow('TibiaClient',nil);
AExp := MemoryReadInt(PLAYER_EXP);
ALevel := MemoryReadInt(PLAYER_LEVEL);
ASoul := MemoryReadInt (PLAYER_SOUL);
AMana := MemoryReadInt (PLAYER_MANA);
Result := Format('Level: %d. Ilość exp.: %d. Ilość souli.: %d. Ilość many.: %d.',[ALevel,AExp,ASoul,AMana]);
end;
function LLKeyHookFunc(HookCode: Integer; KeyCode: wParam; KStrokeInfo: lParam): LResult; stdcall;
var
Struct: PKbdDllHookStruct;
Tibia: Cardinal;
begin
Struct := Ptr(KStrokeInfo);
if (HookCode >= 0) then
begin
{Pojedyncza funkcja}
if (Struct.vkCode = VK_F7) and(GetAsyncKeyState(VK_CONTROL)<-32766) then begin
Tibia := FindWindow('TibiaClient',nil);
SetWindowText(Tibia,PChar(CalculateLeftExp));
end;
end;
{Uwaga! POPRAWIONE}
Result := CallNextHookEx(HookID, HookCode, KeyCode, KStrokeInfo);
end;
procedure LockSystem;
begin
HookID := SetWindowsHookEx (WH_KEYBOARD_LL, @LLKeyHookFunc, hInstance, 0);
end;
procedure UnLockSystem;
begin
UnHookWindowsHookEx (HookID);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Tibia: Cardinal;
begin
Tibia := FindWindow('TibiaClient',nil);
SetWindowText(Tibia,PChar(CalculateLeftExp));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LockSystem;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnlockSystem;
end;
a zna kto strone o tym kiedyś na tibiasoft pisano o pisaniu botów (masło maślane) :P
Świtny poradnik tylko czego odrazu napisałeś że delphi ? kolega mi kiedyś mówił że nie tylko delphim się robi programy :P
Artykuł 9/10 GRATZ !!!
Mam nadzieję że przeniosą cię do artykułów
Oczywiście, istnieją inne języki, ten wybrałem bo jest łatwy, a Delphi ma fajny designer... ( żeby nie mieszac kodu bota z kodem interfejsu). poza tym istnieje duzo zasobow do delphi odn. hackowania tibii. ztcw. nawet Cheat Engine bylo pisane w Delphi.
Dobra wiadomosc: chyba wezme sie od poczatku za pisanie tego arta, wlacznie z pakietami, lowieniem ryb, autoexpem (czy jak to sie nazywa), autoresponderem, itp. Ale w tym celu admin forum musilaby zniesc limit dlugosci postu albo wlaczyc odpowiadanie tego samego autora, bo sie po prostu nie miesci.
Jak to ktos kiedys powiedzial: tibia to nie wyzwanie dla graczy, to wyzwanie dla programistów.
Narazie udało mi się dojść do tego jak ściągać przedmiot o danym ID :)
Oto prosty kod wysyłający pakiety do jego wysłania potrzebujecie
pod uses dodać
Musicie też mieć packet.dllKod:procedure SendPacket(ProcessID: Cardinal; Packet: Pointer; Encrypt: Boolean; SafeArray: Boolean); stdcall; external 'packet.dll';
Ja go ma stąd Packet.dll
Podobno u kogoś wykryło w nim
Found HEUR/Malware
Jeżeli macie swój packet.dll to lepiej używajcie swojego żeby nie było na mnie, ale ja używam tego i nic mi nie jest :P
Kod://Wysylanie pakietow na sciagniecie dragon shielda, zalozenie runy, wypowiedzenie adori gran, sciagniecie runy, zalozenie d-shielda//
GetWindowThreadProcessId(FindWindow('TibiaClient', nil), @ProcessID);
//Wyslanie pakietu ktory sciagnie tarcze
packetBuffer[0]:= $0F;
packetBuffer[1]:= $00;
packetBuffer[2] := $78;
packetBuffer[3] := $FF;
packetBuffer[4] := $FF;
packetBuffer[5] := $05;
packetBuffer[6] := $00;
packetBuffer[7] := $00;
packetBuffer[8] := $58;
packetBuffer[9] := $0D;
packetBuffer[10] := $00;
packetBuffer[11] := $FF;
packetBuffer[12] := $FF;
packetBuffer[13] := $0A;
packetBuffer[14] := $00;
packetBuffer[15] := $00;
packetBuffer[16] := $01;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
//Wyslanie pakietu ktory zalozy rune
sleep(100);
packetBuffer[0]:= $0F;
packetBuffer[1]:= $00;
packetBuffer[2] := $78;
packetBuffer[3] := $FF;
packetBuffer[4] := $FF;
packetBuffer[5] := $41;
packetBuffer[6] := $00;
packetBuffer[7] := $13;
packetBuffer[8] := $4B;
packetBuffer[9] := $0C;
packetBuffer[10] := $13;
packetBuffer[11] := $FF;
packetBuffer[12] := $FF;
packetBuffer[13] := $05;
packetBuffer[14] := $00;
packetBuffer[15] := $00;
packetBuffer[16] := $01;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
//wyslanie pakietu ktory powie adori gran
sleep(100);
packetBuffer[0]:= $0E;
packetBuffer[1]:= $00;
packetBuffer[2] := $96;
packetBuffer[3] := $01;
packetBuffer[4] := $0A;
packetBuffer[5] := $00;
packetBuffer[6] := $61;
packetBuffer[7] := $64;
packetBuffer[8] := $6F;
packetBuffer[9] := $72;
packetBuffer[10] := $69;
packetBuffer[11] := $20;
packetBuffer[12] := $67;
packetBuffer[13] := $72;
packetBuffer[14] := $61;
packetBuffer[15] := $6E;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
//wyslanie pakietu ktory sciagnie rune
sleep(100);
packetBuffer[0]:= $0F;
packetBuffer[1]:= $00;
packetBuffer[2] := $78;
packetBuffer[3] := $FF;
packetBuffer[4] := $FF;
packetBuffer[5] := $05;
packetBuffer[6] := $00;
packetBuffer[7] := $00;
packetBuffer[8] := $7E;
packetBuffer[9] := $0C;
packetBuffer[10] := $00;
packetBuffer[11] := $FF;
packetBuffer[12] := $FF;
packetBuffer[13] := $41;
packetBuffer[14] := $00;
packetBuffer[15] := $0F;
packetBuffer[16] := $01;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
//wyslanie pakietu ktory zalozy tarcze
sleep(100);
packetBuffer[0]:= $0F;
packetBuffer[1]:= $00;
packetBuffer[2] := $78;
packetBuffer[3] := $FF;
packetBuffer[4] := $FF;
packetBuffer[5] := $0A;
packetBuffer[6] := $00;
packetBuffer[7] := $00;
packetBuffer[8] := $58;
packetBuffer[9] := $0D;
packetBuffer[10] := $00;
packetBuffer[11] := $FF;
packetBuffer[12] := $FF;
packetBuffer[13] := $05;
packetBuffer[14] := $00;
packetBuffer[15] := $00;
packetBuffer[16] := $01;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
Yaboomaster skompilowałem twojego bota, ale pod Tibie 7.8 nie działa on. Mam pytanie pod jaką wersje Tibii zrobiony jest ten bot i skąd bierzesz to:
Cytuj:
const
WH_KEYBOARD_LL = 13;
BATTLELIST_START = $005F7994;
BATTLELIST_END = $005FD460;
PLAYER_X = $00602B08;
PLAYER_Y = $00602B04;
PLAYER_Z = $00602B00;
PLAYER_LEVEL = $00602D30;
PLAYER_EXP = $006059C4;
STATUS_TEXT = $0074F1D0;
STATUS_TIMER = $0074F1CC;
SPEED_USE = $0074DBD0;
PLAYER_SOUL = $006059A8;
PLAYER_MANA = $006059B0;