Rus. server

12/09/2009 19:01 sioli#871
Quote:
Ну как раз это не проблема того человека. Тогда хотя бы в нагрузку ещё профессию человека храни. А иначе пойдут у вас проблемы с необоснованными сливами.
храню

Quote:
У нас тоже. Добавляют туда люди на свой страх и риск, в случае выставления претензий от слитых и разборок у нас на сайте клан наших не пожалеет за такие проделки. Однако люди осознают всё сами. И проблем с этим пока что не было.
я хочу чтоб программа гарантироваано работала одинаково у всех людей.

Quote:
А ты уверен на счёт моей гильдии? Ты наверное даже не знаешь на каком я сервере играю. Судя по твоим примерам - ты с Ориона, я там чара забросил 1,5 года назад примерно и играю совсем на другом сервере.
Мне доводилось видеть на орионе эксельку статистики с твоей программы.
И откуда у тебя уверенность на счёт моего пола? :)

Quote:
Ну начать с того, что программа вобще даётся лишь тем членам ГИ, которые заслуживают доверия и понимают что к чему. Светить лишний раз эту вещь никто не собирается, т.к. уже напарывались у себя и на шпионов из вражьих в кланов. Так что не все в клане в курсе о её существовании.
А что полезного в этой программке для шпионов? В моем случае я не пишу в клиент ничего, таким образом "поймать" меня со стороны сервера можно только по спец логам от клиента, а админам их проверять некогда и лень, даже если "очень попросят".
доказать пользование этой программкой со стороны пользователя нереально.
12/09/2009 23:12 AlexGD#872
Quote:
Originally Posted by dwar View Post
Что касается сбора реса не посредством инжекта, то здесь тоже ошибка, идущая с самых начал, когда было написано, что для этого надо выбрать действительную цель, атаковать ее, потом быстро переписать id цели на id реса и чар побежит копать (неужели такое у кого-то получалось)…
Подожди-ка ;) Я этого не писал, мужик не писал - откуда идея про
Quote:
выбрать действительную цель, атаковать ее, потом быстро переписать id цели на id реса и чар побежит копать
?

Кстати, это получилось у создателей ботпиратес ;) Именно об этом я говорил, когда намекал нафига самую дальнюю цель он выбирает.
12/09/2009 23:20 AlexGD#873
Во флейм пошел... Кстати, не щимит локатор всему клану без разбору раздавать? Кто-нить сольет разрабам - весь клан под нож пустят. Без права выхода ;)
12/09/2009 23:26 AlexGD#874
Тоже занимаюсь сейчас разработкой локатора. В первичном варианте есть (уже с преследованием даже), но хочу довести идею до автомата... Регается твинк-сид. Подвешивается на него прога с автоапдейтом листа с сервака и асько-пингером. + складываем все обнаружения в базу... И по маршруту облетает всю карту круглосуточно. Составляем график появлений и вырезаем по графику...

Как хорошо звучит и сколько еще над этим работы...
12/10/2009 04:40 sioli#875
Quote:
Originally Posted by AlexGD View Post
Во флейм пошел... Кстати, не щимит локатор всему клану без разбору раздавать? Кто-нить сольет разрабам - весь клан под нож пустят. Без права выхода ;)
А как они докажут что мембер клана использовал? Банить целый клан не станут. Доказывать отдельно - лень.
Тот же флай/джамп хак от Саурона давно слит админам, а его до сих пор тонна народу юзает и в бан попадают только по скринам с использованием хака.
В случае с моим локатором скринить нечего. Он ничего не будет писать в клиент, а за чтение с памяти банить нельзя - те же антивирусы периодически читают память, да и не только они.


А теперь ближе к теме, благодаря моему другу мне таки удалось вставить мозги как находить адреса (за что ему огромное спасибо). Совместными усилиями гильдии были покорены.

Массивчик ближайших гильдий (или как то так :) )
00976B1C + 1b4 + 8 + i*4 + 8 +
0 (4b) ID гильдии, можно сверять с тем какое в структуре персонажа.
4+0 (char) Название гильдии, собственно то, что было мне надо :)
12/10/2009 05:40 dj_al#876
Небольшие дополнения по массиву гильдий:
00976B1C + 1b4 + 4 - количество ГИ в массиве
00976B1C + 1b4 + 8 + i*4 + 4 - тут ещё раз код ГИ
00976B1C + 1b4 + 8 + i*4 + 8 + 8 - тут лвл клана

