PDA

Просмотр полной версии : [Руководство] Injection Codes - Delphi/C++/AutoIt


Sirioga
16.02.2010, 12:10
Injection Codes - Delphi/C++/AutoIt
Все адреса в функциях устарели!
Оригинал на elitepvpers ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

По скольку большенство умных сдесь людей несколько эгоистичны, я решил написать свой гайд и поделится им с форумом!
Ну начнем, во перых Injecting это лучший способ написания своего бота или чего нибудь другого, а во вторых, давайте перестанем быть нубами и просто менять адреса, давайте играть жестко!

Вся информация здесь основана на Perfect World International

Для начала:
Давайте разберёмся кое в чем. Все люди здесь говорят о изменении адресов, офсетах и указателях...Вы понимаете о чем я говорю? (идите в google и поищите парочку гайдов)

Я нашел 4 типа адресов:

1. Базовый адрес (0x0096d1dc)
--> Базовый адрес в Wikipedia ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) (EN)
--> Мы начнём отсюда. Все Inject функции нужно начинать с указателя от правильного адреса!
--> Используйте гайд как найти базовый адрес...Когда вы нашли базовый адрес, вычтите 0x1C и выполните еще один поиск в Hex значении для того что бы узнать РЕАЛЬНЫЙ базовый адрес.
--> Все Inject функции начинаются отсюда. Попробуйте найти ассемблерный код [0096d1dc] в отладчике Cheat Engine ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и вы будите иметь все возможные адреса для Injecting`а

2. Динамический адрес (0x0096d1dc + 0x1C -> указывает на 0x0096d87c)
--> Это адрес начала блока игровой сесии, называется по ошибке большинством как тот самый base address. Используется для ботов таких как MHS.
--> Its the Load-in-Time allocator... in other words, its a memory redirector.

3. Окружающая среда Адреса (0x0096d87c + 0x8 -> указывает на динамический адрес)
--> Указатель, который выделяет динамической адресации для петель и охраняемые блоки.

4. Роль Адреса (0x0096d87c + 0x20 -> указывает на динамический адрес)
--> Указатель, который выделяет динамический адрес как глобальные переменные, константы и типы.

Разъяснение:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Функции для Injecting`а

Delphi: (by asgborges)

procedure InjectFunc(ProcessID: Cardinal; Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;

ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
// ---- Write function address
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);

// ---- Address to write parameters
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);

// ---- Create a remote thread
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);

// ---- Thread to wait for the end of
WaitForSingleObject(hThread, 3000);

GetExitCodeThread(hThread,lpExitCode);
TerminateThread(hThread,lpExitCode);

VirtualFreeEx(ProcessID,ThreadAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,ParamAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,Func,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,aParams,0,MEM_RELEASE);

CloseHandle(hThread);
end
end;


C++ Builder: (найдено в инете)

#include <tlhelp32.h>
...
typedef tagPROCESSENTRY32W pGameProcess;
...
bool CallRemoteFunction(pGameProcess pProcess)
{
//Remote Thread Handle
HANDLE hProcess=NULL;
//Inject Thread handle
HANDLE hThread=NULL;
//Inject Fuction Address after allocate
LPVOID ThreadCodeAddr=NULL;
//Inject Function
LPVOID Func=SelectMonster;
//Inject Fuction Stack Address after allocate
LPVOID ThreadDataAddr=NULL;
//Inject Fuction Stack Data
LPCVOID lpParam = NULL;
DWORD Value = 0;
lpParam = &Value;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pProcess.th32ProcessID);
if (!hProcess)
{
//Do your Error message (OpenProcess);
return false;
}
ThreadCodeAddr=VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
ThreadDataAddr=VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory (hProcess, ThreadCodeAddr, Func, 4096, NULL);
WriteProcessMemory (hProcess, ThreadDataAddr, lpParam, 256, NULL);
hThread = CreateRemoteThread(hProcess, NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadCodeAddr, ThreadDataAddr, NULL, NULL);
if (!hThread)
{
//Do your Error message (CreateRemoteThread);
}
else
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess, ThreadCodeAddr, 4096, MEM_RELEASE);
VirtualFreeEx(hProcess, ThreadDataAddr, 256, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}


AutoIt (нет библиотеки с опкодами)

