PDA

Просмотр полной версии : for supernewbie (логово извращенцев)


Страницы : [1] 2

destructor
25.01.2011, 17:49
переехали

supernewbie
25.01.2011, 17:51
так, я тут)

destructor
25.01.2011, 17:56
простой пример:
class test
{
int a ;
int b ;
int c ;
printclass()
{
printf("%d %d %d\n", a, b, c);
};
};


main()
{
x = new test;
x->a = 1;
x->b = 2;
x->c = 3;
x->printclass();
}

Добавлено через 1 минуту
перепиши это на делфи и скомпилируй

Добавлено через 41 секунду
в опциях компилятора ОТКЛЮЧИ оптимизацию

supernewbie
25.01.2011, 18:03
type
test=class(TObject)
public
a,b,c:integer;
procedure printclass;
end;

верно?

var
x:test;

implementation

procedure test.printclass;
begin
showmessage(Format('%d %d %d', [a, b, c]));
end;

begin
x:=test.create;
x.a:=1;
x.b:=2;
x.c:=3;
x.printclass;
end.

верно переписал?
с си как-то не очень)

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

destructor
25.01.2011, 18:04
ну скомпилируй и выложи сюда

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

supernewbie
25.01.2011, 18:05
111

PS настройки компилятора нашел, оптимизацию отрубил)

alexteam
25.01.2011, 18:05
test=class(TObject)

наследуем кучу всего.

destructor
25.01.2011, 18:07
ипать, а чо за форма потом открылась????

supernewbie
25.01.2011, 18:09
стандартная форма))

destructor
25.01.2011, 18:11
где в твоем исходнике создание формы?
откуда она появилась?
ты понимаеш что такое "простой пример"?

mikser
25.01.2011, 18:12
Деструктора делфе обучаете? :)

PS простой (действительно) пример в делфе начинается со слова Program

supernewbie
25.01.2011, 18:13
если её убрать, то не скомпилируется, ладно, сейчас попытаюсь как-нибудь

destructor
25.01.2011, 18:15
такое умееш компилить?

program firststep;
begin
writeln('hello world');
end;

supernewbie
25.01.2011, 18:18
11111

destructor
25.01.2011, 18:25
жестока

supernewbie
25.01.2011, 18:26
что) все нормально) простой пример)

destructor
25.01.2011, 18:31
http://www.gptelecom.ru/Articles/Console/1-1-1.htm

Добавлено через 21 секунду
осваивай пока это, через час проверю

mikser
25.01.2011, 18:33
нафига вам консоль

destructor
25.01.2011, 18:33
причем тут консоль?

mikser
25.01.2011, 18:35
да можно и так поставить вопрос

supernewbie
25.01.2011, 18:59
уф, 1-4-2, так скучно, но читаю дальше)

destructor
25.01.2011, 19:01
supernewbie, первую страницу имею ввиду...

xkor
25.01.2011, 19:07
а шо эт вы тут делаете?)

destructor
25.01.2011, 19:08
учимся компилить helloworld без левых примочек

supernewbie
25.01.2011, 19:11
тьфу, ну тогда я уже все прочитал)

destructor
25.01.2011, 19:13
supernewbie, там 3 примера есть.
скомпиль их как там написано и выложи, хочу посмотреть.

supernewbie
25.01.2011, 19:14
всё, тепрь примочек точно нет

на первой странице тока 2 примера)

destructor
25.01.2011, 19:18
тепрь примочек точно нетя хочу это увидеть, выложи 3 скомпиленных примера с этого сайта.

supernewbie
25.01.2011, 19:19
111

destructor
25.01.2011, 19:21
дебаг или релиз версия скомпилена?

supernewbie
25.01.2011, 19:23
эмм, наверное релиз, не совсем понял о чем ты

destructor
25.01.2011, 19:27
ладн, неважно, давай исходник где окошко 123 без примочек

supernewbie
25.01.2011, 19:30
program Project25;

uses
SysUtils,
Windows;

type
test=class
public
a,b,c:integer;
procedure printclass;
end;

procedure test.printclass;
begin
messagebox(0,PChar(Format('%d %d %d', [a, b, c])),'Без примочек',0);
end;

var
x:test;

begin
x:=test.create;
x.a:=1;
x.b:=2;
x.c:=3;
x.printclass;
end.

destructor
25.01.2011, 19:49
begin
loadlibraly("path.dll"); //инжектим нашу левую длл.

x:=test.create; //движек создает обьект в памяти, адрес записывает в переменную Х
x.a:=1; //записывает туда текстуры
x.b:=2; //записывае мобов
x.c:=3; //записывает ланшафт
while true do
begin
x.printclass; //выводит на экран картинку
end;
end.
перекомпиль так

supernewbie
25.01.2011, 19:53
так так)

destructor
25.01.2011, 20:01
ну выложи блин

supernewbie
25.01.2011, 20:04
думал уже объяснения пошли)

destructor
25.01.2011, 20:11
в памяти наш обьект выглядит так:
01D707F0 dd 0
01D707F4 dd 16h
01D707F8 dd 1
01D707FC dd 7
01D70800 dd 6D6D3A68h
01D70804 dd 73733Ah
01D70808 dd 16h
//начинается наш обьект, все что выше мусор
//в переменную Х попадает этот адрес: $01D7080C
01D7080C dd 408184h
01D70810 dd 1
01D70814 dd 2
01D70818 dd 3
//дальше пошел мусор
01D7081C dd 0
01D70820 dd 0
01D70824 dd 0
01D70828 dd 0
01D7082C dd 0

Добавлено через 1 минуту
теперь задача1, в этой картинке надо изменить ланшафт на 4 с помощью левой длл

Добавлено через 1 минуту
адрес обьекта можно получить из переменной Х
адрес переменной Х можно поглядеть в отладчике(если она не экспортируется:D)

supernewbie
25.01.2011, 20:14
так так, а можно какие-нибудь приимерчики?)

destructor
25.01.2011, 20:15
в твоем случае переменная Х лежит по адресу:
getmodulehandle('project25.exe') + $0040A798-$004000

supernewbie
25.01.2011, 20:17
и откуда $0040A798-$00400000?

destructor
25.01.2011, 20:19
тоесть пиши path.dll (без примочек желательно).
в dllmain создавай новый поток: paththread()
paththread()
{
messagebox('pause'); //ждем загрузки графического двигла
adddrx:= getmodulehandle('project25.exe') + $A798; //нашли адрес переменной Х
messagebox(inttostring(addrx));//показываем что мы нашли чтобы проверить
...
..
...
};

Добавлено через 38 секунд
и откуда $0040A798-$00400000?угадал отладчиком.

supernewbie
25.01.2011, 20:27
4237208?)

PS и что за отладчик?)

destructor
25.01.2011, 20:30
4237208?)это чо?
PS и что за отладчик?)ida
ну подойдет любой

supernewbie
25.01.2011, 20:32
это чо?
выдало) инт то стр кардинала полученного с помощью adr:=getmodulehandle('project25.exe') + $A798; )

destructor
25.01.2011, 20:53
а можно чтобы оно в хексах показывало сразу?

Добавлено через 23 секунды
не удобно ппц как

Добавлено через 19 минут
supernewbie, завис на том как hex показать?

supernewbie
25.01.2011, 21:06
в пх вроде че-то такое есть)

4237208->98 A7 40 00

Добавлено через 9 минут
PChar(IntToHex(adr,8)) робит)
0040A798

какого хрена тока в другом порядке то втф

destructor
25.01.2011, 21:14
в нормальном порядке.