Массив не то что ближайших ГИ. Иногда бывают проблемки, когда человек с ГИ стоит рядом, над ним светится название его ГИ, однако в массиве данных по ГИ нету. Подгружается в массив информация судя по опыту как-то не равномерно. Иногда вобще почти пусто там, а иногда сразу чуть ли не все ГИ.

Quote:
Originally Posted by sioli View Post
Мне доводилось видеть на орионе эксельку статистики с твоей программы.
Ну для Ориона моей статистики 100% быть не может. :) За распространением программы слежу. Есть завязки на сервер и клан внутри программы, так что даже если она утечёт, чужие воспользоваться не смогут (если только ломать будут).

Может кто-то ещё такое написал - идея то на поверхности лежит. Ссылку на статистику кинь, если не сложно. Мне интересно глянуть, на сколько на моё похоже.

Quote:
Originally Posted by sioli View Post
И откуда у тебя уверенность на счёт моего пола? :)
:) Тогда я знаю кем ты играешь и в какой ГИ.
12/10/2009 09:58 origmas#877
Quote:
Originally Posted by muzhig View Post
AlexGD, про подмену адресов
Тоже работаю с подменой адресов - пробывал в прицел ставить ID лута и ресов - не реагирует, видимо для лута - есть еще своя мишеь для реса своя - потомучто как только мы ловим в прицел монстра - сразу клиент выводит окно с его HP .. а когда кликаем по ресам и луту - окно не выводится, так-же и с NPC. Если правильно создавать условия каких либо событий - эти события (движение, разговор с NPS и пр.) будут происходить логично для клиента, а когда мы заставляем клиент это делать насильно инжектом - происходит сбой логики его работы и конфликты со стеком и памятью .. Короче много чего надо еще копать ..

Quote:
Originally Posted by muzhig View Post
Element Client вылетает с ошибкой.
при инжекте мы передаем параметры, но запускаемая функция (Call ..) проверяет флаги состояний и может отказать или работать - дело на авось .. Наверное нужно и флаги состояний менять .. это уже эмуляция работы целого блока процедур.
Даже если мы научимся создавать условия для работы инжектируемой нами функции и править какие-то флаги состояния программы клиента и/или процессора - не вопрос, что другая функция - проверит измененное нами условие или флаг и для нее (и возможно клиента) это будет критичным ..

Наверное это тоже бред ..))
12/10/2009 09:58 deichstraЯe#878
is das nich nen deutsches forum? OoO
12/10/2009 17:24 AlexGD#879
Блин и что я тут СУБДшник делаю? На что руку поднял-то? ЭхЪ. Тонкие материи. *начинает отчаиваться

Блин, ну не может же так быть, что у китаёз дженерал-аттак вызывается одной строчкой асма, а у нас кучей...

Есть у кого азиатский elementclient.exe?
12/10/2009 17:58 sioli#880
я не отчаиваюсь :) что хочу - то сделаю. Уже активно доделываю свой локатор, людски оборачивая все вызовы.

По вопросам инджекта - надо просто грамотный дисассемблер, потом отделить функции и понять их параметры.
Дальше все станет намного проще.
12/10/2009 19:05 origmas#881
а вот (архив ниже) первый сырой проход декомпилятором Бота - Пиратес - может можно что тут понять ..
Декомпилировал с диска .. так что это не отображение в памяти .. к сожалению, но процедуры видимо не отличаются по содержанию как на диске и в RAM ..
С .. файл лучше смотреть в VC++ или в редакторе Borland.

много вставок Ассемблерного кода в листинге - видимо для вычислений ..
что то не видно явного инжекта .. может и нету ??? ..))


например ..

__asm
{
fld [esp+14h+var_14]
fld tbyte_40F1F4
fcompp st(1), st
fstsw ax
sahf
}


эта функция интересная -

