Пора уже "копирайты" вешать на каждый байт... или патент оформить на инъекцию и каждый раз продавать базовые адреса и адреса вызываемых функций, а на тех, кто незаконно использует, подавать в суд. Конечно же, еще обязательно на каждом доступном форуме большими буквами указывать "Афтор я"Quote:
Пацаны прикиньте черти с ач взяли и с моего кряка копирайты убрали и запостили там . )))
нет. функция покупки и продажи работают одинаковоQuote:
Отличаются ID вещей в рюкзаке и у продавца
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;
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
ассемблерные функции из autogeoQuote:
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
Это реализуетцо на стороне сервера .Quote:
FLY_CALL =$0044BE90;
Народ кто нибудь сделал покупку? Структура функции продажи и покупки практически одинаковы, подготовка тоже должна быть похожа - продажа идет покупка нет(. Отличаются ID вещей в рюкзаке и у продавца? Вроде не должны).
Если есть проверенная функция продажи - выложите, пожалуйста)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ 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;
Да лана зачем те авто пиши прям так :)Quote:
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;
$OPCODE не правильно формируется попробуй не передавать в параметрах Ассембл. функций - вычисляемое значение (Dec(...)), а вычисли его заранее или пиши сразу Дес.число.Quote:
Код в инжект получается такой: 608B0D620000008B491483C100000000B84043108050BA0500 0000FFD261 для ID $80104340
608B0DDCAD98008B492083C1EC000000B84043108050BA707B 5B00FFD261C3Quote:
$OPCODE не правильно формируется попробуй не передавать в параметрах Ассембл. функций - вычисляемое значение (Dec(...)), а вычисли его заранее или пиши сразу Дес.число.
Потом - чеж - не кончается инжектируемый код банальной командой "C3" - RET() а в листинге она у тебя стоит.
дизаассемблером ким-нить или в отладчике где можно вставлять коды а не команды .. щас на вскидку не помню ..Quote:
608B0DDCAD98008B492083C1EC000000B84043108050BA707B 5B00FFD261C3
если сразу в десятичной писать, получается такой код.
в какой проге из HEXа в ассемблер перевести можно отдельную строчку?
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"
дизассемблируй полученный $OPCODE - поймешь где не так ..Quote:
Расписал все по командам как код составляется. Может команды использовать по-другому