Добавлено через 2 минуты
objaddr:=adr^;
messagebox(IntToHex(objaddr,0);
достаем из перемнной Х адрес обьекта, выводим в месагу и выкладываем сюда dll+exe

supernewbie
25.01.2011, 21:17
objaddr:Pointer;

objaddr:=adr^;

[Error] path.dpr(24): Pointer type required

заюзал objaddr:=@adr;

Добавлено через 1 минуту
34359424

destructor
25.01.2011, 21:21
...
....
Project25.exe:004082CE mov dl, 1
Project25.exe:004082D0 mov eax, dword ptr unk_408140
Project25.exe:004082D5 call near ptr unk_402FCC //вот тут создается обьект
Project25.exe:004082DA mov off_40A798, eax //тут его пишут в переменную Х, отсюда я и "угадал" адрес переменной Х
Project25.exe:004082DF mov eax, off_40A798
Project25.exe:004082E4 mov dword ptr [eax+4], 1
Project25.exe:004082EB mov eax, off_40A798
Project25.exe:004082F0 mov dword ptr [eax+8], 2
......
....
..
но на это пока не обращай внимание, важно что мы знаем адрес Х

Добавлено через 1 минуту
заюзал objaddr:=@adr;нет, не верно

Добавлено через 21 секунду
я хз как с указателями в делфях работать

Добавлено через 1 минуту
/summon alexteam
!help , мы в тупике

alexteam
25.01.2011, 21:33
думаю понятно.
var
i : integer;
P : Pointer;
OtherI1 : ^Integer;
OtherI2 : integer;
begin
i := 123123;
p := @i;
OtherI1 := p; //"ссылко"
OtherI2 := integer(P^); //"копия"
ShowMessage(inttostr(integer(p^))); //123123
ShowMessage(inttostr(OtherI1^)); //123123
ShowMessage(inttostr(OtherI2)); //123123
i := 321321;
ShowMessage(inttostr(integer(p^))); //321321
ShowMessage(inttostr(OtherI1^)); //321321
ShowMessage(inttostr(OtherI2)); //123123
end;

Добавлено через 3 минуты
в данном случае ему нужно
1. прочитать значение с off_40A798 - это базовый адрес по которому лежит экземпляр класса.
2. добавить к этому значение смещение переменной (на сколько там от базового адреса далеко нужная переменная)
3. загнать полученое значение в var value: ^НужныйТип;
4. юзать value^

supernewbie
25.01.2011, 21:38
так так

otheri1:^integer;

adr:=getmodulehandle('project25.exe') + $A798;
otheri1:=@adr;

messagebox(0,PChar(IntToStr(Integer(otheri1^))),'' ,0);

4237208

PS где-то я уже видел это число

destructor
25.01.2011, 21:42
messagebox(0,PChar(IntToStr(Integer(otheri1^))),'' ,0);
:facepalm:

supernewbie
25.01.2011, 21:44
че с ним не так))

destructor
25.01.2011, 21:50
весь код функции покажи

supernewbie
25.01.2011, 21:51
library path;

uses
SysUtils,
Windows,
Classes;
var
ID, ThrHandle: Cardinal;
adr:Cardinal;
objaddr:Pointer;
otheri1:^cardinal;

procedure MyProc;
begin
adr:=getmodulehandle('project25.exe') + $A798;
otheri1:=@adr;
//messagebox(0,PChar(IntToHex(objaddr,8)),'',0);
messagebox(0,PChar(IntToStr(otheri1^)),'',0);
end;
{$R *.res}

begin
messagebox(0,'pause','',0);
ThrHandle:=CreateThread(nil,0,@MyProc,nil,0,id);
end.

destructor
25.01.2011, 21:54
procedure MyProc;
var //учимся НЕ юзать глобальные переменные
adr:^pointer;
objaddr:pointer;

begin
adr:=getmodulehandle('project25.exe') + $A798;
obaddr:=adr^;

messagebox(0,PChar(IntToHex(obaddr)),'',0);
end;
помоему так

alexteam
25.01.2011, 21:56
program Project2;

{$APPTYPE CONSOLE}
type
TMyClass = class
public
X: integer;
Y: integer;
Procedure ApplicationProcedure;
end;

{ TMyClass }

procedure TMyClass.ApplicationProcedure;
begin
Writeln(x,' ',y);
end;

var
MyObj : TMyClass;
Stored, OffsetX, OffsetY : Pointer;
PIntX, PIntY : ^integer;
begin
//приложение
MyObj := TMyClass.Create;
MyObj.X := 100;
MyObj.Y := 200;
MyObj.ApplicationProcedure;

//а это типо у нас
Stored := MyObj; //прочитать значение с off_40A798
OffsetX := @TMyClass(nil).x; //т.к. я в этом же приложении то могу сделать воттак.
OffsetY := @TMyClass(nil).y; //на самом деле у нас константы - смещения

PintX := pointer(integer(Stored) + integer(OffsetX)); //базовый адрес + смещение = адрес того где читать\менять
PintY := pointer(integer(Stored) + integer(OffsetY));


PintX^ := 111; //меняем
PintY^ := 222;

//опять приложение
MyObj.ApplicationProcedure;

readln;
end.

supernewbie
25.01.2011, 21:56
getmodulehandle возвращает кардинал же

destructor
25.01.2011, 21:59
кардинал жеэто адрес начала твоего приложения в памяти
приведение типов гугли

supernewbie
25.01.2011, 22:04
Stored := MyObj; //прочитать значение с off_40A798
каким образом мы читаем с 40A798 этой строкой???
//я них*я непонимат(

destructor
25.01.2011, 22:09
//я них*я непонимат(он "в своем приложении", это некатит.
procedure MyProc;
var //учимся НЕ юзать глобальные переменные
adr:pointer;
objaddr:pointer;

begin
adr:=pointer( getmodulehandle('project25.exe') + $A798);
obaddr:=pointer(adr^);

messagebox(0,PChar(IntToHex(obaddr)),'',0);
end;

так скомпилит?

supernewbie
25.01.2011, 22:14
[Error] path.dpr(25): There is no overloaded version of 'IntToHex' that can be called with these arguments

destructor
25.01.2011, 22:18
даже я понял что значит эта строчка.

вот так надо: messagebox(0,PChar(IntToHex(obaddr, 8)),'',0);

supernewbie
25.01.2011, 22:19
да нихрена)

тоже самое)

Добавлено через 31 секунду
cardinal(objaddr) - работает, но...

destructor
25.01.2011, 22:20
а так?
messagebox(0,PChar(IntToHex(integer(obaddr), 8])),'',0);

Добавлено через 28 секунд
но... что "но"?

supernewbie
25.01.2011, 22:23
по идее таким образом можно и без ^ обойтись... ну ладно, давай уже дальше

alexteam
25.01.2011, 22:24
что "но"?
наверное
//я них*я непонимат(

destructor
25.01.2011, 22:24
по идее таким образом можно и без ^ обойтись..
нельзя.
угадали адрес переменной: 0040A798
по этому адресу лежит адрес обьекта:
Project25.exe:0040A794 dd 0
Project25.exe:0040A798 dd $0041080C //нужно это
Project25.exe:0040A79C dd 0
Project25.exe:0040A7A0 dd 0

нам надо сделать эту хрень ^ , учи указатели.



выкладывай длл+ехе, погляжу что получилось

supernewbie
25.01.2011, 22:27
хрень какая-то получилась

alexteam
25.01.2011, 22:38
хрень какая-то получилась
как обычно ? да ?

destructor
25.01.2011, 22:40
окошко с паузой должно быть в начале потока, а не в dllmain

а ну остальное все верно,
теперь у тебя obaddr указывает на адрес в памяти, где лежит обьект

supernewbie
25.01.2011, 22:41
01FB0828? это верно?

если да, то окей...

destructor
25.01.2011, 22:43
obaddr = $01D7080C; //адрес плавающий, где винда выделит память, такой он и будет

память выглядит так:
01D7080C dd 408184h
01D70810 dd 1
01D70814 dd 2
01D70818 dd 3

теперь задачка поменять эти цыферки в памяти, чтобы "графический движек" показывал "другую картинку"

supernewbie
25.01.2011, 22:45
так так

destructor
25.01.2011, 22:45
хм... подозреваю что ему чтото непонятно...

supernewbie
25.01.2011, 22:46
что именно?)

можешь задавать вопросы

destructor
25.01.2011, 22:50
supernewbie, что будеш делать дальше, чтобы твое окошко показывало "5 6 7" вместо "1 2 3"?