Func INJECTCODE($PID)
If $PID <> 0 And $OPCODE <> "" Then
Local $DATA = DllStructCreate("byte[" & StringLen($OPCODE) / 2 & "]")
For $I = 1 To DllStructGetSize($DATA)
DllStructSetData($DATA, 1, Dec(StringMid($OPCODE, ($I - 1) * 2 + 1, 2)), $I)
Next
Local $RESULT, $PROCESS, $ADD, $THREAD
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PID)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($DATA), "int", 4096, "int", 64)
$ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $ADD, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 0)
$RESULT = DllCall("kernel32.dll", "int", "CreateRemoteThread", "int", $PROCESS, "ptr", 0, "int", 0, "int", $ADD, "ptr", 0, "int", 0, "int", 0)
$THREAD = $RESULT[0]
Do
$RESULT = DllCall("kernel32.dll", "int", "WaitForSingleObject", "int", $THREAD, "int", 50)
Until $RESULT[0] <> 258
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $THREAD)
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
$OPCODE = ""
$DATA = 0
EndIf
EndFunc


Примеры Injecting`а

Delphi: (by asgborges)


//************************************************** ***********//
// Select the Moster (Full Target HP)
// OBS: Working well
//************************************************** ***********//
procedure SelectMonster(MonID: PParams); stdcall;
(*
004596AD - a1 dc d1 96 00 - mov eax,[0096d1dc] : 0096D860
004596B2 - 57 - push edi
004596B3 - 8b 48 20 - mov ecx,[eax+20]
004596B6 - 81 c1 ec 00 00 00 - add ecx,000000ec
004596BC - e8 8f c7 14 00 - call 005a5e50
*)
var
P1: DWORD;
begin
P1:=MonID^.Param1;
asm
mov edx, DWORD PTR [$0096d1dc]
push P1
mov ecx, DWORD PTR [edx+$20]
add ecx, $EC
mov edx, $005a5e50
call edx
end;
end;

//************************************************** ***********//
// Fly command
// OBS: Working well
//************************************************** ***********
procedure Fly(aPParams: PParams); stdcall;
(*
0044A926 - 8b 15 dc d1 96 00 - mov edx,[0096d1dc] : 0096D860
0044A92C - 6a 01 - push 01
0044A92E - 51 - push ecx
0044A92F - 8b 4a 20 - mov ecx,[edx+20]
0044A932 - 6a 0c - push 0c
0044A934 - 6a 01 - push 01
0044A936 - 81 c1 ec 00 00 00 - add ecx,000000ec
0044A93C - e8 bf b2 15 00 - call 005a5c00
*)
begin
asm
mov edx, DWORD PTR [$0096d1dc]
push $01
push $31f7
mov ecx, DWORD PTR [edx+$20]
push $0C
push $01
add ecx, $EC
mov edx, $005a5c00
call edx
end;
end;

//************************************************** ***********//
// Pick Items on ground
// OBS: Working... need to stay close of the Item
//************************************************** ***********//
procedure PickItem(aPParams: PParams); stdcall;
(*
00467693 - 8b 15 dc d1 96 00 - mov edx,[0096d1dc] : 0096D860
00467699 - 50 - push eax
0046769A - 51 - push ecx
0046769B - 8b 4a 20 - mov ecx,[edx+20]
0046769E - 81 c1 ec 00 00 00 - add ecx,000000ec
004676A4 - e8 37 e7 13 00 - call 005a5de0
*)
var
Address: pointer;
Pa1,pa2: cardinal;
begin
Pa1:=aPParams^.Param1;
pa2:=aPParams^.Param2;
asm
mov edx, DWORD PTR [$0096d1dc]
push Pa1 // Item SN
push Pa2 // Item ID
mov ecx, DWORD PTR [edx+$20]
add ecx, $EC
mov edx, $005a5de0
call edx
end;
end;


C++ Builder: (adapted to work with PWI)

static DWORD WINAPI SelectMonster(LPCVOID lpParam)
{
//004596AD - a1 dc d1 96 00 - mov eax,[0096d1dc] : 0096D860
//004596B2 - 57 - push edi
//004596B3 - 8b 48 20 - mov ecx,[eax+20]
//004596B6 - 81 c1 ec 00 00 00 - add ecx,000000ec
//004596BC - e8 8f c7 14 00 - call 005a5e50
DWORD BaseAddress= 0x0096d1dc;
DWORD CallAddress= 0x005a5e50;
DWORD MonsterID = (DWORD)lpParam;
__try
{
_asm
{
mov edx, DWORD PTR [BaseAddress]
push MonsterID
mov ecx, DWORD PTR [edx+0x20]
add ecx, 0xEC
mov edx, CallAddress
call edx
}
}
__except(1)
{
}
return 0;
}


AutoIt (Неверное так как "шприц" указан не полностью)

Func SETCURENTMOBID($ID)
_MEMORYWRITE($MOB_ID_ADD, $MEMID, $ID)
If $ID <> 0 Then
$OPCODE = ""
PUSHAD()
MOV_EDX_DWORD_PTR(9875524)
PUSH($ID)
MOV_ECX_DWORD_PTR_EAX_ADD(32)
$OPCODE &= "81c1ec000000"
MOV_EDX(5916464)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PID)
EndIf
EndFunc

________________

Переведено для Zhyk.Ru, по возможности будет исправлятся и дополнятся.
Кооректоры: TBX1n ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Kitsune
16.02.2010, 12:25
Sirioga, уважаемый, вы переводили чем? гуглом? перевод очень разниться с тем, что написано в оригинале. Если вы не владеете технической стороной вопроса, то не надо такие статьи переводить. Сначала надо понять что такое указатели, как хранятся данные в памяти и т.д.

Вот мои дополнения/корректировке к програмной части:
[BA] - базовый адрес

[BA + 1C] - это адрес начала блока игровой сесии, называется по ошибке большинством как тот самый base address. Используется для ботов таких как MHS.
[BA + 1C + 20] - это адрес начала блока информации о персонаже, отсюда находят все основные значения параметров игрока, такие как ману, жизни, таргет и т.д.

Таким образом, в терминах адрес значения HP будет :
[BA] + 0x1C + 0x20 + 0x454, где 0x454 оффсет для моей версии ПВ, в ваших клиентах он может быть другим.

Sirioga
16.02.2010, 12:42
Sirioga, уважаемый, вы переводили чем? гуглом? перевод очень разниться с тем, что написано в оригинале.ваших клиентах он может быть другим.

Переведено пол часа назад ручками, технической стороной вопроса владею, но вот к терминам принятым в русской ветке epvp не привык. Буду рад в помощи устранения ошибок перевода и приведения перевода в более читабельный вид.

АпАпАпчих
17.02.2010, 08:38
Тема стоящая внимания) А нужные оффсеты ковырять через CE? Я читал на форумах взлома pwi про CE, и то что через этот движок можно получить оффсеты. Так ли это и как можно это сделать?

Да и еще вопросик, как допустим ntKid получает базовый адрес? Вероятно ищет окно, получает путь к файлу, лезет в него по какому-нибудь указателю (а значит он статический?), который указывает на Base Adress. Если я ошибаюсь - поправьте, если не ошибаюсь - дайте адрес этого указателя.

За помощь тыкну спасибку =)

Sirioga
17.02.2010, 18:58
Тема стоящая внимания) А нужные оффсеты ковырять через CE? Я читал на форумах взлома pwi про CE, и то что через этот движок можно получить оффсеты. Так ли это и как можно это сделать?

Да и еще вопросик, как допустим ntKid получает базовый адрес? Вероятно ищет окно, получает путь к файлу, лезет в него по какому-нибудь указателю (а значит он статический?), который указывает на Base Adress. Если я ошибаюсь - поправьте, если не ошибаюсь - дайте адрес этого указателя.


Нет такого указателя, там используется несколько другой метод)
а насчёт офсетов...знаешь где More Information находится в СЕ?

АпАпАпчих
17.02.2010, 19:29
Да я уже разобрался, спасибо)

Кстати забыл вопросик один задать.

получится ли использовать следующее:
- Ищем игру
- Открываем память
- Используем процедуру readprocessmemory для получения значения по адресу (базовый адрес + офсет)
- Обрабатывать значение
?

Просто писать не охото если оно не работает.. Если ты знаешь, получится или нет напиши либо тут либо в личку)

Dinmaite
17.02.2010, 19:47
Да я уже разобрался, спасибо)

Кстати забыл вопросик один задать.

получится ли использовать следующее:
- Ищем игру
- Открываем память
- Используем процедуру readprocessmemory для получения значения по адресу (базовый адрес + офсет)
- Обрабатывать значение
?

Просто писать не охото если оно не работает.. Если ты знаешь, получится или нет напиши либо тут либо в личку)

Ну базовый+цепочка офсетов скорее. А вообще получится. Боты так и читают инфу о чаре.

АпАпАпчих
17.02.2010, 20:02
Очень интересно..

ну допустим - базовый адрес 0x000AAAAA
офсет на хп допустим 400 (да и кстати, представление офсета должно быть в какой именно СС? 16 или 10? или не имеет значение?)

Значит надо написать 0x000AAAAA+400? только это больше смахивает на мой предложенный вариант. Если я ошибаюсь, то... как должна выглядеть цепочка офсетов?

Я просто не особо знаком с офсетами, раньше баловался со статическими, с динамикой памятью не баловался, пора уже научиться =)

(пы. сы. Спасибка почему-то недоступна :confused:)
пы. сы язык Delphi.
С++ не установлен у меня.

Dinmaite
17.02.2010, 20:14
СС не имеет значения, цепочка адресов потому что показатели чара находятся через 2 офсета от базового адреса.
[ba]+1c+20+45C - лвл для руофа
код писать лень, поэтому псевдокод)

buf - буфер.
readprocessmemory(дескриптор процесса,[ba],buf,количество байт для чтения, число прочитанных байт)
readprocessmemory(дескриптор процесса,buf+1c,buf,количество байт для чтения, число прочитанных байт)
readprocessmemory(дескриптор процесса,buf+20,buf,количество байт для чтения, число прочитанных байт)
readprocessmemory(дескриптор процесса,buf+45c,buf,количество байт для чтения, число прочитанных байт)
ХП перса := buf.


Спасибка не доступна потому что нет 10 постов.

АпАпАпчих
17.02.2010, 20:18
Супер, спасибо, сейчас попробую написать, о результатах сообщу чуть позже)

Добавлено через 59 минут
var
buf, ba, process, pid: integer;
wr: cardinal;

Begin
if th<>0 then
begin
EnableDebugPrivilege(true);

GetWindowThreadProcessId(th, @pid);
process:=OpenProcess(PROCESS_ALL_ACCESS, false, pid);

ba:=10007676; {базовый адрес в 10СС, получил при помощи [MHS-RETRIEVER].exe}
if process<>0 then
begin
readprocessmemory(process, ptr(ba), @buf, sizeof(buf), wr);
readprocessmemory(process, ptr(buf+$1c), @buf, sizeof(buf), wr);
readprocessmemory(process, ptr(buf+$20), @buf, sizeof(buf), wr);
readprocessmemory(process, ptr(buf+$45c), @buf, sizeof(buf), wr);
p_lvl_inf.Caption := 'Уровень: ' + inttostr(buf);
CloseHandle(process);
end;
end;
end;

Написал кодик, странно, но выдает не лвл, а число 70386754. Причем постоянно это число. Где я мог напортачить?

th - хендл окна

Dinmaite
19.02.2010, 10:32
Написал кодик, странно, но выдает не лвл, а число 70386754. Причем постоянно это число. Где я мог напортачить?
th - хендл окна

Мы с тобой говорим о разных "базовых" адресах, [MHS-RETRIEVER] находит
- начало блока игровой сесии, Реальный базовый адрес для офа на данный момент времени [B]98addc.
Поэтому для того что бы найти уровень верно, нужно либо задавать реальный базовый либо убрать из кода строку

readprocessmemory(process, ptr(buf+$1c), @buf, sizeof(buf), wr);

АпАпАпчих
19.02.2010, 11:48
ах вот оно как) теперь всё работает)

krukovis
12.06.2010, 16:35
Так что же это такое - Injection Codes ? Способ получить информацию о персе?
В последних настройках MHS-Bot появилась строка Base_Inject=10005980 - можете пояснить что это за параметр?

Kitsune
12.06.2010, 16:43
krukovis,
1. Injection Codes - инъекция своего года в запущенный процес и непосредственно выполнение его там.
2. Адрес инжекта функции простой атаки.
3. Вопросы связанные с ботом задавайте в соответствующей теме.

Maty
09.08.2010, 21:27
Последний код работает на чтение. И путем несложных манипуляций можно основные числовые параметры достать. А где найти Имя себя и свой клан? по каким адресам?

Dinmaite
09.08.2010, 21:50
Последний код работает на чтение. И путем несложных манипуляций можно основные числовые параметры достать. А где найти Имя себя и свой клан? по каким адресам?

Как говорится СЕ в помощь. Мы ведь совсем не телепаты что бы знать хотя бы о каком сервере выведете речь.
Ищите указатели на строки имени/клана в памяти клиента.

Да и если захотите продолжить обсуждение этого вопроса задавайте его в другой теме, все же чтение из памяти и инжекты в память немного разные вещи.

Sirioga
09.08.2010, 23:24
Ищите указатели на строки имени/клана в памяти клиента.


Не забудьте установить флажок на Unicode, если используете CE, как в других подобных программах, я хз.

Maty
10.08.2010, 11:52
Не забудьте установить флажок на Unicode, если используете CE, как в других подобных программах, я хз.

Ищется легко в СЕ, но адреса понятно, что разные и строк порой до нескольких десятков.
Понимаю, что тема посвящена инекциям, но полностью все таки не доконца открыта.
Вопросы все таки для руофа остались - постоянный оффсет для параметров (параметров много и разных), и оффсеты для действий.
Или ботописатели все таки самостоятельно и только для себя находят таблицы оффестов и сами ею же пользуются. Фактически все выложенные тут боты - это движок один, а матемотическое моделирование поведения разное и зависит только от фантазии автора.

Dinmaite
10.08.2010, 14:05
Maty, я не могу понять чего Вы хотите, да строк десяток, но по постоянному пути их 2-3. Тема посвящена принципу инжектирования кода, и раскрыта полностью.
Ботописатели в основном все офсеты ищут сами, потому как это позволяет "ближе" общаться с клиентом. То же касается и функций инжекта.
Я не понимаю что вы имеете ввиду под движком бота если честно.
И опять же, если у вас есть вопросы - задавайте их в разделе "общение".

Maty
10.08.2010, 21:26
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
прошу прощения модераторов. Но тема интересует именно пока эта. Т.к. до функций инжекта еще дойдем, надо пока поковырять - с чем имеем дело. А именно все переменные которые мы можем вытащить из ПВ.
А темы такой не нашел. Ткнул свой вопрос в общение.

ЗЫ. А собсна ту то остался единственный вопрос - оффсет "Свое имя" и "Наименование клана" на руофф клиенте.

bespaniki
12.08.2010, 17:32
Здравствуйте, да руководство действительно полезное, особенно мне понравилось про реальный ВА (теперь может всетаки удастся найти оффсет на ХП питомца :rolleyeyes:)
Но меня интересует вот что... как самому создавать "шприцы" ? например на руоффе в PW client 130 версии при таргете моба происходит вот это (см картинку). вот как зная это сделать "шприц" ? реальный ВА нашел - 98ADDC. Буду очень благодарен за информативный ответ.

Dinmaite
12.08.2010, 20:24
это не верная функция, если мне память не изменяет.

Sirioga
13.08.2010, 08:52
на руоффе в PW client 130 версии при таргете моба происходит вот это (см картинку). вот как зная это сделать "шприц"?

Я что-то не совсем понял, при таргете моба это после таргета или до?
Попробуй смотреть, на доступ к реальному BA (Find out what accesses to this address). Да и еще, что ты хочешь сделать?

bespaniki
16.08.2010, 08:25
сделать хочу "правильный" таргет моба, чтоб ХП выделялось и не было "неверная цель". То что на картинке происходит если выбрать "Find out what writes to this address" адрес выбирал тот куда записывается ИД моба. раньше было достаточно в эту ячейку записать ИД моба и все работало нормально, но теперь моб выделяется но стукнуть по нему нельзя...:sad: Может уже есть готовое решение этой проблемы? Если нет то хотелось бы както совместными стараниями ее решить :pif:

Kitsune
16.08.2010, 09:49
Код инжекта: (асм вставка для делфи)

asm
pushad
mov ecx,dword ptr [BaseCallAddress] // BA
mov ecx,dword ptr [ecx+$20]
add ecx,$ec
mov eax, TargetParam // id цели
push eax
mov edx, Address // адрес инжекта функции селекта.
call edx
popad
end;

bespaniki
16.08.2010, 12:58
Код инжекта: (асм вставка для делфи)

asm
pushad
mov ecx,dword ptr [BaseCallAddress] // BA
mov ecx,dword ptr [ecx+$20]
add ecx,$ec
mov eax, TargetParam // id цели
push eax
mov edx, Address // адрес инжекта функции селекта.
call edx
popad
end;

:) спасибо, вечерком попробую приспособить для autoit, но всеже как самому выдумывать такое, используя СЕ или без детального изучения ассемблеровских комманд тут не обойтись? :notme:

Kitsune
16.08.2010, 13:02
bespaniki, для инжектов нужны знания АСМа + умение пользоватся дебагером.

bespaniki
16.08.2010, 13:08
А к стати, никто не знает где надыбать исходники от pwmakros и zPW1.26 ? Первый ну очень интересен... а во втором хочется подглядеть как определять координаты моба (тогда можно будет сделать "умный подбор лута" т.е. запомнить где моб коньки откинул, туда подбежать и тама собрать хлам)

Добавлено через 2 минуты
bespaniki, для инжектов нужны знания АСМа + умение пользоватся дебагером.
Ну чтож, будем изучать :pandal: потому как интересное это дело :info:

Dinmaite
16.08.2010, 13:54
а во втором хочется подглядеть как определять координаты моба (тогда можно будет сделать "умный подбор лута" т.е. запомнить где моб коньки откинул, туда подбежать и тама собрать хлам)


Координаты моба хранится в моблисте - массиве данных о окружающих вас мобах в количестве не более 728 единиц.

Greens
21.09.2010, 11:26
Я вот только одного не могу понять-как можно вычислить динамический адрес ячейки в памяти по формуле,состоящей из статических данных?

Dinmaite
21.09.2010, 11:46
Гринс, я не совсем понял твой вопрос (точнее понял но хотелось бы уточнить), если есть желание напиши мне в асю, номер в профиле.

krysun
10.03.2011, 01:39
"Данные о мобах в моб листе".
- Где найти моб лист?

Kitsune
10.03.2011, 02:09
krysun, в оффсетах.

Proger1983
13.04.2011, 08:08
Народ, а никто не находил кода для вставания персом после смерти и на логин?

Sirioga
13.04.2011, 09:08
Народ, а никто не находил кода для вставания персом после смерти и на логин?

Вот посмотри замечательную тему ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) от Dinmaite. Может в ней найдёшь то, что тебя интересует.

wajskopf
15.01.2012, 08:31
Может кто-нибудь перевести функцию инжекта от asborges в Delphi перевести в С++? я че то голову сломал от всех этих указателей на указатели((

quqa14
15.01.2012, 08:54
Последний код работает на чтение. И путем манипуляций можно основные числовые параметры найти. А где найти имя себя и свой клан?

fullzero
05.05.2012, 09:23
Таким образом, в терминах адрес значения HP будет :
[BA] + 0x1C + 0x20 + 0x454, где 0x454 оффсет для моей версии ПВ, в ваших клиентах он может быть другим.

Привет. Подскажи как правильно записать оффсет для хп только под AutoIt. Вот мой кусочек кода, только не могу понять как правильно записать оффсет. Извини за беспокойство :sceptic:

$HP = ;[BA] + 0x1C + 0x20 + 0x454
$memory = _MemoryOpen(ProcessExists("elementclient.exe"))
$result1 = _MemoryRead($HP, $memory)

Smertig
05.05.2012, 09:55
fullzero, /facepalm
$hp = _memoryread(_memoryread(_memoryread(_memoryopen($b a, $memory) + 0x1C, $memory) + 0x20, $memory)+0x454, $memory)

Добавлено через 6 минут
То есть сначала читается память из ВА
$1 = _memoryread($ba, $memory)
потом к этому прибавляется первое смещение и оттуда память читается
$2 = _memoryread($1 + 0x1C, $memory)
и так далее
$3 = _memoryread($2 + 0x20, $memory)
$hp = _memoryread($3 + 0x454, $memory)

fullzero
05.05.2012, 10:28
Smertig, спасибо, буду экспериментировать.
$hp = _memoryread(_memoryread(_memoryread(_memoryopen($b a, $memory) + 0x1C, $memory) + 0x20, $memory)+0x454, $memory)

Опечатка /problem

[[[[BA] +1C] +34] +454] - Теперь работает, спасибо ещё раз.

MReader
06.01.2013, 21:39
У меня вопрос, по инжекту. т.е. все как положено, по теме.
Я понимаю принцип инжекта, и все что касается адресации памяти.
Но мне не совсем понятно - где взять кусок ассемблерного кода который требуется потом пихать в процесс?
Почитал тему - появилась гипотеза, когда ставим брекпоинт в СЕ, то когда открываем окошко с подробностями там кусок нужного нам кода и пихать его следует по тому адресу что там указан, первый адрес из столбца адресов слева, адрес инструкции если я верно ее обозвал. или по базовому адресу?
например: атака. есть адрес ячейки которая хранит 0 если перс ничего не делает и 1 если атакует, ставим брекпоинт, атакуем, видим инструкцию отрабатывающую по данному адресу и кусок ассемблерного кода, как поступаем далее?

Sirioga
08.01.2013, 14:12
У меня вопрос, по инжекту. т.е. все как положено, по теме.
Но тем не менее, отправлю вас в другую тему ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) :)
Dinmaite ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) раскрыл в ней всё, что нужно для поиска и составления инжекта.