//----- (004F64DC) --------------------------------------------------------
int __usercall sub_4F64DC<eax>(unsigned int a1<eax>, DWORD a2<ecx>)
{
unsigned int v2; // ebx@1
int result; // eax@10
DWORD ThreadId; // [sp+0h] [bp-8h]@1

ThreadId = a2;
v2 = a1;
byte_51A0F4[a1] = 1;
byte_51A150[a1] = 0;
dword_51A044[a1] = sub_423E80((int)off_41E9EC, 1);
dword_51A054[v2] = sub_423E80((int)off_41E9EC, 1);
byte_51A0FC[v2] = 0;
Sleep_1(0x32u);
if ( v2 < 1 )
{
*(&dword_51A08C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A07C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0D4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0E4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A09C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0AC + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
dword_51A0BC[v2] = System__BeginThread(0, 0, &ThreadId, 0, 0);
}
else
{
switch ( v2 )
{
case 1u:
*(&dword_51A08C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A07C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0D4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0E4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A09C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0AC + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
dword_51A0BC[v2] = System__BeginThread(0, 0, &ThreadId, 0, 0);
break;
case 2u:
*(&dword_51A08C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A07C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0D4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0E4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A09C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0AC + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
dword_51A0BC[v2] = System__BeginThread(0, 0, &ThreadId, 0, 0);
break;
case 3u:
*(&dword_51A08C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A07C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0D4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0E4 + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A09C + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
*(&dword_51A0AC + v2) = (HANDLE)System__BeginThread(0, 0, &ThreadId, 0, 0);
dword_51A0BC[v2] = System__BeginThread(0, 0, &ThreadId, 0, 0);
break;
}
}
Sleep_1(0x32u);
return result;
}


------------------------------------------------------

а тут явная пересылка данных в памяти клиента ..

ReadProcessMemory(*(&hProcess + a1), (LPCVOID)*off_5130E0, &Buffer, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(Buffer + *off_5136D0), &Buffer, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(Buffer + *off_513588), &Buffer, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(Buffer + *off_5131BC), &Buffer, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(Buffer + *off_5134E4), &Buffer, 4u, &NumberOfBytesRead);
v9 = Buffer;
WriteProcessMemory(*(&hProcess + v3), (LPVOID)(Buffer + *(_DWORD *)off_513124), &v5, 1u, &NumberOfBytesRead);
WriteProcessMemory(*(&hProcess + v3), (LPVOID)(Buffer + *off_5131F4), &a4, 4u, &NumberOfBytesRead);
WriteProcessMemory(*(&hProcess + v3), (LPVOID)(Buffer + *off_513110), &a3, 4u, &NumberOfBytesRead);
WriteProcessMemory(*(&hProcess + v3), (LPVOID)(Buffer + *off_5136A0), &v6, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)*off_5130E0, &v10, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(v10 + *off_5136D0), &v10, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(v10 + *off_513588), &v10, 4u, &NumberOfBytesRead);
WriteProcessMemory(*(&hProcess + v3), (LPVOID)(v10 + *off_51300C), &v7, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)*off_5130E0, &v10, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(v10 + *off_5136D0), &v10, 4u, &NumberOfBytesRead);
ReadProcessMemory(*(&hProcess + v3), (LPCVOID)(v10 + *off_513588), &v10, 4u, &NumberOfBytesRead);
WriteProcessMemory(*(&hProcess + v3), (LPVOID)(v10 + *off_513838), &v9, 4u, &NumberOfBytesRead);
12/10/2009 22:53 silkytail#882
Декомпилировать бота, написанного на автоите по результатам декомпилирования клиента для того, чтобы написать своего бота - помоему верх идиотизма :)
12/11/2009 00:07 origmas#883
Quote:
Originally Posted by silkytail View Post
Декомпилировать бота, написанного на автоите по результатам декомпилирования клиента для того, чтобы написать своего бота - помоему верх идиотизма :)
для того чтобы знать правильной-ли дорогой ты идешь - можно и посмотреть на карту .. не обязательно ломиться через кусты ..

по твоему получается что исследование кода c помощью Cheat Engine - это еще только так ... ПОЛУ-идиотское занятие ..