supernewbie
25.01.2011, 22:52
так, учитывая что у меня есть адрес объекта, класса, или чего там, я даже не знаю, но наверное надо как-то что-тто считать по этому адресу, или я не прав?)

destructor
25.01.2011, 23:04
у тебя есть адрес в памяти по которому лежит неведомая хрень,
она куйпоми как устроена, но она необходима для вывода картинки на экран.

1)смотрим в память по этому адресу и видим вот такую картину:
01D7080C dd 408184h
01D70810 dd 1
01D70814 dd 2
01D70818 dd 3
2)разбираемся\угадываем, что в каком месте лежит и за что оно отвечает.
3)правим память в нужных местах, чтобы наш "графический движек" рисовал нужную нам "картинку"

картинка нужна такая: "6 6 6"


дописывай длл.

supernewbie
25.01.2011, 23:10
как смотреть память по адресу? как править память?

destructor
25.01.2011, 23:16
как смотреть память по адресу?
var
a1:^integer;
a2:integer;
begin
a1:=$12345678; // a1 какойто адрес памяти
a2:=a1^; // a2 то что по этому адресу лежит
writeln(inttosrt(a2)); // так это можно посмотреть
end;

как править память?
var
a1:^integer;
begin
a1:=$12345678; // a1 какойто адрес памяти
a1^=0; // так можно записать нолик в память по адресу 12345678
end;

supernewbie
25.01.2011, 23:17
objaddr^ так смотреть, да? //да

destructor
25.01.2011, 23:18
хоть чуть чуть понятно?

supernewbie
25.01.2011, 23:21
a - адрес в памяти
а^ - то что в памяти по адресу а
^а - обращение для записи в память по адресу а
все верно?

тока че-та ^objaddr:=0; пишет [Error] path.dpr(23): Missing operator or semicolon )

destructor
25.01.2011, 23:23
исправил

supernewbie
25.01.2011, 23:25
objaddr^:=0; - [Error] path.dpr(23): Operator not applicable to this operand type

че за тип ему нужен(

destructor
25.01.2011, 23:27
integer их делай, других типов на самом деле не бывает

supernewbie
25.01.2011, 23:27
objaddr^:=Integer(0); тоже самое \

destructor
25.01.2011, 23:30
var
objaddr: ^integer;

supernewbie
25.01.2011, 23:33
о госпади, скомпилировалось..., тока какого хрена после objaddr^:=0; все равно 1 2 3?!

destructor
25.01.2011, 23:34
код функции выкладывай

supernewbie
25.01.2011, 23:36
procedure MyProc;
var
adr:pointer;
objaddr:^integer;
buf:cardinal;
i:^integer;
begin
messagebox(0,'pause','',0);
adr:=pointer( getmodulehandle('project25.exe') + $A798);
objaddr:=pointer(adr^);
messagebox(0,PChar(IntToHex(integer(objaddr),8)),' ',0);
messagebox(0,PChar(IntToHex(integer(objaddr^),8)), '',0);
objaddr^:=0;
messagebox(0,PChar(IntToHex(integer(objaddr^),8)), '',0);
end;

destructor
25.01.2011, 23:41
objaddr^:=0;

вот так выглядит память, у теб objaddr = 01D7080C
01D7080C dd 408184h // ты тут записываеш нолик , это кстате вызовит крит ошибку при выгрузке обьекта
01D70810 dd 1 // а надо записать сюда 7
01D70814 dd 2 // сюда 6
01D70818 dd 3 // и сюда 5

supernewbie
25.01.2011, 23:45
угу... так, в таком случае...

Добавлено через 1 минуту
ураааа)

objaddr:=pointer(Integer(objaddr)+4);

destructor
25.01.2011, 23:47
ну бля чем $01D7080C отлитчается от $01D70810 и от этого $01D70814 ???

Добавлено через 1 минуту
objaddr:=pointer(Integer(objaddr)+4);
поправочка:
param1:= pointer(Integer(objaddr)+4);
так круче, поверь

supernewbie
25.01.2011, 23:49
как занимательно)

destructor
25.01.2011, 23:50
var:
param1: ^integer;

begin
...
param1: = objaddr+1; //так тоже должно прокатить, но главное идею понял

supernewbie
25.01.2011, 23:51
атнюдь

[Error] path.dpr(23): Operator not applicable to this operand type

destructor
25.01.2011, 23:53
выкладывай dll+exe окончательные

supernewbie
25.01.2011, 23:56
exe+dll

PS ida не может диссамблирнуть ничего, с ошибкой вылетает(

destructor
26.01.2011, 00:00
PS ida не может диссамблирнуть ничего, с ошибкой вылетает(давай teamviewer

supernewbie
26.01.2011, 00:01
блин, у меня только скайп)

качать тимвивер?

destructor
26.01.2011, 00:03
exe+dll
короч получилось изменить обьект
1)узнали где он лежит в памяти
2)разобрались как он устроен
3)поняли что надо менять

по этим пунктам хоть какие нибуть непонятки есть?

supernewbie
26.01.2011, 00:04
госпади, переместил ida в корневую диска, теперь всё нет ошибки)

так, во-первых, что значит ^integer в var.
во-вторых вот эти вот адреса, значения и прочие угадывания через ida, да? а так вроде все ок

destructor
26.01.2011, 00:09
качать тимвивер?да

Добавлено через 26 секунд
госпади, переместил в корневую диска, теперь всё ок)ты о чем?

Добавлено через 1 минуту
вот эти вот адреса, значения и прочие угадывания через ida, да?да.
переменная или функция может экспортироватся, тогда угадывать не надо

Добавлено через 2 минуты
что значит ^integer в var
a1:^integer; означает что - а1 указатель на integer

supernewbie
26.01.2011, 00:10
скачал тививер, ничерта непонятно, выдали ID, в пароле стоит -, это значит что у меня нет пароля или что?)

destructor
26.01.2011, 00:11
перезапусти, я хз

supernewbie
26.01.2011, 00:13
не знаю, попрбуй че-нить сделать
id - 438 838 270

destructor
26.01.2011, 00:15
давай пароль блин

supernewbie
26.01.2011, 00:18
его нет)) или он "-"

Добавлено через 2 минуты
Не готов. Проверьте подключение.

Добавлено через 31 секунду

destructor
26.01.2011, 00:18
правой кнопкой по нему, "создать новый динамичный пароль"

Veniamin
26.01.2011, 13:25
Тема для набивания Дестром спасибок? :DD

supernewbie
26.01.2011, 18:35
Тема для набивания Дестром спасибок? :DD
Кыш отсюда!

---

дестр, давай дальше)

как вызывать функции по адресу?)

хотя это я примерно представляю, но как узнать описание?

alexteam
26.01.2011, 18:37
но как узнать описание
смотреть что ложится в стек перед вызовом функции.

supernewbie
26.01.2011, 19:01
угу... стек говоришь

PS чесно говоря я плохо себе его представляю, единственное похожее слово которое я знаю это стеЙк, ну ладно, гугл мне в помощь)

destructor
26.01.2011, 19:24
в твоем случае вызов будет так выглядеть:

procaddr:=?
asm
mov eax, objaddr;
call [procaddr];
end;

supernewbie
26.01.2011, 19:27
а objaddr это поинтер на объект класса тест, да?

и еще, как вызывать это окошко, с базой и тд)

alexteam
26.01.2011, 19:40
если ты про базадресс то он в пеб лежит вроде.

supernewbie
26.01.2011, 19:53
блин, мне в ида окошко нужно)

Ps что за пеб?)

destructor
26.01.2011, 20:08
какое окошко?

supernewbie
26.01.2011, 22:13
ну вот где показывало, Base 0400000

alexteam
26.01.2011, 22:28
пеб, это пеб.
http://www.delphibasics.info/home/delphibasicssnippets/pebmodulelister

supernewbie
26.01.2011, 22:35
о да, это именно то окно, как оно вызывается в иде?

