Rus. server

12/19/2009 23:45 moob1#1051
Quote:
Originally Posted by silkytail View Post
лолчитс такой лолчитс
Ты прав :)

:handsdown::handsdown::handsdown:
12/20/2009 01:23 obiov#1052
FLY_CALL =$0044BE90;

Народ кто нибудь сделал покупку? Структура функции продажи и покупки практически одинаковы, подготовка тоже должна быть похожа - продажа идет покупка нет(. Отличаются ID вещей в рюкзаке и у продавца? Вроде не должны).
Если есть проверенная функция продажи - выложите, пожалуйста)
12/20/2009 03:51 dwar#1053
Quote:
Пацаны прикиньте черти с ач взяли и с моего кряка копирайты убрали и запостили там . )))
Пора уже "копирайты" вешать на каждый байт... или патент оформить на инъекцию и каждый раз продавать базовые адреса и адреса вызываемых функций, а на тех, кто незаконно использует, подавать в суд. Конечно же, еще обязательно на каждом доступном форуме большими буквами указывать "Афтор я"

Quote:
Отличаются ID вещей в рюкзаке и у продавца
нет. функция покупки и продажи работают одинаково
12/20/2009 04:58 AlexGD#1054
Повелся, я братцы на китайцу злого... Решил заюзать функцию автоматического поиска офсетов (исходник тут пробегал). И каааааак получил геморою полные штаны... китайёза видать на совсем древнем чем-то пишет. Причем таком древнем, что у него string еще не знает о zero-terminated строках.

Гемороился я со строками всю ночь. Плюнул. И за пару часов сделал поиск по байтам.

Версия переделанная и дополненная мультипоиском (а не токма вывалом по первому найденному).

Code:
type
  TaArrayOfByte = array of Byte;

type
  TaArrayOfCardinal = array of Cardinal;

    function HexStringToBytes(aString: string): TaArrayOfByte;
    function StreamPos(aStream: TStream; aNeedle: array of Byte): TaArrayOfCardinal;
    function HexRead(aStream: TStream; s: DWORD; b: byte): Cardinal;

// ######################################################################
// ### Procedures for getting inject calls addresses
// ### BOF
// ######################################################################

function TaPWT.HexStringToBytes(aString: string): TaArrayOfByte;
var
  i: integer;
begin
  SetLength(Result, Round(Length(aString) / 2));
  for i := 1 to Round(Length(aString) / 2) do
  begin
    Result[i - 1] := StrToInt('0x' + Copy(aString, i * 2 - 1, 2));
  end;
end;

function TaPWT.StreamPos(aStream: TStream; aNeedle: array of Byte): TaArrayOfCardinal;
var
  i, j, aCounter: integer;
  aSource: array of Byte;
  aResults: array[1..1024] of Cardinal;
begin
  SetLength(aSource, aStream.Size);
  aStream.ReadBuffer(Pointer(aSource)^, aStream.Size);
  aCounter := 0;
  for i := 0 to aStream.Size - Length(aNeedle) - 1 do
  begin
    for j := 0 to Length(aNeedle) - 1 do
      if aSource[i + j] <> aNeedle[j] then
        break;
    if j >= Length(aNeedle) then
    begin
      Inc(aCounter);
      aResults[aCounter] := i;
      if aCounter >= 1024  then
        break;
    end;
  end;
  SetLength(Result, aCounter);
  for i := 0 to aCounter - 1 do
  begin
    Result[i] := aResults[i + 1];
  end;
    
  Finalize(aSource);
  aStream.Seek(0, soBeginning);
end;

function TaPWT.HexRead(aStream: TStream; s: DWORD; b: byte): Cardinal;
var
  d: DWORD;
begin
  aStream.Seek(s, soBeginning);
  aStream.Read(d, b);
  Result := d;
  aStream.Seek(0, soBeginning);
end;

// ######################################################################
// ### Procedures for getting inject calls addresses
// ### EOF
// ######################################################################


procedure TMainSettingsForm.Button4Click(Sender: TObject);
var
  aFile: TFileStream;
  aAddresses: TaArrayOfCardinal;
  Code: string;
  i: integer;