ты считаешь, что Пиратес написан на Автоите ?
12/11/2009 00:54 sioli#884
Quote:
Originally Posted by dj_al View Post
Небольшие дополнения по массиву гильдий:
00976B1C + 1b4 + 4 - количество ГИ в массиве
00976B1C + 1b4 + 8 + i*4 + 4 - тут ещё раз код ГИ
00976B1C + 1b4 + 8 + i*4 + 8 + 8 - тут лвл клана

Массив не то что ближайших ГИ. Иногда бывают проблемки, когда человек с ГИ стоит рядом, над ним светится название его ГИ, однако в массиве данных по ГИ нету. Подгружается в массив информация судя по опыту как-то не равномерно. Иногда вобще почти пусто там, а иногда сразу чуть ли не все ГИ.
Да, были проблемы, но они не устояли :p

Вот так я сейчас достаю полный список гильдий

$00976B1C + $1b4 + 8 + i*4 {+0}^j + 8 +
0 - Id гильдии
4 + 0 - Название гильдии

{+0}^j означает закладку в связанном списке.
например:
j = 0 ==> $00976B1C + $1b4 + 8 + i*4 + 8 +
j = 1 ==> $00976B1C + $1b4 + 8 + i*4 +0 + 8 +
j = 2 ==> $00976B1C + $1b4 + 8 + i*4 +0 + 0 + 8 +
j = 3 ==> $00976B1C + $1b4 + 8 + i*4 +0 + 0 + 0 + 8 +
Количество списков не в курсе. Дополнения приветствуются.

Кусок кода с моего локатора:
Code:
procedure guildNameFill(handle:cardinal; var pl:Players);
var
  offset:cardinal;
  ga:TStrings;
  i,j:integer;
  rb:cardinal;
  Hp:cardinal;
  guildOff:string;
  ca:array[0..64] of char;
  sw:string;
  PagesShift:string;
begin
  ga:=TStringList.Create;
PagesShift:='';
for j:=0 to 3 do
begin
  for i:=0 to maxValues do
  begin
    offset := GetPointer(Handle,BaseAddress+'+$1b4+8+'+IntToStr(i*4)+PagesShift+'+8');
    guildOff := IntToStr(offset);
    offset:=GetPointer(Handle,guildOff+'+0');
    if offset=0 then Continue;
    ReadProcessMemory(Handle, ptr(offset), @hp, 4, rb);
    if (hp=0) or (hp>20000) then continue;
    offset:=GetPointer(Handle,guildOff+'+4+0');
    ReadProcessMemory(Handle, ptr(offset), @ca, 64, rb);
    sw:=WideCharToString(pwidechar(@ca[0]));
    if ga.IndexOfObject(TObject(hp))=-1 then ga.AddObject(sw,TObject(hp));
  end;
PagesShift:=PagesShift+'+0';
end;

  for i:=0 to pl.actualSize-1 do
  begin
    j := ga.IndexOfObject(TObject(pl.data[i].guildId));
    if j=-1 then pl.data[i].guild:=''
            else pl.data[i].guild:=ga.Strings[j];
  end;
  ga.Free;
end;
P.S. к коду сильно не придирайтесь ;)
12/11/2009 01:29 muchenberg#885
botpirates написан на дельфях.
А вот декомпиляция - это довольно забавное дело.
Я конечно может и человек старой школы..

Но ollydbg рулил и будет рулить :rtfm:
А декомпиляторы и чит энжины.. :rolleyes:

Помнится хотел декомпильнуть собственную прожку.. так этот декомпилер мне такого насрал.. :confused::confused::confused:

Если-бы я незнал в чём заключается смысл её работы и невидел-бы кода, я бы вряд-ли разобрался что к чему. :rolleyes:

Вообще я до сих пор удивляюсь.. движок в нескольких местах вполне открыто передаёт информацию, а вы до сих пор читаете непонятные адреса, делаете таблицы смещений.. короче шелуха полная..
Даю подсказку - не зря-же есть pak файлы, с переводом строк на язык ;)
Это например раз..

По поводу выделения моба - нужны viewangles и координаты моба. Прокалькулировать разницу углов, далее аля-аимботом вывести моба по ПКМ на центр и ЛКМ кликнуть по центру. Вот вам и приближение к реальному персу. А не просто селект во все стороны.
Можете кинуть помидором, но я, да и не только я, такое делал - хотя бы мозги размять хорошо.