vahes
27.01.2011, 01:11
чем санта барбара закончилась еб? :D

destructor
27.01.2011, 01:14
ida сломалась

supernewbie
27.01.2011, 19:50
так что там) как эмуляцию тизкала делать)

destructor
28.01.2011, 17:26
память : значения
0010000: адрес1
0010004: адрес2
0010008: адрес3
001000с: адрес4
0010010: адрес5
0010014: адрес6
0010018: нужный адрес
001001с: ...
0010020: ..
...
..


Добавлено через 11 секунд
так выглядит табличка в памяти

supernewbie
28.01.2011, 17:27
понял, щас буду перебирать

destructor
28.01.2011, 17:27
вот гдето в этой табличке лежит нужный тебе адрес,
надо найти место где он лежит и вписать туда чтото свое

supernewbie
28.01.2011, 17:40
function FindAddNetworkQueueNumber(StartAddr,Finder:pointer ) : integer;
var
i:integer;
tmp:pointer;
begin
result:=-1;
for i:=1 to 200 do
begin
tmp:=Pointer(Integer(StartAddr)+(4*i));
if tmp^=Finder^ then
begin
result:=i;
Exit;
end;
end;
end;

ну че ему не нравится(

---

function FindAddNetworkQueueNumber(StartAddr,Finder:pointer ) : integer;
var
i:integer;
tmp:pointer;
begin
result:=-1;
for i:=1 to 200 do
begin
tmp:=Pointer(Integer(StartAddr)+(4*i));
if Integer(tmp^)=Integer(Finder^) then
begin
result:=i;
Exit;
end;
end;
end;

вот так вроде робит, правда он все равно ничего не находит и возвращает -1( че-то не то(

destructor
28.01.2011, 17:51
Integer(tmp^)=Integer(Finder)

supernewbie
28.01.2011, 18:52
о, робит) thx... PS 34

Добавлено через 3 минуты
туц туц) подменил адресок...

Добавлено через 3 минуты
так, теперь я так понял, надо как-то вызывать оригинальную... щас попробуем...

Добавлено через 41 минуту
че-то не выходит(

destructor
28.01.2011, 19:05
как ты вызываеш оригинальную?)

supernewbie
28.01.2011, 19:11
ну раньше я юзал "прослойку" ксора... но щас она не работает)

ну вот щас так (не робит) :

var
UNetworkHandlerNextHook : procedure(packet:pointer); stdcall;

procedure UNetworkHandlerCall(NetworkPacket: Pointer); stdcall;
asm
mov ecx, AddNetworkQueue_origAddr
mov esp, ebp
pop ebp
call [UNetworkHandlerNextHook]
end;

procedure UNetworkHandlerHookProc2(unh: Integer; np: PNetworkPacket); stdcall;
begin
AddNetworkQueue_origAddr:=Pointer(unh);
UNetworkHandlerCall(np);
end;

//адрес в таблице меняю на этот
procedure UNetworkHandler_AddNetworkQueue_hook(packet:pointe r); stdcall;
asm
push ecx
push [ebp+8]
push ecx
jmp UNetworkHandlerHookProc2
pop ecx
end;

destructor
28.01.2011, 19:36
а страницу назат как я тебя учил функции вызывать?

supernewbie
28.01.2011, 19:54
procedure UNetworkHandlerCall(NetworkPacket: Pointer); stdcall;
asm
mov eax, tmpPointer;
call [AddNetworkQueue_origAddr]
end;

тоже не работает :D

Добавлено через 7 минут
блин фигня какая-то =\ не знаю( не получается у мня перейти из стдкала в тизкал(

Добавлено через 2 минуты
госпади, получилось)

destructor
28.01.2011, 19:55
push NetworkPacket;
mov ecx, tmpPointer; //указатель на обьект сливаем в другой регистр
call [AddNetworkQueue_origAddr]

supernewbie
28.01.2011, 20:02
( смену таблицы тоже палит, ну я и не думал что всё будет так просто...

какие еще варианты?

Yegor
28.01.2011, 21:14
Ты опробовал 2 самых распространенных метода неудивительно что защита их знает и палит. Теперь все зависит только от твоей фантазии.

supernewbie
28.01.2011, 22:18
var
GetProcAddressNext: function(Module: THandle; ProcName: PChar): TFarProc; stdcall;

function MyGetProcAddressHook(Module: THandle; ProcName: PChar): TFarProc; stdcall;
begin
messagebox(0,'MyGetProcAddressHook','MyGetProcAddr essHook',0);
result:=GetProcAddressNext(Module,ProcName);
end;

function SaveOldFunction(Proc: pointer; Old: pointer): dword;
var
SaveSize, Size: dword;
Next: pointer;
begin
SaveSize := 0;
Next := Proc;
while SaveSize < 5 do
begin
Size := SizeOfCode(Next);
Next := pointer(dword(Next) + Size);
Inc(SaveSize, Size);
end;
CopyMemory(Old, Proc, SaveSize);
byte(pointer(dword(Old) + SaveSize)^) := $e9;
dword(pointer(dword(Old) + SaveSize + 1)^) := dword(Next) - dword(Old) - SaveSize - 5;
Result := SaveSize;
end;

function MyHookCode(TargetProc, NewProc: pointer; var OldProc: pointer): boolean;
var
Address: dword;
OldProtect: dword;
OldFunction: pointer;
Proc: pointer;
begin
Result := False;
try
Proc := TargetProc;
Address := dword(NewProc) - dword(Proc) - 5;
VirtualProtect(Proc, 5, PAGE_EXECUTE_READWRITE, OldProtect);
GetMem(OldFunction, 255);
dword(OldFunction^) := dword(Proc);
byte(pointer(dword(OldFunction) + 4)^) := SaveOldFunction(Proc, pointer(dword(OldFunction) + 5));
byte(Proc^) := $e9;
dword(pointer(dword(Proc) + 1)^) := Address;
VirtualProtect(Proc, 5, OldProtect, OldProtect);
OldProc := pointer(dword(OldFunction) + 5);
except
Exit;
end;
Result := True;
end;

function CloneTable : boolean;
var
hKernel32:Cardinal;
pGetProcAddress:Pointer;
begin
result:=false;
hKernel32:=GetModuleHandle('kernel32.dll');
if hKernel32=0 then exit;
pGetProcAddress:=GetProcAddress(hKernel32,'GetProc Address');
if pGetProcAddress=nil then exit;
result:=MyHookCode(pGetProcAddress,@MyGetProcAddre ssHook,@GetProcAddressNext);
end;

я уже не знаю, ошибка и всё(

destructor
28.01.2011, 22:26
messagebox(0,'MyGetProcAddressHook','MyGetProcAddr essHook',0); тут делай вывод в консоль, приложение не сможет ждать пока ты "ок" на каждом окошке тыркать будиш

Добавлено через 29 секунд
VirtualProtect(Proc, 5, PAGE_EXECUTE_READWRITE, OldProtect); что возвращает функция?

Добавлено через 42 секунды
* * Proc := TargetProc;
* * Address := dword(NewProc) - dword(Proc) - 5;
* * VirtualProtect(Proc, 5, PAGE_EXECUTE_READWRITE, OldProtect);
* * GetMem(OldFunction, 255);
* * dword(OldFunction^) := dword(Proc);
* * byte(pointer(dword(OldFunction) + 4)^) := SaveOldFunction(Proc, pointer(dword(OldFunction) + 5));
* * byte(Proc^) := $e9;
* * dword(pointer(dword(Proc) + 1)^) := Address;
* * VirtualProtect(Proc, 5, OldProtect, OldProtect);
* * OldProc := pointer(dword(OldFunction) + 5);почему тут так сложно все? где каментарии?

Добавлено через 1 минуту
крит ошибка вылетает тут?
* dword(OldFunction^) := dword(Proc);
или тут?
byte(pointer(dword(OldFunction) + 4)^) := SaveOldFunction(Proc, pointer(dword(OldFunction) + 5));
или тут?
byte(Proc^) := $e9;
или тут?
dword(pointer(dword(Proc) + 1)^) := Address;

Добавлено через 2 минуты
if hKernel32=0 then exit;then
begin
writeln('не могу найти kernel32.dll');
exit;
end;

Yegor
28.01.2011, 22:33
supernewbie, может все таки на С++ будешь писать dll? Я сам очень давно пишу на делфи но когда начал делать перехват понял что на с++ получается намного удобнее.

destructor
28.01.2011, 22:37
одинаково

supernewbie
28.01.2011, 22:43
коменты превратились в ежиков)) потом опишу, когда полностью сделаю вывод в консоль

Добавлено через 1 минуту
е*ать!!! по-моему он только и делает что вызывает GetProcAddress!!!
да консоль просто обфлудилась!!!

PS хук абсалютно нормально ставился, дело как раз в месадж боксе
PSS чесна признаюсь что слизал хук прок, но коменты к ней читал и представляю как сплайсинг работает

destructor
30.01.2011, 01:40
обработка пакета геймгуарда:
int p1;
int p2;
int p3;
int p4;
onggpacket(int a1, int a2, int a3, int a4) // пришел запрос
{
p1=0x0123;
p2=0x4567;
p3=0x89ab;
p3=0xcdef;
sendggpacket(p1,p2,p3,p4); // отправили ответ
};
на самом деле немнога подругому , но идея такая=)