begin
  aFile := TFileStream.Create(EditElementClientPath.Text, fmShareDenyNone);
  Code := '81EC0008000033D2568BB4240C0800';

  aAddresses := aPWT.StreamPos(aFile, aPWT.HexStringToBytes(Code));
  if Length(aAddresses) = 0 then
    Memo1.Lines.Add('Not found!')
  else
    for i := 0 to Length(aAddresses) - 1 do
      Memo1.Lines.Add('Found pointer: ' + IntToHex(aPWT.HexRead(aFile, aAddresses[i] - $4, 4), 8) + ' at ' + IntToHex(aAddresses[i], 8));
  aFile.Free;
end;
12/20/2009 05:38 AlexGD#1055
Глупая и несерьезная...

Просто ты не туда роешь. Все можно и на автоите реализовать. Попробуй с малого - инжектни general_attack. То бишь:
1. Нарисуй на форме бота кнопочку.
2. Навесь на нее инжект.
3. Зайди в игру.
4. Запусти бота.
5. Возьми в игре кого-нить в таргет.
6. Тыркни в боте на кнопку атаки.

Если все пройдет удачно - повторяй с остальными вызовами.

Дык, а если еще вместо плача Ярославны будешь конкретные наводящие вопросы задавать - так есть огромная вероятность, что беде еще и помогут с тем, где именно ты набагал. Ну это так - лирическое отступление ;)
12/20/2009 06:45 Novohyd#1056
последняя попытка была такой
Quote:
Func SETCURENTMOBID($ID)
_MemoryWrite($OFFSET_TARGET, $PROCESS, "0x" & hex($ID))
If $ID <> 0 Then
$OPCODE = ""
PUSHAD()
MOV_EDX_DWORD_PTR(10007676)

MOV_ECX_DWORD_PTR_EAX_ADD(32)
$OPCODE &= "81c1ec000000"
PUSH($ID)
MOV_EDX(5995376)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PROCESS)
EndIf
EndFunc
12/20/2009 06:58 Novohyd#1057
Изначально был такой вариант
Quote:
Func SETCURENTMOBID($ID)
_MEMORYWRITE($MOB_ID_ADD, $PROCESS, $ID)
If $ID <> 0 Then
$OPCODE = ""
PUSHAD()
MOV_EDX_DWORD_PTR(10007676)
PUSH($ID)
MOV_ECX_DWORD_PTR_EAX_ADD(32)
$OPCODE &= "81c1ec000000"
MOV_EDX(6136896)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PROCESS)
EndIf
EndFunc
ассемблерные функции из autogeo
12/20/2009 10:04 moob1#1058
Quote:
Originally Posted by obiov View Post
FLY_CALL =$0044BE90;

Народ кто нибудь сделал покупку? Структура функции продажи и покупки практически одинаковы, подготовка тоже должна быть похожа - продажа идет покупка нет(. Отличаются ID вещей в рюкзаке и у продавца? Вроде не должны).
Если есть проверенная функция продажи - выложите, пожалуйста)
Это реализуетцо на стороне сервера .
Так что ты не сможешь хакнуть кота ))

Либо npc торговца .

Хотя чем черт не шутит )
12/20/2009 10:49 AlexGD#1059
2Novohyd:

Code:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ Target inject
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure Target(aPParams: PParams); Stdcall;
var
  TargetParam: DWORD;
  Address: Pointer;
begin
  TargetParam := aPParams^.Param1; // target ID PW_Target_Call
  Address := Pointer(PW_Target_Call);
  asm
    pushad
      mov ecx,dword ptr [PW_Base_Call]
      mov ecx,dword ptr [ecx+$20]
      add ecx,$ec
      mov eax, TargetParam
      push eax
      mov edx, Address
      call edx
    popad
  end
end;
Это - работает. Переведи на автоит ;)
12/20/2009 10:56 moob1#1060
Quote:
Originally Posted by AlexGD View Post
2Novohyd:

Code:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ Target inject
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure Target(aPParams: PParams); Stdcall;
var
  TargetParam: DWORD;
  Address: Pointer;
begin
  TargetParam := aPParams^.Param1; // target ID PW_Target_Call
  Address := Pointer(PW_Target_Call);
  asm
    pushad
      mov ecx,dword ptr [PW_Base_Call]
      mov ecx,dword ptr [ecx+$20]
      add ecx,$ec
      mov eax, TargetParam
      push eax
      mov edx, Address
      call edx
    popad
  end
