|
You last visited: Today at 00:09
Advertisement
Rus. server
Discussion on Rus. server within the Perfect World forum part of the MMORPGs category.
12/19/2009, 23:45
|
#1051
|
elite*gold: 0
Join Date: Oct 2008
Posts: 59
Received Thanks: 4
|
Quote:
Originally Posted by silkytail
лолчитс такой лолчитс
|
Ты прав
 
|
|
|
12/20/2009, 01:23
|
#1052
|
elite*gold: 0
Join Date: Jan 2009
Posts: 45
Received Thanks: 12
|
FLY_CALL =$0044BE90;
Народ кто нибудь сделал покупку? Структура функции продажи и покупки практически одинаковы, подготовка тоже должна быть похожа - продажа идет покупка нет(. Отличаются ID вещей в рюкзаке и у продавца? Вроде не должны).
Если есть проверенная функция продажи - выложите, пожалуйста)
|
|
|
12/20/2009, 03:51
|
#1053
|
elite*gold: 0
Join Date: Apr 2009
Posts: 237
Received Thanks: 403
|
Quote:
|
Пацаны прикиньте черти с ач взяли и с моего кряка копирайты убрали и запостили там . )))
|
Пора уже "копирайты" вешать на каждый байт... или патент оформить на инъекцию и каждый раз продавать базовые адреса и адреса вызываемых функций, а на тех, кто незаконно использует, подавать в суд. Конечно же, еще обязательно на каждом доступном форуме большими буквами указывать "Афтор я"
Quote:
|
Отличаются ID вещей в рюкзаке и у продавца
|
нет. функция покупки и продажи работают одинаково
|
|
|
12/20/2009, 04:58
|
#1054
|
elite*gold: 0
Join Date: Jan 2009
Posts: 137
Received Thanks: 19
|
Повелся, я братцы на китайцу злого... Решил заюзать функцию автоматического поиска офсетов (исходник тут пробегал). И каааааак получил геморою полные штаны... китайёза видать на совсем древнем чем-то пишет. Причем таком древнем, что у него 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
|
#1055
|
elite*gold: 0
Join Date: Jan 2009
Posts: 137
Received Thanks: 19
|
Глупая и несерьезная...
Просто ты не туда роешь. Все можно и на автоите реализовать. Попробуй с малого - инжектни general_attack. То бишь:
1. Нарисуй на форме бота кнопочку.
2. Навесь на нее инжект.
3. Зайди в игру.
4. Запусти бота.
5. Возьми в игре кого-нить в таргет.
6. Тыркни в боте на кнопку атаки.
Если все пройдет удачно - повторяй с остальными вызовами.
Дык, а если еще вместо плача Ярославны будешь конкретные наводящие вопросы задавать - так есть огромная вероятность, что беде еще и помогут с тем, где именно ты набагал. Ну это так - лирическое отступление
|
|
|
12/20/2009, 06:45
|
#1056
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
последняя попытка была такой
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
|
#1057
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
Изначально был такой вариант
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
|
#1058
|
elite*gold: 0
Join Date: Oct 2008
Posts: 59
Received Thanks: 4
|
Quote:
Originally Posted by obiov
FLY_CALL =$0044BE90;
Народ кто нибудь сделал покупку? Структура функции продажи и покупки практически одинаковы, подготовка тоже должна быть похожа - продажа идет покупка нет(. Отличаются ID вещей в рюкзаке и у продавца? Вроде не должны).
Если есть проверенная функция продажи - выложите, пожалуйста)
|
Это реализуетцо на стороне сервера .
Так что ты не сможешь хакнуть кота ))
Либо npc торговца .
Хотя чем черт не шутит )
|
|
|
12/20/2009, 10:49
|
#1059
|
elite*gold: 0
Join Date: Jan 2009
Posts: 137
Received Thanks: 19
|
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
|
#1060
|
elite*gold: 0
Join Date: Oct 2008
Posts: 59
Received Thanks: 4
|
Quote:
Originally Posted by AlexGD
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
|
#1061
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Quote:
Originally Posted by Novohyd
Код в инжект получается такой: 608B0D620000008B491483C100000000B84043108050BA0500 0000FFD261 для ID $80104340
|
$OPCODE не правильно формируется попробуй не передавать в параметрах Ассембл. функций - вычисляемое значение (Dec(...)), а вычисли его заранее или пиши сразу Дес.число.
Потом - чеж - не кончается инжектируемый код банальной командой "C3" - RET() а в листинге она у тебя стоит.
|
|
|
12/20/2009, 13:25
|
#1062
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
Quote:
Originally Posted by origmas
$OPCODE не правильно формируется попробуй не передавать в параметрах Ассембл. функций - вычисляемое значение (Dec(...)), а вычисли его заранее или пиши сразу Дес.число.
Потом - чеж - не кончается инжектируемый код банальной командой "C3" - RET() а в листинге она у тебя стоит.
|
608B0DDCAD98008B492083C1EC000000B84043108050BA707B 5B00FFD261C3
если сразу в десятичной писать, получается такой код.
в какой проге из HEXа в ассемблер перевести можно отдельную строчку?
|
|
|
12/20/2009, 13:36
|
#1063
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Quote:
Originally Posted by Novohyd
608B0DDCAD98008B492083C1EC000000B84043108050BA707B 5B00FFD261C3
если сразу в десятичной писать, получается такой код.
в какой проге из HEXа в ассемблер перевести можно отдельную строчку?
|
дизаассемблером ким-нить или в отладчике где можно вставлять коды а не команды .. щас на вскидку не помню ..
короч тебе теперь надо посмотреть какой Асс-код получится из этих Оп-кодов - если так как ты затеял - то все ОК ..
|
|
|
12/20/2009, 13:41
|
#1064
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
Расписал все по командам как код составляется. Может команды использовать по-другому
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
|
#1065
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Quote:
Originally Posted by Novohyd
Расписал все по командам как код составляется. Может команды использовать по-другому
|
дизассемблируй полученный $OPCODE - поймешь где не так ..
При такой вот записи
MOV_EDX(5995376)
; $OPCODE = $OPCODE & "BA" & INT2HEX($I, 8)
BA - останется, но по практике помнится, что оно должно изменится на BC или как-то, соответственно и параматр приобретет другой вид, потому-что в машинном представлении команда MOVE сливается с параметром, а тут на Автоите компиляция не происходит - просто запись в цепочку. Поэтому и беда .
это одна из причин (а для инжекта - самая 1-я)- почему надо переходить на Дельфи, или на ?С++ - там команда asm - все делает автоматически.
.. конечно можно выкрутиться - записать MOV EDX(5995376) (как на ассемблере) куданить в Дизас или отладчик и посмотреть какой должен быть реальный код машинный - и этот код подставлять в $OPCODE, опять-же лучше так делать со всей группой команд а не отдельно взятой (MOV) так как это влияет на правила компиляции.
НО, ... даже и тогда когда уже Автоид будет компилить ваш листинг с готовым компилированным кодом от другого компилятора - результат может быть другим - необходима одновременная компиляция .. как в нормальных языках
|
|
|
All times are GMT +1. The time now is 00:13.
|
|