Добавлено через 2 минуты
вот представь,
нашел ты эту функцию,
перевел из асемблера в более высокий язык,
получилось примерно то что я тебе написал.

что будеш дальше делать?)

supernewbie
30.01.2011, 01:45
менять?)

destructor
30.01.2011, 01:47
ты видиш что в ответ идут константы?
а на самом деле что в ответах?

supernewbie
30.01.2011, 01:49
ну у тебя в ответ идут константы, а на самом деле у тебя в ответ идут константы, или что ты хотел услышать)
значения констант в ответе, отправка пакета в ответе или что)

задай вопрос как-то по-другому чтоли

destructor
30.01.2011, 01:53
1)
гг запрос\ответ как выглядит:

пришла непонятная хрень, на нее выдало непонятный ответ.
сервер проверяет ответ на правельность и докладывает если что нитак.


запрос\ответ достаточно сложные чтобы ты пакетхаком их не подделал.

это понятно? такое встречал?

supernewbie
30.01.2011, 01:56
запрос\ответ достаточно сложные чтобы ты пакетхаком их не подделал.

то есть на пакетном уровне ничерта не понятно, так? ну да, это есть

destructor
30.01.2011, 02:01
2)
геймгуард тормозит и его надо выключить, а чтобы не зобанили надо научится подделовать пакеты.

решаем разобрать клиента и вытянуть алгоритм ответа.

тут понятно?

supernewbie
30.01.2011, 02:03
там геймгвард это одно целое со всей защитой, так что его не выключить, не будешь отвечать - кикнут.

так что да, алгоритм ответа нужен

destructor
30.01.2011, 02:05
3)
разбираеш клиента, находиш функцию ответа и видиш такой алгоритм
int p1;
int p2;
int p3;
int p4;
onggpacket(int a1, int a2, int a3, int a4) // пришел запрос
{
p1=0x0123;
p2=0x4567;
p3=0x89ab;
p3=0xcdef;
sendggpacket(p1,p2,p3,p4); // отправили ответ
};

Добавлено через 33 секунды
внимание вопрос: и как он отвечает?

supernewbie
30.01.2011, 02:05
отправляет константы

destructor
30.01.2011, 02:06
пукт первый:
1)
гг запрос\ответ как выглядит:

пришла непонятная хрень, на нее выдало непонятный ответ.

supernewbie
30.01.2011, 02:09
соответственно надо лезть в дебагер и палить как че и выявлять алгоритм?)

alexteam
30.01.2011, 02:10
внимание вопрос: и как он отвечает?
хукает эту функцию. смотрит что при вызове ему подсовывают.
меняет в памяти значения - константы.
вродебы все ?
или я не в теме ?

destructor
30.01.2011, 02:12
пункт 3, залезли \ запалили \ выявили и получили это:
int p1;
int p2;
int p3;
int p4;
onggpacket(int a1, int a2, int a3, int a4) // пришел запрос
{
p1=0x0123;
p2=0x4567;
p3=0x89ab;
p3=0xcdef;
sendggpacket(p1,p2,p3,p4); // отправили ответ
};

supernewbie
30.01.2011, 02:12
ну да, так и есть вот тока просмотреть алгоритм ничерта не получится, т.к. всё под темидой, поэтому осталось нормально хукнуть сенд пакет и палить че там приходит...

destructor
30.01.2011, 02:17
хукает эту функцию. смотрит что при вызове ему подсовывают.не
переменные недоступны для записи -> выбивает в ошибку, которую обрабатывает в ядре...


supernewbie, смысл загадки такой: рано тебе геймгуарды ломать

supernewbie
30.01.2011, 02:19
ну я всё же попробую...

в любом случае сенд пакет хукать надо...

destructor
30.01.2011, 02:21
она cdecl с переменным числом параметров, если чо)

supernewbie
30.01.2011, 02:32
это ощущается) я надеялся что там поинтер) и шо делать?)
массив параметров наверное...
array of variant или как))
ведь там и инт и стринг... странно нахер

че-то как-то так чтоли выходит

TSendPacket = packed record
unknown:pointer;
id:byte;
size:string;
params:array of variant;
end;

destructor
30.01.2011, 02:39
это проще геймгуарда, ты справишся)

supernewbie
30.01.2011, 03:21
var
tmps:string;

asm
mov spobj, ecx
pop tmps
pop tmps
end;
params.size:=tmps;
MessageBox(0,PChar(params.size),PChar(params.size) ,0);

че-то ничерта не работает...

блин, ну как так то, судя по этому коду, в стек предпоследним параметром кладется стринг строка!

.text:203AC6E9 push edx
.text:203AC6EA push 1Ch
.text:203AC6EC push offset aCd ; "cd"
.text:203AC6F1 push eax

destructor
30.01.2011, 17:54
и что это?

supernewbie
30.01.2011, 17:55
.text:203AC6E9 push edx
.text:203AC6EA push 1Ch
.text:203AC6EC push offset aCd ; "cd"
.text:203AC6F1 push eax

вот это загрузка стека в одном из методов UNetworkHalder, после этого идет вызов СендПакета

я хукаю сенд пакет, читаю параметры из стека, но второй параметр стека не стринг строка, как так?!

destructor
30.01.2011, 17:59
может указатель на стринг строку?

supernewbie
30.01.2011, 18:03
делаю string(tmps^) - там вообще пусто...

n1ghtmare
30.01.2011, 18:04
просмотреть алгоритм ничерта не получится, т.к. всё под темидой
Нагугли распакаованый engine.dll от любых хроник, мало что поменялось

supernewbie
30.01.2011, 18:05
ну да, конечно, у нас то engine от сср гварда..

destructor
30.01.2011, 18:08
елаю string(tmps^) - там вообще пусто...нетак делаеш

supernewbie
30.01.2011, 18:10
params.size:=PChar(tmps); - вообще белиберда...

destructor
30.01.2011, 18:13
естественно

supernewbie
30.01.2011, 18:14
и как по-твоему?)

destructor
30.01.2011, 18:16
messageboxA(0,tmps,tmps,0);

supernewbie
30.01.2011, 18:18
tmps при этом? pchar? string?

стринг не канает, значит поинтер или пчар, что вроде одно и тоже...

всё равно белиберда

destructor
30.01.2011, 18:20
string

Добавлено через 16 секунд
наверное

supernewbie
30.01.2011, 18:21
[Error] my_hook_dll.dpr(338): Incompatible types: 'String' and 'PAnsiChar'

ниа

destructor
30.01.2011, 18:25
ну значит tmps:PAnsiChar К.О.

supernewbie
30.01.2011, 18:28
ничерта не меняется...

таже самая белиберда

mOBSCENE
30.01.2011, 18:29
А там не юникод?