end;
Это - работает. Переведи на автоит ;)
Да лана зачем те авто пиши прям так :)
12/20/2009 13:13 origmas#1061
Quote:
Originally Posted by Novohyd View Post
Код в инжект получается такой: 608B0D620000008B491483C100000000B84043108050BA0500 0000FFD261 для ID $80104340
$OPCODE не правильно формируется попробуй не передавать в параметрах Ассембл. функций - вычисляемое значение (Dec(...)), а вычисли его заранее или пиши сразу Дес.число.
Потом - чеж - не кончается инжектируемый код банальной командой "C3" - RET() а в листинге она у тебя стоит.
12/20/2009 13:25 Novohyd#1062
Quote:
Originally Posted by origmas View Post
$OPCODE не правильно формируется попробуй не передавать в параметрах Ассембл. функций - вычисляемое значение (Dec(...)), а вычисли его заранее или пиши сразу Дес.число.
Потом - чеж - не кончается инжектируемый код банальной командой "C3" - RET() а в листинге она у тебя стоит.
608B0DDCAD98008B492083C1EC000000B84043108050BA707B 5B00FFD261C3
если сразу в десятичной писать, получается такой код.
в какой проге из HEXа в ассемблер перевести можно отдельную строчку?
12/20/2009 13:36 origmas#1063
Quote:
Originally Posted by Novohyd View Post
608B0DDCAD98008B492083C1EC000000B84043108050BA707B 5B00FFD261C3
если сразу в десятичной писать, получается такой код.
в какой проге из HEXа в ассемблер перевести можно отдельную строчку?
дизаассемблером ким-нить или в отладчике где можно вставлять коды а не команды .. щас на вскидку не помню ..

короч тебе теперь надо посмотреть какой Асс-код получится из этих Оп-кодов - если так как ты затеял - то все ОК ..
12/20/2009 13:41 Novohyd#1064
Расписал все по командам как код составляется. Может команды использовать по-другому
Quote:
$OPCODE = ""
PUSHAD()
; $OPCODE = $OPCODE & "60"
MOV_ECX_DWORD_PTR(10005980)
; $OPCODE = $OPCODE & "8B0D" & INT2HEX($I, 8)
MOV_ECX_DWORD_PTR_ECX_ADD(32)
; If $I <= 255 Then
$OPCODE = $OPCODE & "8B49" & INT2HEX($I, 2)
; Else
; $OPCODE = $OPCODE & "8B89" & INT2HEX($I, 8)
ADD_ECX(236)
; $OPCODE = $OPCODE & "83C1" & INT2HEX($I, 8)
MOV_EAX($ID)
; $OPCODE = $OPCODE & "B8" & INT2HEX($I, 8)
PUSH_EAX()
; $OPCODE = $OPCODE & "50"
MOV_EDX(5995376)
; $OPCODE = $OPCODE & "BA" & INT2HEX($I, 8)
CALL_EDX()
;$OPCODE = $OPCODE & "FFD2"
POPAD()
;$OPCODE = $OPCODE & "61"
RET()
;$OPCODE = $OPCODE & "C3"
12/20/2009 13:45 origmas#1065
Quote:
Originally Posted by Novohyd View Post
Расписал все по командам как код составляется. Может команды использовать по-другому
дизассемблируй полученный $OPCODE - поймешь где не так ..

При такой вот записи
MOV_EDX(5995376)
; $OPCODE = $OPCODE & "BA" & INT2HEX($I, 8)

BA - останется, но по практике помнится, что оно должно изменится на BC или как-то, соответственно и параматр приобретет другой вид, потому-что в машинном представлении команда MOVE сливается с параметром, а тут на Автоите компиляция не происходит - просто запись в цепочку. Поэтому и беда .

это одна из причин (а для инжекта - самая 1-я)- почему надо переходить на Дельфи, или на ?С++ - там команда asm - все делает автоматически.

.. конечно можно выкрутиться - записать MOV EDX(5995376) (как на ассемблере) куданить в Дизас или отладчик и посмотреть какой должен быть реальный код машинный - и этот код подставлять в $OPCODE, опять-же лучше так делать со всей группой команд а не отдельно взятой (MOV) так как это влияет на правила компиляции.
НО, ... даже и тогда когда уже Автоид будет компилить ваш листинг с готовым компилированным кодом от другого компилятора - результат может быть другим - необходима одновременная компиляция .. как в нормальных языках