destructor
30.01.2011, 18:34
значит ты переменной ошибся

supernewbie
30.01.2011, 18:35
в каком смысле? в стек кладут параметры, значит если я прочитаю стек то получу их, как читая стек я могу получить другие параметры, что происходит?

destructor
30.01.2011, 18:38
как читая стек я могу получить другие параметры, что происходит?на 1 байт дальше прочитал, например

Добавлено через 12 секунд
как ты читаеш из стека?

supernewbie
30.01.2011, 18:38
asm
mov spobj, ecx
pop tmps
pop tmps
end;

destructor
30.01.2011, 18:44
1)как твоя функция выглядит в ida ?
2)указатель на обьект передается тоже через стек

Добавлено через 26 секунд
3)зачем 2 раза pop?

supernewbie
30.01.2011, 18:48
ну сначала достаем указатель, потом стринг строку

destructor
30.01.2011, 18:50
там еще надо достать адрес возврата и ebp регистр... например...


1)как твоя функция выглядит в ida ?

supernewbie
30.01.2011, 18:55
вот функция трейд дона

; public: virtual int __thiscall UNetworkHandler::RequestTradeDone(int)
public ?RequestTradeDone@UNetworkHandler@@UAEHH@Z
?RequestTradeDone@UNetworkHandler@@UAEHH@Z proc near

arg_0= dword ptr 4

mov edx, [esp+arg_0]
mov eax, [ecx+48h]
mov ecx, [eax]
push edx
push 1Ch
push offset aCd ; "cd"
push eax
mov eax, [ecx+6Ch]
call eax
mov ecx, ds:?GNetworkLog@@3PAVFOutputDevice@@A ; FOutputDevice * GNetworkLog
mov edx, [ecx]
push offset aSendTradedonep ; "(Send)TradeDonePacket"
push edx
call ds:?Logf@FOutputDevice@@QAAXPBGZZ ; FOutputDevice::Logf(ushort const *,...)
add esp, 18h
mov eax, 1
retn 4
?RequestTradeDone@UNetworkHandler@@UAEHH@Z endp



моя... щас посмотрю

destructor
30.01.2011, 18:57
.text:20399E4C push offset unk_2049D330ну вот адрес строчки кидают

supernewbie
30.01.2011, 19:02
CODE:0044E570 public SendPacketHook
CODE:0044E570 SendPacketHook proc near ; DATA XREF: sub_44E5E4+57o
CODE:0044E570
CODE:0044E570 var_15 = byte ptr -15h
CODE:0044E570 var_10 = dword ptr -10h
CODE:0044E570 var_8 = dword ptr -8
CODE:0044E570 var_4 = dword ptr -4
CODE:0044E570
CODE:0044E570 push ebp
CODE:0044E571 mov ebp, esp
CODE:0044E573 add esp, 0FFFFFFE8h
CODE:0044E576 push ebx
CODE:0044E577 lea eax, [ebp+var_15]
CODE:0044E57A mov edx, off_44DEB8
CODE:0044E580 call unknown_libname_67 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:0044E585 xor eax, eax
CODE:0044E587 push ebp
CODE:0044E588 push offset loc_44E5D8
CODE:0044E58D push dword ptr fs:[eax]
CODE:0044E590 mov fs:[eax], esp
CODE:0044E593 mov [ebp+var_4], ecx
CODE:0044E596 pop [ebp+var_8]
CODE:0044E599 pop [ebp+var_8]
CODE:0044E59C lea eax, [ebp+var_10]
CODE:0044E59F mov edx, [ebp+var_8]
CODE:0044E5A2 call @System@@LStrLAsg$qqrpvpxv ; System::__linkproc__ LStrLAsg(void *,void *)
CODE:0044E5A7 push 0 ; uType
CODE:0044E5A9 mov eax, [ebp+var_10]
CODE:0044E5AC call @System@@LStrToPChar$qqrx17System@AnsiString ; System::__linkproc__ LStrToPChar(System::AnsiString)
CODE:0044E5B1 mov ebx, eax
CODE:0044E5B3 push ebx ; lpCaption
CODE:0044E5B4 push ebx ; lpText
CODE:0044E5B5 push 0 ; hWnd
CODE:0044E5B7 call MessageBoxA_0_0
CODE:0044E5BC xor eax, eax
CODE:0044E5BE pop edx
CODE:0044E5BF pop ecx
CODE:0044E5C0 pop ecx
CODE:0044E5C1 mov fs:[eax], edx
CODE:0044E5C4 push offset loc_44E5DF
CODE:0044E5C9
CODE:0044E5C9 loc_44E5C9: ; CODE XREF: SendPacketHook+6Dj
CODE:0044E5C9 lea eax, [ebp+var_15]
CODE:0044E5CC mov edx, off_44DEB8
CODE:0044E5D2 call @System@@FinalizeRecord$qqrpvt1 ; System::__linkproc__ FinalizeRecord(void *,void *)
CODE:0044E5D7 retn


Добавлено через 2 минуты
ну вот адрес строчки кидают
ну вот, потом после нее кидают че-то еще, указатель наверное, вот я его достаю, потом соответствено строку

destructor
30.01.2011, 19:10
смотри что туда кидают после строчки
указатель на обьект
адрес возврата

CODE:0044E570* * * * * * * * *push* * ebp
CODE:0044E573* * * * * * * * *add* * *esp, 0FFFFFFE8h
//тоже самое что
push 0
push 0
push 0
push 0
push 0
push 0


CODE:0044E587* * * * * * * * *push* * ebp
CODE:0044E588* * * * * * * * *push* * offset loc_44E5D8
CODE:0044E58D* * * * * * * * *push* * dword ptr fs:[eax]
и потом ты делаеш 2 раза pop

Добавлено через 31 секунду
угадай что за хрень ты достаеш из стека?

supernewbie
30.01.2011, 19:13
блин, но я ничего такого не делал, компилятор сам засунул это туда( что делать?(

PS что за add и lea?

destructor
30.01.2011, 19:34
PS что за add и lea?в гугл

Добавлено через 1 минуту
блин, но я ничего такого не делал, компилятор сам засунул это туда( что делать?(во тоесть виноват кривой компилятор?:)

supernewbie
30.01.2011, 19:38
)) ну я не знаю) наверное))

destructor
30.01.2011, 19:44
пиши в борланд, пусть фиксят

supernewbie
30.01.2011, 19:50
блин дестр, внатуре) ну че делать то) как из стека нормально вытащить? ведь я правельно понял что это мой код сует в стек что-то своё?

Добавлено через 4 минуты
урааа!!! заработало мать вашу!

вот нельзя было сразу сказать а)

destructor
30.01.2011, 19:55
как из стека нормально вытащить
адрес возврата вытаскивают из стека,
твой параметр также , только на 8 байт дальше.

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

supernewbie
30.01.2011, 19:55
переменные параметры говорите... а вот это посложней...

вот у меня щас так робит всё

TSendPacket = packed record
unknown:pointer;
size:pchar;
id:byte;
end;

procedure SendPacketHook(np:TSendPacket); stdcall;

destructor
30.01.2011, 19:59
не правильно

supernewbie
30.01.2011, 20:01
однако работает

destructor
30.01.2011, 20:03
где тут указатель на строчку?

Добавлено через 37 секунд
хотя вижу...

supernewbie
30.01.2011, 20:05
вот только как сделать переменное кол-во параметров, массив нельзя...

destructor
30.01.2011, 20:37
np:TSendPacket получить адрес этой хрени , это будет указатель на первый параметр в стеке.
следующиее находятся дальше...

supernewbie
30.01.2011, 20:54
няяяяя, там еще в параметрах массив может быть

Добавлено через 7 минут
получить адрес этой хрени , это будет указатель на первый параметр в стеке.
следующиее находятся дальше...
всмысле? @np так чтоли?

destructor
30.01.2011, 21:00
угу

supernewbie
30.01.2011, 22:09
ммм, сделал вот так пока что...

procedure SendPacketHook(np:TSendPacket); stdcall;
var
p:pointer;
data:array of pointer;
i,j:integer;
s:string;
begin
try
SetLength(data,length(np.size));
s:='';
for i:=0 to length(np.size)-1 do
begin
asm
pop eax
mov p, eax
end;
data[(length(np.size)-1)-i]:=p;
j:=-1;
if np.size[(length(np.size)-1)-i]='c' then j:=0;
if np.size[(length(np.size)-1)-i]='h' then j:=1;
if np.size[(length(np.size)-1)-i]='d' then j:=2;
if np.size[(length(np.size)-1)-i]='f' then j:=3;
if np.size[(length(np.size)-1)-i]='s' then j:=4;
if np.size[(length(np.size)-1)-i]='b' then j:=5;
if np.size[(length(np.size)-1)-i]='q' then j:=6;
case j of
0: s:=inttostr(byte(p^))+'; '+s;
1: s:=inttostr(word(p^))+'; '+s;
2: s:=inttostr(dword(p^))+'; '+s;
3: s:=floattostr(double(p^))+'; '+s;
4: s:=pchar(p)+'; '+s;
5: s:=inttostr(int64(p^))+'; '+s;
6: s:=inttostr(Int64(p^))+'; '+s;
end;

надо разобратся что такое b

блин не, эт не работает... нука попробую через дестроевский способ..

Добавлено через 20 минут
о, а дестроевский робит)

Добавлено через 8 минут
procedure SendPacketHook(np:TSendPacket); stdcall;
var
p:pointer;
data:array of pointer;
i:integer;
begin
try
SetLength(data,length(np.size));
p:=@np;
p:=Pointer(Cardinal(p)+$0C);
data[0]:=@np.id;
for i:=1 to length(np.size) do
begin
data:=p;
p:=pointer(Cardinal(p)+4);
end;
messagebox(0,PChar(inttohex(np.id,2)+'; '+np.size),'FromClient',0);
except
messagebox(0,PChar('error'),'FromClient',0);
end;
end;

вот короче как-то так

[I]Добавлено через 26 минут
if length(data)>1 then
for i:=length(data)-1 downto 1 do
asm
push data[i]
end;
asm
push data[0]
push np.size
push np.unknown
jmp SendPacketOrig
end;

блин, опять херня какая-то(

alexteam
30.01.2011, 22:12
омг. аццкий код.
if np.size[(length(np.size)-1)-i]='c' then j:=0;
if np.size[(length(np.size)-1)-i]='h' then j:=1;
if np.size[(length(np.size)-1)-i]='d' then j:=2;
if np.size[(length(np.size)-1)-i]='f' then j:=3;
if np.size[(length(np.size)-1)-i]='s' then j:=4;
if np.size[(length(np.size)-1)-i]='b' then j:=5;
if np.size[(length(np.size)-1)-i]='q' then j:=6;
//и остальной бред %)


b - это блок бинарных данных.

supernewbie
30.01.2011, 23:54
скажи лучше что ему не нравится в стеке)

Добавлено через 2 минуты
вот пакет на открытие инвентаря, ему нужно то тока передать строку размера, ид пакета да поинтер на че-та

asm
push c
push np.size
push np.unknown
jmp [SendPacketOld]
end;

и ничерта(

Добавлено через 11 минут
че-то мне кажется я прыгаю не туда)

Добавлено через 11 минут
помогите(

Добавлено через 17 минут
ПОМОГИТЕ

Добавлено через 47 минут
TSendPacket = packed record
unknown:pointer;
size:pchar;
id:byte;
end;

procedure SendPacketHook2(np:TSendPacket;data:array of pointer); stdcall;
var
i:integer;
c:cardinal;
begin
c:=np.id;
if length(data)>1 then
for i:=length(data)-1 downto 1 do
asm
push data[i]
end;
asm
push c
push np.size
push np.unknown
jmp [SendPacketOld]
end;
end;

procedure SendPacketHook(np:TSendPacket); stdcall;
var
p:pointer;
data:array of pointer;
i:integer;
s:string;
c:cardinal;
spobj:Pointer;
begin
try
c:=np.id;
SetLength(data,length(np.size));
p:=@np;
p:=Pointer(Cardinal(p)+$0C);
s:='';
data[0]:=@np.id;
if length(np.size)>1 then
for i:=1 to length(np.size)-1 do
begin
data[i]:=p;
s:=s+inttostr(integer(p^))+'; ';
p:=pointer(Cardinal(p)+4);
end;
messagebox(0,PChar(inttohex(np.id,2)+'; '+np.size+'; '+s),'FromClient',0);
except
messagebox(0,PChar('error'),'FromClient',0);
end;
SendPacketHook2(np,data);
end;

попалите что не так тут(

Yegor
31.01.2011, 00:09
Ну и где ты тут передаешь "строку" размера и поинтер на что то?

Prixmegently
31.01.2011, 00:54
почитай http://coderx.ru/showthread.php?t=1077 . Все разжевано уже. И на сях и на паскале.

supernewbie
31.01.2011, 01:38
Ну и где ты тут передаешь "строку" размера и поинтер на что то?
push np.size
push np.unknown

Добавлено через 5 минут
почитай http://coderx.ru/showthread.php?t=1077 . Все разжевано уже. И на сях и на паскале.
в каком месте там разжеван СендПакет на паскале?

Yegor
31.01.2011, 01:39
supernewbie, там нужно в стек положить указатель на символьную строку

supernewbie
31.01.2011, 02:08
ну а я на какую кладу то епт?

TSendPacket = packed record
unknown: pointer;
size: pchar;
id:byte;
end;

(np:TSendPacket)

push np.size


Добавлено через 23 минуты
да помогите же мне(

Prixmegently
31.01.2011, 02:31
push params;
push format;
push object;
call func;

---

какой тебе пакет именно надо?

supernewbie
31.01.2011, 02:50
я поставил хук в сендпакете, все что мне надо, это чтобы данные нормально проходили через мою стдкалл процедуру и возвращались в клиент

Yegor
31.01.2011, 02:56
supernewbie, зачем тебе хук в сенд пакете? ты хочешь трафик от клиента на сервер прчитать?

Prixmegently
31.01.2011, 02:56
ну тогда выбирай из стека параметры, парси их как хочешь, клади обратно в стек и вызывай оригинал. вообще на паскале по-моему это все не удобно делать. там есть cdecl?

supernewbie
31.01.2011, 03:00
ну тогда выбирай из стека параметры, парси их как хочешь, клади обратно в стек и вызывай оригинал. вообще на паскале по-моему это все не удобно делать. там есть cdecl?

а что я по-твоему делаю?( посмотри код

supernewbie, зачем тебе хук в сенд пакете? ты хочешь трафик от клиента на сервер прчитать?
именно

Yegor
31.01.2011, 03:10
supernewbie, там сложный формат для парсенья, я вчера почти до утра сидел делал на с++ разбор пакета, замахался с указателями на указатель )))

вот почитай об формате параметров для SendPacket http://coderx.ru/showpost.php?p=89601&postcount=28

supernewbie
31.01.2011, 03:12
ну вот посмотри как я сделал, впринципе я просто передаю параметры, что может быть не так?

Prixmegently
31.01.2011, 03:17
твой код разбирать влом, честно говоря. если хочешь, могу в аське попробовать рассказать что там и как. кстати на плюсах это сделать легко с va_list;

supernewbie
31.01.2011, 03:20
эх, неужели придется переходить на си, кстати, нет какого-нибудь учебника в роде "С delphi на C++", где подробно приводятся примеру кода на си, а потом на делфе, я вот например просто не знаю даже синтексиса си и поэтому маюсь с этим ***дством(

Prixmegently
31.01.2011, 03:20
на делфи тоже можно сделать.

supernewbie
31.01.2011, 03:21
дя?) ну тогда давай аську в личку)

destructor
31.01.2011, 04:35
народ подтягивается:D

supernewbie
31.01.2011, 23:48
ничерта короче не получается(

destructor
01.02.2011, 00:44
что именно не получается?

supernewbie
01.02.2011, 01:14
да я всё пытаюсь параметры из стека достать в переменные, потом обратно в стек засунуть, но делфи упорно срет в стек мне

пытаюсь решить проблему, через va_list, но че-то хз как с ним работать

Добавлено через 12 минут
я щас опять буду орать "помогите", ну че делать с этой хренью

Yegor
01.02.2011, 01:52
supernewbie, ты вроде там защиту пытался обойти леймгварда, он что тебе дал хукнуть сендпакет?

destructor
01.02.2011, 02:10
память:

1
2
3
4
5
6
7
8 < тут и ВЫШЕ твой компилятор делает push и остальную хрень
9 < тут хрень, этот адрес получаем так: asm mov stackaddr, ebp;
10 < тут адрес возврата, я тебе стопицот раз писал чтобы ты нагуглил пример как его достать.
11 < тут параметр1
13 < тут параметр2
14 < тут параметр3
15 < и так далее
16

Добавлено через 4 минуты
9 < тут хрень
зная этот адрес можем к нему прибавить Х и получить другой адрес:
11 < тут параметр1

supernewbie
01.02.2011, 05:15
только все равно ничерта не работает...

procedure HookSendPacket; stdcall
begin
asm
mov eax, [ebp+8]
mov this, eax
mov eax, [ebp+12]
mov format, eax
end;
k:=0;
asm
mov eax, [ebp+16];
mov tmp1, eax
end;
for i := 0 to length(format)-1 do
begin
if (format = 'Q') or (format[i] = 'b') then
begin
params[k] := pointer(Integer(tmp1)+(k*4));
params[k+1] := pointer(integer(tmp1)+(k*4)+4);
Inc(k, 2);
end
else
begin
params[k] := pointer(integer(tmp1)+(k*4));
Inc(k);
end;
end;
MessageBoxA(0, format, 'FromClient', 0);
asm
jmp origSendPacket;
end;
end;

[I]Добавлено через 27 минут
ДА ПОМОГИТЕ КТО-НИБУДЬ

destructor
01.02.2011, 08:57
begin
asm
mov eax, [ebp+8]
mov this, eax
mov eax, [ebp+12]
mov format, eax
end;эт чо?

Добавлено через 11 секунд
asm
mov eax, [ebp+16];
mov tmp1, eax
end;а это?

Добавлено через 59 секунд
for i := 0 to length(format)-1 do
begin
if (format[i] = 'Q') or (format[i] = 'b') then
begin
params[k] := pointer(Integer(tmp1)+(k*4));
params[k+1] := pointer(integer(tmp1)+(k*4)+4);
Inc(k, 2);
end
else
begin
params[k] := pointer(integer(tmp1)+(k*4));
Inc(k);
end;
это ваще чо?

supernewbie
01.02.2011, 21:14
))

1. Сохраняю указатель на this и pchar строку формата пакета

2. сохраняю адрес первого параметра в tmp1

3. раскладываю параметры по массиву

Добавлено через 2 часа 41 минуту
ПОМОГИТЕ КТО-НИБУДЬ

Добавлено через 1 час 16 минут
получилось

Yegor
01.02.2011, 22:59
supernewbie, дак и что не получается? удалось хоть 1байтную команду вызывать, напрмер показать инвертарь?

supernewbie
02.02.2011, 00:31
да мне не вызвать надо было, а хук поставить и парсить пакет без гавняканья стека, но щас не об этом, это сделал

---



проблема в том, что есть 2% шанс что что-то пойдет не так, не знаю что именно, но клиент крашится

procedure ParsingFromServer;
var
np:PNetworkPacket;
s:string;
p:pointer;
begin
try
np:=tmp1;
s:=IntToHex(np.id,2)+' ';
if np.size>0 then
for i:=0 to np.size-1 do
begin
p:=Pointer(cardinal(np.data)+(i*1));
s:=s+IntToHex(byte(p^),2)+' ';
end;
except
s:=s+'ERROR PACKET';
end;
end;

procedure AddNetworkQueue_hook; stdcall;
begin
asm
mov tmpPointer, ecx
mov eax, [esp+4]
mov tmp1, eax
end;
ParsingFromServer; //если убрать вызов парсера то всё ок
asm
mov ecx, tmpPointer
jmp AddNetworkQueue_origAddr
end;
end;

шо делать пасаны?

стек ведь должен очищатся после вызова парсера, что опять может быть?

Добавлено через 30 минут
короче если в парисинге делать даже цикл в котором
s:=s+' '; то уже креш может быть, втф?

destructor
02.02.2011, 00:42
mov eax,* [esp+4]
mov tmp1, eax
вротмненоги, убери это

Добавлено через 45 секунд
procedure AddNetworkQueue_hook; stdcall; это функция и у нее есть параметр, пропиши его и все извращения со стеком компилятор сделает сам

Добавлено через 1 минуту
важна только эта строчка
mov tmpPointer, ecx

supernewbie
02.02.2011, 00:44
лучше скажи, что делать, т.к. по ходу, если я долго обрабатываю пакет то идет крит

destructor
02.02.2011, 00:50
лучше скажи, что делать,
пропиши его и все извращения со стеком компилятор сделает самау

Добавлено через 1 минуту
еще вызов так сделай

push param;
mov ecx, tmpPointer
call [AddNetworkQueue_origAddr]

supernewbie
02.02.2011, 00:55
тоже самое, крит идет в гиране при прогрузе

destructor
02.02.2011, 00:57
AddNetworkQueue_hookпоказывай что получилось

supernewbie
02.02.2011, 00:58
procedure AddNetworkQueue_hook(np:PNetworkPacket); stdcall;
begin
asm
mov tmpPointer, ecx
end;
ParsingFromServer(np);
asm
push np;
mov ecx, tmpPointer
call [AddNetworkQueue_origAddr]
end;
end;

destructor
02.02.2011, 01:00
ParsingFromServer(np);зачем эта хрень, если ты имееш полный доступ к пакету?

supernewbie
02.02.2011, 01:02
всмысле? если делать парсинг прямо в хук процедуре то стек загадится же

destructor
02.02.2011, 01:05
нафига тебе тут нужен стек?

Добавлено через 1 минуту
np:PNetworkPacket тут все есть, в стек лазить не надо

supernewbie
02.02.2011, 01:05
тут это где? ну тут впринципе да, тут всего один поинтер... но криты не из-за этого, наверное... думаешь надо перенести?

destructor
02.02.2011, 01:13
у тебя маниакальная привычка все усложнять.

Добавлено через 1 минуту
потренеруйся на любой __stdcall функции с одним параметром
тут отличие только сохранить регистр ecx

Добавлено через 1 минуту
procedure функция!!! возвращает integer

supernewbie
02.02.2011, 01:20
у тебя маниакальная привычка все усложнять.

Добавлено через 1 минуту
потренеруйся на любой __stdcall функции с одним параметром
тут отличие только сохранить регистр ecx
потренироватся в чём?
Добавлено через 1 минуту
функция!!! возвращает integer

так всё ок:
function AddNetworkQueue_hook(np:PNetworkPacket): integer; stdcall;
begin
asm
mov tmpPointer, ecx
end;
ParsingFromServer(np);
asm
push np;
mov ecx, tmpPointer
call [AddNetworkQueue_origAddr]
end;
end;


так всё не ок:
function AddNetworkQueue_hook(np:PNetworkPacket): integer; stdcall;
var
s:string;
p:pointer;
b:byte;
begin
asm
mov tmpPointer, ecx
end;
try
s:=IntToHex(np.id,2)+' ';
if (np.size>0) and (np.size<6000) then
for i:=0 to np.size-1 do
begin
p:=Pointer(cardinal(np.data)+i);
b:=Byte(p^);
s:=s+IntToHex(b,2)+' ';
end;
writeLn('FromServer:'+s);
except
end;
asm
push np;
mov ecx, tmpPointer
call [AddNetworkQueue_origAddr]
end;
end;

но при этом проблема с критами всё равно осталась!