PDA

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


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

destructor
02.02.2011, 01:22
try
except
end;

нафига?

supernewbie
02.02.2011, 01:25
малоли, но без них также всё

destructor
02.02.2011, 01:27
вот убери это и посмотри что изменилось через ida

Добавлено через 22 секунды
но без них также всёхм... уверен?

supernewbie
02.02.2011, 19:38
посмотрел, да вроде не сильно изменилось

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

Добавлено через 59 минут
кто-нибудь(

Добавлено через 8 минут
всё, я понял в чем ошибка, в парсинге создавалась стринг строка пакета, ей выделялась память, и видимо как-то лажова выделялась, и всё крашилось, поэтому вопрос, как сделать стринг строку с выделенной памятью?

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

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

Добавлено через 42 минуты
чуваки, неужели ни у кого не было таких проблем с выделением памяти? может это из-за того что я пишу всё на делфи? раз уж на то пошло, то может проще просто экспортировать данные из л2 в другое приложение?

Добавлено через 1 час 5 минут
странно, динамический массив работает нормально, а при создании стринг строки всё критует, странно че-то

Добавлено через 1 минуту
ууу, понял... тут определенно какие-то проблемы!

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

Добавлено через 11 минут
помогите кто-нибудь, что происходит!!!

destructor
02.02.2011, 20:05
о если выделять память на каждую ячейку в циклеза такое на кострах раньше жгли.

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

еще ты знаеш максимальный размер пакета, и можно сделать буфер заранее

supernewbie
02.02.2011, 20:27
как выделять память? как сделать буфер?

destructor
02.02.2011, 20:36
http://www.google.ru/search?client=opera&rls=ru&q=%D0%BA%D0%B0%D0%BA+%D0%B2%D1%8B%D0%B4%D0%B5%D0%B B%D0%B8%D1%82%D1%8C+%D0%BF%D0%B0%D0%BC%D1%8F%D1%82 %D1%8C+delphi&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest

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

alexteam
02.02.2011, 21:05
var
buf : array of byte;
begin
setlength(buf, SIZE);
????
profit!

supernewbie
02.02.2011, 21:33
да, но у меня то стринг строка)

Добавлено через 14 минут
ведь по факту

for i:=0 to 500 do
s:=s+inttostr(i);

это тоже самое что выделять в массиве ячейки в цикле!

Morfik
02.02.2011, 21:52
supernewbie,
почему именно адднетворкквери?
я в ней если чтото и делаю то маневры вообще не требующие вычислений типа установить каконеть эвент или сбросить флаги или непропустить пакет.

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

supernewbie
02.02.2011, 23:14
хм, интересно что туда передается

Добавлено через 18 минут
мне показалось или туда идет указатель на указатель на нетворк пакет)

Добавлено через 22 минуты
че-то хукнул диспатч нетворк, не дает никуда ничего сделать) вызываю процедуры свои - крит

Добавлено через 14 минут
блин, че за фигня, как будто состав нетворк пакета изменился!

Добавлено через 2 минуты
public: virtual int __thiscall UNetworkHandler::DispatchNetworkQueue(struct NetworkPacket * *)

public: virtual int __thiscall UNetworkHandler::AddNetworkQueue(struct NetworkPacket *)

вроде у обоих один хрен, только у одного указатель на пакет, а у другого указатель на указатель на пакет, соответственно

PPNetworkPacket =^PNetworkPacket;
PNetworkPacket =^TNetworkPacket;
TNetworkPacket = packed record
id: byte;
res: byte;
id2: Smallint;
size: Cardinal;
data: Pointer;
end;

как у них может быть разное содержимое? что происходит?

Добавлено через 3 минуты
странно, почему он вызывается постоянно! это странно

причем параметр 0 всегда, хм

Добавлено через 2 минуты
да что же происходит то

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

Morfik
02.02.2011, 23:34
supernewbie, туда приходит параметром указатель, изначально равный нулю, где после вызова оригинала будет лежать адрес указателя где лежит пакет, тоесть работать с ним нужно после вызова оригинала.

А постоянно вызывается это как раз игра пакеты пришедшие забирает.

я чет тоже с ним копался так до ума и недовел)

supernewbie
03.02.2011, 01:18
как туда может приходить 0 и выходить не 0? что за черт возьми мать твою)) ну ладно, попытаюсь хукнуть в конце

Добавлено через 2 минуты
внатуре же, тока там не указатель равен нулю, а по указателю 0 лежит...

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

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

Добавлено через 2 минуты
function SizeOfProc(Proc: pointer): dword; надеюсь эта штука работает

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

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

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

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

Добавлено через 10 минут
блин нет, я явно что-то не так делаю, т.к. криты становятся просто РЕЖЕ, как вообще нужно выделять память в чужом приложении для своей дллки в нем?

Добавлено через 27 минут
я уже не знаю, НУ ЧТО тут может быть не так

procedure Proc;
var
i:integer;
s,s1:string;
j:cardinal;
begin
s:='';
if PacketsFromServer.Count>0 then
begin
with TFullPacketServer(PacketsFromServer.Items[0]) do
begin
j:=3;
if id2<>-1 then inc(j,6);
SetLength(s,length(s)+(length(data)*3)+j);
s1:=IntToHex(id,2);
s[1]:=s1[1];
s[2]:=s1[2];
s[3]:=' ';
if id2<>-1 then
begin
s1:=IntToHex(id2,4);
s[4]:=s1[1];
s[5]:=s1[2];
s[6]:=' ';
s[7]:=s1[3];
s[8]:=s1[4];
s[9]:=' ';
end;
for i:=0 to length(data)-1 do
begin
s1:=inttohex(data[i],2);
s[j+1]:=s1[1];
s[j+2]:=s1[2];
s[j+3]:=' ';
inc(j,3);
end;
end;
Writeln('FromServer:'+s);
PacketsFromServer.Delete(0);
end;
end;

Morfik
03.02.2011, 01:22
скажи внятно чего ты хочеш добится от перехваченого пакета?)

supernewbie
03.02.2011, 01:25
сделать из него стринг строку и вывести в консоль

Morfik
03.02.2011, 01:41
ммм, попробуй оставить свои мего операции со стрингом, но закоментить writeLn - будет крит или нет

supernewbie
03.02.2011, 02:05
будет, проверял всё что можно, убираю цикл в котором идет заполнение строки - нету крита

Yegor
03.02.2011, 02:45
supernewbie, у тебя процедура Proc вместо SendPacket что ли вызывается? Если да то где сохранение восстановление важных регистров?

supernewbie
03.02.2011, 02:50
госпади

нате всё че есть

procedure Proc;
var
i:integer;
s,s1:string;
j:cardinal;
begin
s:='';
if PacketsFromServer.Count>0 then
begin
with TFullPacketServer(PacketsFromServer.Items[0]) do
begin
j:=3;
if id2<>-1 then inc(j,6);
SetLength(s,length(s)+(length(data)*3)+j);
s1:=IntToHex(id,2);
s[1]:=s1[1];
s[2]:=s1[2];
s[3]:=' ';
if id2<>-1 then
begin
s1:=IntToHex(id2,4);
s[4]:=s1[1];
s[5]:=s1[2];
s[6]:=' ';
s[7]:=s1[3];
s[8]:=s1[4];
s[9]:=' ';
end;
for i:=0 to length(data)-1 do
begin
s1:=inttohex(data[i],2);
s[j+1]:=s1[1];
s[j+2]:=s1[2];
s[j+3]:=' ';
inc(j,3);
end;
end;
Writeln('FromServer:'+s);
PacketsFromServer.Delete(0);
end;
end;

procedure ParsingFromServer(curpck:PNetworkPacket); stdcall;
var
p:pointer;
b:byte;
data1:arrayofbyte;
i:integer;
//s:PChar;
//s:string;
begin
SetLength(data1,curpck.size);
if (curpck.size>0) and (curpck.size<3000) then
for i:=0 to curpck.size-1 do
begin
p:=Pointer(cardinal(curpck.data)+i);
b:=Byte(p^);
data1[i]:=b;
end;
PacketsFromServer.Add(TFullPacketServer.create(cur pck,data1));
Proc;
SetLength(data1,0);
//writeLn('FromServer:'+data); }
//writeln('ïàðñþ '+inttostr(curpck.size));//iteln('ïàðñþ ');
end;

procedure AddNetworkQueue_hook(np:PNetworkPacket); stdcall;
begin
asm
pushad
end;
ParsingFromServer(np);
asm
popad;
push np;
call [AddNetworkQueue_origAddr]
end;
end;

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

Yegor
03.02.2011, 03:18
supernewbie,

1. если в процедуре proc закоментить вообще все то все равно крашится ?

2. procedure AddNetworkQueue_hook(np:PNetworkPacket); stdcall;
что это? stdcall; в делфи не соответвует соглашению stdcall в с++

И вообще функция UNetworkHandler::AddNetworkQueue(struct NetworkPacket *) идет thiscall, ты используешь специальный переходник для корректного вызова функции AddNetworkQueue_hook?

supernewbie
03.02.2011, 03:22
крашится причем от раза к разу, иногда может пропустить 1000 пакетов, иногда после первого крит, если не вызывать Прок то всё окей, но по-моему всё также окей если убрать это

for i:=0 to length(data)-1 do
begin
s1:=inttohex(data,2);
s[j+1]:=s1[1];
s[j+2]:=s1[2];
s[j+3]:=' ';
inc(j,3);
end;


[I]Добавлено через 1 минуту
supernewbie,

1. если в процедуре proc закоментить вообще все то все равно крашится ?

2. procedure AddNetworkQueue_hook(np:PNetworkPacket); stdcall;
что это? stdcall; в делфи не соответвует соглашению stdcall в с++

И вообще функция UNetworkHandler::AddNetworkQueue(struct NetworkPacket *) идет thiscall, ты используешь специальный переходник для корректного вызова функции AddNetworkQueue_hook?

в тиз кале надо то тока чтобы указатель был в ecx, pushad popad и дело в шляпе)

Yegor
03.02.2011, 03:43
supernewbie, а что в логе видно? Может крашистя при каком то определенном пакете. Перед крашем успевает хоть что то вывести в консоль? Может быть вылетает когда curpck.size = 0?

Добавлено через 7 минут
И еще покажи как ты описал структуру PNetworkPacket

supernewbie
03.02.2011, 03:57
да также епт, с форума же взял...

PNetworkPacket =^TNetworkPacket;
TNetworkPacket = packed record
id: byte; // ID ïàêåòà
res: byte; // òóò íè÷åãî íóæíîãî íåò
id2: Smallint; // âòîðîé ID åñëè åñòü
size: Cardinal; // ðàçìåð äàííûõ
data: Pointer; // óêàçàòåëü íà äàííûå
end;

Добавлено через 34 секунды
откуда мне знать, то что выведенно перед крашем или после) ну щас паоставлю проверочки...

Добавлено через 4 минуты
опачки, поставил щас try except, Proc выдала ошибку, ищу чозанах

Yegor
03.02.2011, 03:58
supernewbie, а на самом деле:

PNetworkPacket =^TNetworkPacket;
TNetworkPacket = packed record
id: byte; // ID ïàêåòà
res: byte; // òóò íè÷åãî íóæíîãî íåò
id2: Smallint; // âòîðîé ID åñëè åñòü
size: Smallint; // ðàçìåð äàííûõ
res2: Smallint;
data: Pointer; // óêàçàòåëü íà äàííûå
end;

Если res2 будет равно нулю то конечно пофиг но мало ли какой туда мусор попадет.

supernewbie
03.02.2011, 04:38
внатуре? нука...

Добавлено через 57 секунд
серв лег, но я уверен что ошибка было в этом, и я читал данные из жопы и переводил в байты

Добавлено через 1 минуту
кстати, что за рес? рес2

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

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

Добавлено через 2 минуты
особенно при прогрузе ошибки, хотя бывают и просто так, по-моему это связанно с тем что клиент что-то подгружает в память (локацию, модели нпс\игроков, эффекты, ещё что-то) а в это время я обрабатываю пакет и крит, ну не знаю я( почему( за что, госпади((

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


j:=3;
if id2<>-1 then inc(j,6);
SetLength(s,length(s)+(length(data)*3)+j);
s1:=IntToHex(id,2);
s[1]:=s1[1];
s[2]:=s1[2];
s[3]:=' ';
if id2<>-1 then
begin
s1:=IntToHex(id2,4);
s[4]:=s1[1];
s[5]:=s1[2];
s[6]:=' ';
s[7]:=s1[3];
s[8]:=s1[4];
s[9]:=' ';
end;
if Length(data)>0 then
for i:=0 to length(data)-1 do
begin
s1:=inttohex(data,2);
s[j+1]:=s1[1];
s[j+2]:=s1[2];
s[j+3]:=' ';
inc(j,3);
end;

[I]Добавлено через 7 минут
неужели мне никто не поможет (

Добавлено через 1 минуту
как странно, такое ощущение что л2 просто пишет в мою память!

Yegor
03.02.2011, 04:44
supernewbie, определись на 100 процентов в каком участке кода выдает ошибку, ну не может л2 писать в твою память если ты ее резервируешь, пусть даже методами делфи.

supernewbie
03.02.2011, 04:48
*ля! на руофе не критует, что с этим сервером или клиентом не так то мать вашу!!!

Добавлено через 32 секунды
ацтой...

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

Yegor
03.02.2011, 04:49
вот на руофе и тестируй раз не критует )))

supernewbie
03.02.2011, 04:52
но мне то надо тестировать криты))
реально, есть какие мысли? мб это из-за нубской защиты которая стоит на сервере нашем? интересно как она перехватывает создание стринг строки, блин, это странно

Добавлено через 44 секунды
почему именно стринг... тут что-то не так... о госпади, неужели вылетело

Добавлено через 1 минуту
нука нука... кажетСЯ ДА ДА ДА КРИТ НА РУОФЕ И О БОЖЕ, в консоли закарючки

supernewbie
03.02.2011, 04:53
я их заскринил

supernewbie
03.02.2011, 05:26
госпади, что же это

заметьте, первое число всегда 0, хм

а если

Добавлено через 8 минут
я кажется понял

вот такой код в делфи работает правельно, но потом идет ошибка

var
b:byte;
i:integer;
p:pointer;
begin
i:=-1;
p:=@b;
integer(p^):=i;
messagebox(0, pchar(inttohex(b,2)), ' ', 0); //показывает FF
//потом ошибка

end;

Добавлено через 2 минуты
что значит?
[Warning] my_hook_dll.dpr(218): Combining signed and unsigned types - widened both operands

Добавлено через 2 минуты
нашел... ничего особенного...

Добавлено через 3 минуты
боже, ошибка внатуре кажется появляется при определенных пакетах

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

Добавлено через 11 минут
я нашел эту с*ку

ГОСПАДИ, ТО ЧТО В ЭТОМ ПАКЕТЕ, ОНО ДАЖЕ НЕ ВСТАВЛЯЕТСЯ

Добавлено через 31 секунду
это надо видеть, боже да что же это

supernewbie
03.02.2011, 05:26
боже, что это за МОНСТР

supernewbie
03.02.2011, 06:20
егорка, короче надо искать ошибки в моём коде)

Добавлено через 8 минут
или может это сервак обгавняканые пакеты шлет?

Добавлено через 34 минуты
да нет, бред всё это... убрал IntToHex, сделал

procedure Proc;
var
i:integer;
s,s1:string;
j,k:integer;
begin
try
s:='';
k:=FixLog.Add(s);
FixLog.SaveToFile('E:\FixLog.txt');
i:=0;
if PacketsFromServer.Count>0 then
begin
try
with TFullPacketServer(PacketsFromServer.Items[0]) do
begin
try
j:=3;
if id2<>-1 then inc(j,6);
SetLength(s,length(s)+(length(data)*3)+j);
except
MessageBox(0, 'Proc\Memory', '', 0);
end;
try
//s1:=IntToHex(id,2);
s1:='23';
s[1]:=s1[1];
s[2]:=s1[2];
s[3]:=' ';
FixLog[k]:=s;
FixLog.SaveToFile('E:\FixLog.txt');
if id2<>-1 then
begin
//s1:=IntToHex(id2,4);
s1:='4455';
s[4]:=s1[3];
s[5]:=s1[4];
s[6]:=' ';
s[7]:=s1[1];
s[8]:=s1[2];
s[9]:=' ';
FixLog[k]:=s;
FixLog.SaveToFile('E:\FixLog.txt');
end;
if Length(data)>0 then
for i:=0 to length(data)-1 do
begin
//s1:=inttohex(data,2);
s1:='12';
//FixLog.SaveToFile('E:\FixLog.txt');
if not FixCheck(s1) then MessageBox(0, 'FATAL ERROR', '', 0);
if (id=$FE) and (i>0) and not FixCheck(s1) then MessageBox(0, PChar(s1), '', 0);
s[j+1]:=s1[1];
s[j+2]:=s1[2];
s[j+3]:=' ';
inc(j,3);
FixLog[k]:=s;
FixLog.SaveToFile('E:\FixLog.txt');
end;
except
MessageBox(0, pchar('Proc\create s; size:'+inttostr(size)+'; i:'+inttostr(i)+' data length:'+inttostr(length(data))), 'ERROR', 0);
end;
try
Writeln('FromServer: size:'+inttostr(size)+': '+s);
except
MessageBox(0, 'Proc\Writeln', 'ERROR', 0);
end;
PacketsFromServer.Delete(0);
end;
except
MessageBox(0, 'Proc', 'ERROR', 0);
Writeln('FromServer:ERROR');
PacketsFromServer.Delete(0);
end;
end;
except
MessageBox(0, 'Proc', 'ERROR', 0);
end;
end;

и всё равно криты, убрал вызов Proc - не критует, так что всё это бред и клиент жмёт память для моих строк или еще че-то, но то что ошибка из-за памяти это 100%

[I]Добавлено через 3 минуты
supernewbie, определись на 100 процентов в каком участке кода выдает ошибку, ну не может л2 писать в твою память если ты ее резервируешь, пусть даже методами делфи.
что значит резервировать память? может я чего-то не делаю? короче всё, 100% он жмёт память, т.к. щас выдало эксцепт в этом коде

try
SetLength(data1,curpck.size);
for i:=0 to curpck.size-1 do
begin
p:=Pointer(cardinal(curpck.data)+i);
b:=Byte(p^);
data1[i]:=b;
end;
PacketsFromServer.Add(TFullPacketServer.create(cur pck,data1));
except
MessageBox(0, 'ParsingFromServer', 'ERROR', 0);
end;

как вообще нужно "резервировать" память?

vahes
03.02.2011, 12:02
http://www.compdoc.ru/prog/pascal/bp70/bp70ug_08.shtml

supernewbie
03.02.2011, 20:16
короче не знаю, переделал все типы в указатели, указатели на массив байтов, указатель на стринг, выделяю им память GetMem, освобождаю FreeMem, всё равно тоже самое

Добавлено через 2 минуты
эм, еще и указатель на TList делать. грейт

alexteam
03.02.2011, 20:18
кстати.
PacketsFromServer.Add(TFullPacketServer.create(cur pck,data1));

глупа.
в конструктор -
PacketsFromServer.add(self);
и в деструктор
PacketsFromServer.remove(self);

supernewbie
03.02.2011, 20:21
да что за гавно тут происходит

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

data1:parrayofbyte;

parrayofbyte=^arrayofbyte;
arrayofbyte=array of byte;
try
GetMem(data1,150000000);
SetLength(data1^,curpck.size);
except
MessageBox(0, 'ParsingFromServer0', 'ERROR', 0);
end;

ну ЧТО тут не так бл*ть

destructor
03.02.2011, 20:22
может с длинной пакета бага какая?

supernewbie
03.02.2011, 20:23
хм, врятли... т.к. щас вообще эксцепты на пустом месте пошли

destructor
03.02.2011, 20:23
* GetMem(data1,150000000);
* SetLength(data1^,curpck.size);точно хз, но помоему бред

supernewbie
03.02.2011, 20:25
ну а как, как мать перемать эту память то выделять? ох *ля(

destructor
03.02.2011, 20:28
virtualalloc?
heapalloc?

Добавлено через 45 секунд
только ненадо это делать при каждом входящем пакете

supernewbie
03.02.2011, 21:13
heapalloc? это освободить?

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

Добавлено через 5 минут
procedure ParsingFromServer(curpck:PNetworkPacket); stdcall;
var
p:pointer;
b:byte;
i:cardinal;
s,s1:string;
begin
VirtualAlloc(@s,150000,0,0);
VirtualAlloc(@s1,1500,0,0);
with curpck^ do
begin
s:=inttohex(ID,2)+' ';
if id2<>-1 then
begin
s1:=inttohex(ID2,4);
s:=s+s1[3]+s1[4]+' '+s1[1]+s1[2]+' ';
end;
for i:=0 to size-1 do
begin
p:=Pointer(cardinal(curpck.data)+i);
b:=Byte(p^);
s:=s+inttohex(b,2)+' ';
end;
writeln('FromServer:'+s);
end;
end;

критки, как правильно выделять память? 1 раз выделить? тогда как проверить что у строк не выделенна память?

Добавлено через 4 минуты
помогите, госпади, за что мне это((

Добавлено через 10 минут
эпик

2011.2.3 22:02:36
OS : Windows XP x64 5.2 (Build: 3790)
CPU : AuthenticAMD AMD Athlon(tm) 64 X2 Dual Core Processor 6000+ @ 3017 MHz 4094MB RAM
Video : NVIDIA GeForce 9800 GT (9745)
PosCode : LS2(216) 47896:186808:-3486 2/1 [392]

Insufficient Memory.
Please check the Virtual Memory Option and avilable hard drive space.
You can check them by going to : Control Panel->System->Advanced->Performance->Settings->Advanced->Virtual memory.

History: FMallocWindows::Malloc <- Size 1081728 FArray <- FMallocWindows::Realloc <- 00000000 1081728 FArray <- FArray::Realloc <- 90144*12 <- ATerrainInfo::UpdateVertices <- ATerrainInfo::UpdateVTGroup <- ATerrainInfo::PostLoad <- UObject::ConditionalPostLoad <- (TerrainInfo 21_24.TerrainInfo0) <- PostLoadObjects <- UGameEngine::LoadMapThread::ActorLoading <- UGameEngine::LoadMapThread <- RunLoadMap <- MessagePump <- MainLoop

Добавлено через 50 секунд
ПАНИКА, ЧТО ДЕЛАТЬ ГОСПАДИ

Добавлено через 4 минуты
добавил в begin end.
VirtualAlloc(@s,150000,0,0);
VirtualAlloc(@s1,150000,0,0); и сделал s и s1 глобальными переменными

procedure ParsingFromServer(curpck:PNetworkPacket); stdcall;
var
p:pointer;
b:byte;
i:cardinal;
begin
s:='';
with curpck^ do
begin
s:=inttohex(ID,2)+' ';
if id2<>-1 then
begin
s1:=inttohex(ID2,4);
s:=s+s1[3]+s1[4]+' '+s1[1]+s1[2]+' ';
end;
if size>0 then
for i:=0 to size-1 do
begin
p:=Pointer(cardinal(curpck.data)+i);
b:=Byte(p^);
s:=s+inttohex(b,2)+' ';
end;
writeln('FromServer:'+s);
end;
s:='';
end;

всё равно криты, но уже о том что ошибка в обработке какого-то пакета

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

Добавлено через 5 минут
понял, крит будет через n-ое кол-во пакетов, 100%, и это странно

destructor
03.02.2011, 21:14
только ненадо это делать при каждом входящем пакетеPlease check the Virtual Memory Option and avilable hard drive space.кончилась память

supernewbie
03.02.2011, 22:20
ну щас я так не делаю! но всё-равно из-за чего-то идет ошибка, дестр, помоги((

Добавлено через 1 минуту
var
s,s1:string;

procedure ParsingFromServer(curpck:PNetworkPacket); stdcall;
var
p:pointer;
b:byte;
i:cardinal;
begin
s:='';
with curpck^ do
begin
s:=inttohex(ID,2)+' ';
if id2<>-1 then
begin
s1:=inttohex(ID2,4);
s:=s+s1[3]+s1[4]+' '+s1[1]+s1[2]+' ';
end;
if size>0 then
for i:=0 to size-1 do
begin
p:=Pointer(cardinal(curpck.data)+i);
b:=Byte(p^);
s:=s+inttohex(b,2)+' ';
end;
writeln('FromServer:'+s);
end;
s:='';
end;

begin
VirtualAlloc(@s,150000,0,0);
VirtualAlloc(@s1,150000,0,0);
end.


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

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

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

Добавлено через 2 минуты
кто-нибудь...

destructor
03.02.2011, 23:45
сделай в обработчике пакетов чтобы выводил только ид и размер

Добавлено через 1 минуту
s:=s+inttohex(b,2)+' ';это сомнительная операция в цикле

supernewbie
04.02.2011, 00:39
так вроде нормально всё, щас оставлю на минут 15

Добавлено через 4 минуты
блин, ну всё вылетает, только вот, ставлю перехват когда в игру уже зашел -> при тп нету крита, ставлю в самом начале -> при прогрузе крит

и постоянно эксцепты на этих местах

try
SetLength(data1,curpck.size);
except
MessageBox(0, 'ParsingFromServer0', 'ERROR', 0);
end;

try
//PacketsFromServer.Add(TFullPacketServer.create(cur pck,data1));
//PacketsFromServer.Add(TFullPacketServer.create(cur pck,data1));
ParsingFromServer(PacketsFromServer.Items[PacketsFromServer.Add(TFullPacketServer.create(cur pck,data1))]);
//h:=CreateThread(nil,150000,@ShowPacket,nil,0,c);
//CloseHandle(h);
except
MessageBox(0, pchar('ParsingFromServer12; i:='+inttostr(i)), 'ERROR', 0);
end;

Добавлено через 25 минут
щас ваще не выводится в кмд, посмотрим, как он проработает 20 минут

Добавлено через 5 минут
нет, вот мне было бы легче, если бы я услышал список предположений ПОЧЕМУ и ИЗ-ЗА чего такое возможно в принципе

Yegor
04.02.2011, 00:45
supernewbie, ну поотключай половину команд, добейся стабильной работы и постепенно добавляй команды, тут нужно експерементировать.

supernewbie
04.02.2011, 00:46
список предположений
:)

destructor
04.02.2011, 00:47
сделай в обработчике пакетов чтобы выводил только ид и размерсделал?

supernewbie
04.02.2011, 00:55
сделал?
сделал
клиент вырубается, но намнооооого дольше работает перед этим, а если отключить то еще дольше, но потом все равно либо крит, либо ошибка, либо вообще офается

destructor
04.02.2011, 01:14
сделай такой перехват:

hook_addnet(packet)
{
original_addnet(packet);
}

Добавлено через 15 секунд
будет вылетать?

supernewbie
04.02.2011, 07:09
сейчас посмотрим, но судя по тому что чем меньше операций выполняется в хук-процедуре то ждать придется долго, часа 2

Добавлено через 2 минуты
ждём, но я думаю что не будет, или вылетит часов через 12)

хотя может проблема в мусоре в стеке или еще в чём-то, а тут мусор не создается вроде

Добавлено через 49 секунд
ведь при procedure AddNetworkQueue_hook(np:PNetworkPacket); stdcall; он удалит поинтер из стека при этом?

Добавлено через 16 минут
щас сделал чисто чтобы он писал FromServer и FromClient, посмотрим на сколько его хватит

Добавлено через 14 минут
пришел в место жуткого флуда, посмотрим... пока нашел утечку памяти из-за того что не блокировал пакет от клиента попросту не вызывая сендпакет, сейчас заменяю ид у пакета, посмотрим...

Добавлено через 9 минут
есть две новости, хорошая и плохая
хорошая: с хуком АддНетворкКверти все было впорядке
плохая: критовал сенд пакет

Добавлено через 2 минуты
так... по ходу...

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

Добавлено через 7 минут
*ля, ну и привередливый сидекл, вызываю процедуру - крит, делаю ТОЖЕ самое в хук-процедуре - всё ок, ох мать... мб это из-за того что вызываемая функция возвращает булеан...

Добавлено через 3 минуты
походу делфи внатуре опять п*здит стек, придется запихивать параметры самому, и делать кал а не джамп...

Добавлено через 2 минуты
уф... щас сделаю, госпади, как ж всё просто, но главное... как странно вообще

Добавлено через 51 минуту
странно, вот этот код то работает то нет...

procedure SendPacket_hook; stdcall
begin
asm
mov tmp1, esp //записываю адрес первого параметра в стеке в tmp1
pushad //сохраняю регистры
end;
ParsingFromClient; //вызываю парсинг
asm
popad //возвращаю регистрам сохраненные значения
jmp SendPacket_origAddr //прыгаю в оригинальный сенд пакет
end;
end;

иногда, при чтении адресов вот таким образом критует

procedure ParsingFromClient; stdcall;
var
format:string;
params:array [0..1023] of pointer;
begin
ShitPacket:=false; //дерьмо-пакет ложь
tmp1:=pointer(cardinal(tmp1)+12); //прибавляю адрес так, чтобы это был адрес первого параметра Пакета, 12 - 4 на адрес возврата, 4 на указатель на нетворк хандлер или мб не на него), 4 на пчар формата пакета
format:=string(Pointer(Cardinal(tmp1)-4)^); // записываю формат в стринг
WriteLn('FromClient, id:'+inttohex(byte(tmp1^),2)+'; size:'+inttostr(length(format))); //записываю строку в кмд
// скорее всего адреса не те, но адрес стека вроде записан верно...
exit;
end;

дестр, нид хелпь(

Добавлено через 38 минут
что?! какого худенького

if (length(format)>0) and (format[0]='c') then в этом проблема?!

Добавлено через 10 минут
да что за нахер..

Добавлено через 11 минут
всё, проблема 100% в этом
format:=pchar(pointer(Cardinal(tmp1)+8)^);

читаю из жопы, инфа 99%

Добавлено через 12 минут
и как это понимать

хук Queue включен, хук SendPacket выключен - нет критов

хук Queue выключен, хук SendPacket включен - нет критов

хук Queue включен, хук SendPacket включен - криты

вопрос как бы задается сам собой, какого х*я?!!! эти хуки как-то связанны??? ЧТО ПРОИСХОДИТ МВТЬ ВАШУ

Добавлено через 38 минут
*ЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЯЯЯЯЯЯЯЯЯЯЯДЬ, теперь еще и указатель на метод класса своего же не могу получить ай *ЛЯДЬ

Добавлено через 48 минут
так, щас сделал класс TAddNetworkQueueHook и че-то не работает...

Добавлено через 47 минут
*ля пздц с классами вообще ничерта не работает, ай Б**ДЬ

Добавлено через 6 минут
нахер я их делал... половину переменных пришлось делать глобальными, ай

Добавлено через 3 минуты
ну зато теперь стало легче тестить... вроде бы, как минимум удобнее хукать стало) AddNetworkQueue.SetHook и AddNetworkQueue.DelHook и тд)

Добавлено через 18 минут
всё, ошибка официально в AddNetworkQueue

supernewbie
04.02.2011, 09:19
оставил один хук на сенд пакете... ну как так то, ощущение что после прохождения хук процедуры остается мусор в стеке, который забирает в себя л2, потом она пухнет от мусора и...) но это я уже наверное х**ню несу..

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

PS стою в самом людном месте и клиент посылает ValidatePosition каждые 5 секунд

Добавлено через 21 минуту
это может означать одно из трех...
1. Частый вызов ведет к критам, сенд пакет вызывается в разы реже
2. Опять же скорость заполнения памяти мусором, если таковой вооще имеется, в разы ниже и, возможно, л2 успевает очищать свою (мою) память.
3. Ошибка не связанна с памятью вовсе

расположены в порядке возрастания вероятности

Добавлено через 25 минут
короче всё ясно, в AddNetworkQueue вообще нече делать нельзя, т.к. сокеты, баферы и все такое, делаю тот же цикл в сенд пакете и всё держится, хотя пакетов конечно меньше от клиента...

Добавлено через 31 секунду
придется вы*бть диспатч, за любую инфу о нём буду благодарен..

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

for i:=0 to 1000000 do s:=s+'1'; выдержал 5 минут) после чего правда мой комп затрещал, я испугался и вырубил л2) ну ладно... давайте разберемся чекак там...

destructor
04.02.2011, 13:43
плохая: критовал сенд пакетну понятно, ищем крит в одном месте и приэтом еще стопицот срочек кода работают

Добавлено через 3 минуты
и как это понимать

хук Queue включен, хук SendPacket выключен - нет критов

хук Queue выключен, хук SendPacket включен - нет критов

хук Queue включен, хук SendPacket включен - критыгдето сбыдлокодил

supernewbie
04.02.2011, 18:07
щас переписал всё чистенько, классы сделал
критует именно АддНетворкКверти, что с СендПакетом, что без.
при этом если туже самую процедуру поставить на выолнение скажем при том же ДипатчНетворкКверти то всё окей...

destructor
04.02.2011, 19:37
АддНетворкКвертитут параметр указатель на указатель на структуру с пакетом
ДипатчНетворкКвертитут параметр указатель на структуру с пакетом

Добавлено через 27 секунд
или наоборот:D

supernewbie
05.02.2011, 01:06
наоборот)

Добавлено через 36 минут
только вот в самом начале то в диспатч приходит указатель на 0!

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

Добавлено через 4 часа 8 минут
всё, понял, он постоянно пытается вытащить последний пакет...

Добавлено через 5 минут
procedure DispatchNetworkQueue_Parsing(p:pointer); stdcall;
var
np:TNetworkPacket;
begin
if (Cardinal(p^)<>0) and (last<>Pointer(p^)) then
begin
last:=Pointer(p^);
np:=TNetworkPacket(pointer(p^)^);
Writeln('FromServer:'+inttostr(np.size));
end;
end;

что тут не так? :(
размер всегда 1, байты разные вообще

supernewbie
05.02.2011, 02:01
да че за фигня

procedure DispatchNetworkQueue_Parsing(p:pointer); stdcall;
var
np:PPNetworkPacket;
begin
if (Cardinal(p^)<>0) and (last<>Pointer(p^)) then
begin
last:=Pointer(p^);
np:=p;
Writeln('FromServer:'+inttostr(cardinal(p)));
Writeln('FromServer:'+inttostr(cardinal(p^)));
Writeln('FromServer:'+inttostr(byte(np^.id)));
end;
end;

1. адрес
2. адрес по адресу
3. ид нетворкпакета по адресу 2

че-то странно

supernewbie
05.02.2011, 07:02
помогите(

Добавлено через 50 минут
да помогите же кто-нибудь :(

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

procedure DispatchNetworkQueue_Parsing(np:PNetworkPacket); stdcall;
begin
if np=nil then Exit;
WriteLn(inttohex(np.id,2));
exit;
end;

procedure DispatchNetworkQueue_Hook(np:pointer); stdcall;
asm
push np
call [DispatchNetworkQueue_Original]
pushad
push [np]
call DispatchNetworkQueue_Parsing
popad
end;

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

Добавлено через 14 минут
а всё, разобрался...

Добавлено через 6 минут
с горем попалам получилось так

procedure DispatchNetworkQueue_Parsing(p1:pointer); stdcall;
var
np:PNetworkPacket;
p:pointer;
begin
p:=pointer(p1^);
if (p=nil) or (last<>nil) and (last=p) then Exit;
last:=p;
np:=PNetworkPacket(p);
WriteLn(inttohex(np.id,2));
exit;
end;

procedure DispatchNetworkQueue_Hook(np:pointer); stdcall;
asm
push np
call [DispatchNetworkQueue_Original]
pushad
push np
call DispatchNetworkQueue_Parsing
popad
end;

Добавлено через 2 часа 45 минут
всё, сделал парсинг параметров СендПакета и ДиспатчНетворкКверти, по факту имею траффик с сервера\клиента

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

destructor
05.02.2011, 15:08
сделать форму так, чтобы она не исчезала...а сейчас она изчезает?:D

Morfik
05.02.2011, 16:56
поехали дальше, надо сделать форму так, чтобы она не исчезала...

создать в отдельном потоке и показать как ShowModal
или показать как Show и усыпить поток Sleep(INFINITE)

supernewbie
06.02.2011, 02:15
и еще вопрос, вот я с помощью SizeOfProc узнаю размер процедуры и копирую её побайтова, перевожу в хекс.. и в файл, так вот
можно ли по этим байтам понять что делает функция? ну ладно, я наверное щас пойду сам потренеруюсь на своей...

Добавлено через 1 час 37 минут
создать в отдельном потоке и показать как ShowModal
или показать как Show и усыпить поток Sleep(INFINITE)
во втором случае форма внатуре именно "засыпает на вечность" и не отвечает не на что), а если показывать через ShowModal то появляется проблема, как закрыть то эту форму?) вернее выгрузить, Form1.destroy вызывает какую-то ошибку

destructor
06.02.2011, 02:17
можно ли по этим байтам понять что делает функция?ida умеет.
только в хекс не надо переводить,
делай бинарный файл и 1в1 память переписывай.


я наверное щас пойду сам потренеруюсь на своей...труЪ!


с помощью SizeOfProcв некоторых редких функциях она может косячить

supernewbie
06.02.2011, 02:47
бинарный файл говоришь? так так...

Добавлено через 1 минуту
как его делать тока...

Добавлено через 8 минут
о боже

BlockWrite(f,b,sizeof(b));...

Добавлено через 37 секунд
и как это засунуть в иду?)

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

destructor
06.02.2011, 02:49
давай тимвью, проще показать

supernewbie
06.02.2011, 02:52
окей, сейчас зайду, нука где он...

Morfik
06.02.2011, 13:12
во втором случае форма внатуре именно "засыпает на вечность" и не отвечает не на что), а если показывать через ShowModal то появляется проблема, как закрыть то эту форму?) вернее выгрузить, Form1.destroy вызывает какую-то ошибку

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

supernewbie
06.02.2011, 14:12
разве в памяти не останется всё это дело?

Morfik
06.02.2011, 14:23
разве в памяти не останется всё это дело?

большинсво деструкторов вызываются сами

supernewbie
06.02.2011, 15:54
ясна, тогда окей... щас правда че-то мы с дестром востановили функцию по бин файлу, но блин, 12 байт не совпадает с оригиналом, а сама функция вроде таже! щас буду детально разбиратся че за нахер...

Добавлено через 37 минут
отлично) теперь XP стиль формы не робит

Добавлено через 27 минут
внатуре ж не работает если форму из дллки создавать, пасаны че делать?

Добавлено через 4 минуты
причем если то окно, которое подгружает дллку юзает хпстайл то всё ок.. нука..

Добавлено через 47 секунд
наследует!! наследует долбаный стиль!(

Добавлено через 10 минут
шо же делать?

Morfik
06.02.2011, 16:14
забить на ХП стайл?)

supernewbie
06.02.2011, 17:14
http://www.apachan.net/images/201102/05/toy1giggosn0.jpg
но там всё такое уродливое :(

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

Добавлено через 44 минуты
блин памагите) полюбому же можно xp style заюзать)

alexteam
06.02.2011, 19:05
всобачиш манифест в ресурсы л2.бин - получишь "красивые формочки".
только вот нафига ? непонятно.

supernewbie
07.02.2011, 18:24
интересно как? не знаю, я через альфа скин сделаю
PS так красивей)

Добавлено через 18 часов 28 минут
слушайте, а вот если я через СендМессадж буду передавать поинтер на переменную какую-нибудь, стринг там например, то как прочитать по этому ардесу из другого приложения?

Добавлено через 2 минуты
аааа, урааа) ReadProcessMemory()

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

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

Добавлено через 42 минуты
блин, ну вот я создаю форму, разве form1.handle это не то?

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

Добавлено через 3 минуты
как убрать отображение формы в пуске или через альт таб?

Prixmegently
09.02.2011, 21:20
Как успехи?)

supernewbie
10.02.2011, 15:11
сделал форму прикольную, пакеты терь в ТЛистВайв передаются списком, ну что-то типо аналога пх... щас вот разибраюсь в сплайсинге, ничерта правда не получается, нужны хорошие статьи с комментом на каждом месте
PS http://rghost.ru/4273684/image.png :P

Добавлено через 14 часов 1 минуту
из-за чего может происходить ошибка когда я юзаю вот это
Byte(p^):=Byte(p^);
в память нельзя записывать?

как тогда открыть для записи?

VirtualProtect(p, 5, PAGE_EXECUTE_READWRITE, OldProtect); нипамагает

Добавлено через 59 минут
а всё, протект робит, в другом ошибка была

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

ну хотя щас попробую сам..

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

как его поставить в конец?

procedure Hook_Proc;
begin
writeln('');
writeln('---');
writeln('JA SNIMAYU NAHU');
writeln('---');
writeln('');
end;

begin
writeln('im dll, im injecting here');
m:=Pointer(GetModuleHandle('exeFile.exe')+$4114);
GetMem(p, 255);
SaveOldFunction(m,p);
VirtualProtect(m, 5, PAGE_EXECUTE_READWRITE, OldProtect);
Byte(pointer(Cardinal(m)+0)^):=$e8;
pointer(pointer(Cardinal(m)+1)^):=pointer(dword(@H ook_Proc) - dword(m) - 5);
end.

я так думаю надо либо увеличивать размер функции, либо перезаписывать последние 5 байт и выполнять их в хук процеудре, или я не прав?

dyh9l
10.02.2011, 16:28
епт) ты че снифер что ли пишешь?) я как-то представлял когда ты говорил про бота какая нибудь ДЛЛКа )))

supernewbie
10.02.2011, 16:41
дак шифрация уже везде стоит, надо как-то обходить, на 99 серверах из 100 стоит леймгвард

Yegor
10.02.2011, 17:25
supernewbie, дак ты научился обходить леймгвард или нет?

dyh9l
10.02.2011, 18:19
Чем твой снифер будет отличатся от пх?

supernewbie
11.02.2011, 21:04
Чем твой снифер будет отличатся от пх?
тем что он будет работать на всяких ссрах, леймах и прочей мудотени)

Добавлено через 38 секунд
supernewbie, дак ты научился обходить леймгвард или нет?
нет, на моём сервере сср стоит, но сейчас как раз пытаюсь разрулить лейм

mira
10.03.2011, 10:34
интересная темка) напоминает мои первые шаги, тока мне никто не помогал.
У диспатча всего 1 минус-тормозит клиент-тормозит прога

supernewbie
10.03.2011, 11:08
кстати, про диспатч, пока особенного его не разбирал, но можно ли в нём поставить хук так, чтобы пакет не разбирался, короче гря убивать пакеты

mira
10.03.2011, 12:40
все можно но вот как неотработаный пакет удалить потом это хз. Функция возвращает число пакетов накопленых в буффере но еще необработаных

Добавлено через 5 минут
как я понимаю клиент после обработки пакета движком вызывает какуюто процедурку удалющую пакет. Но беда в том что очевидно не являетса чьимто методом и темболее не экспортируетса

supernewbie
10.03.2011, 13:08
ладно, потом разберу её. надеюсь она не очень большая.. надо еще хук на сенд пакете переставить, а то я заметил что и лейм и сср меняет пакет хз каким способом, но в самом сенд пакете, причем вроде в самом конце (имеется ввиду не шифрация)

mira
10.03.2011, 13:27
в лейме хукнуть ее так как на сср не получилось они хорошо защитили святая святых. Причем на разных модах защиты разные приколюхи. Нада быть осторожнее) не вникал особо че там намудрили лг пока ломал чисто для разминки

Добавлено через 9 минут
и лг и сср подменяют крипто-функцию в сендпакете я уже писал. Иногда сами хукают сендпакет для проверок или проверяют в шифровалке то откуда вызвали сендпакет. Если вызов не из енгине а левой длл то в лушем случае просто не шлют этот пакет

supernewbie
10.03.2011, 13:44
знаю знаю) вызывается из энжини у меня.
почему не получится хукать также как сср? у меня везде один и тот же хук стоит и всё работает

сср и какая-то версия лейма сплайсят сенд пакет 100%... ты сам пакет AuthLogin то какой видишь на ссре?) какой размер у него?
потому что в нём пишется хвид, и надо как-то менять его содержимоё после смены его содержимого защитой)

mira
10.03.2011, 15:37
я думаю к хвиду прилагаетса чексумма если сср уж не совсем лохи)
про виртуалпротект - если при любом вызове офаетса даже не трогая сетевые ф-ии то ответ очевиден) они хукнули вп и причем ранше тебя

Добавлено через 3 минуты
вп это переходник в ntdll вот и смари как меняетса код функции в нтдлл с защитой и без. Непомню как там чето типа ntvirtualprotect

supernewbie
10.03.2011, 15:40
VirtualProtect(nil, 0, 0, nil); при таком не офается, так что если они и хукнули, то там идет проверочка..

Добавлено через 2 минуты
определенно хукнули, и поставили проверку на адресное пространство енжини.длл, хитрые гады) правда перед этим они всю память EXECUTE_READWRITE сделали О_о, так что я не совсем понимаю смысл всего этого

mira
10.03.2011, 15:57
значит есть шанс что юзают полиморфику. Например чето меняют в коде перед его исполнением и назад после. Да тотже сплайсинг мб

Добавлено через 1 минуту
какую память? Какова модуля хоть..

supernewbie
10.03.2011, 16:01
скорее всего только энжини палят, но это пох по двум причинам:
1. Вся память открыта для чтенья и записи уже.
2. ???

mira
10.03.2011, 16:48
согласен с обоими доводами.

destructor
21.03.2011, 18:03
было так:
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main
.text:00401000 push 0 ; uType
.text:00401002 push offset Caption ; lpCaption
.text:00401007 push offset Text ; "hello"
.text:0040100C push 0 ; hWnd
.text:0040100E call ds:MessageBoxW
.text:00401014 xor eax, eax
.text:00401016 retn
.text:00401016 _main endp


потом погромист добавляем специальный макрос который обьясняет упаковщику откуда докуда шифровать код.
становится так:
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401000 jmp short loc_401012
.text:00401002 db 43h, 56h, 20h, 20h, 0Ch, 0, 0, 0, 0, 0, 0, 0, 43h, 56h, 20h, 20h
.text:00401012 loc_401012:
.text:00401012 push 0 ; uType
.text:00401014 push offset Caption ; lpCaption
.text:00401019 push offset Text ; "hello"
.text:0040101E push 0 ; hWnd
.text:00401020 call ds:MessageBoxW
.text:00401026 jmp short loc_401038
.text:00401028 db 43h, 56h, 20h, 20h, 0Dh, 0, 0, 0, 0, 0, 0, 0, 43h, 56h, 20h, 20h
.text:00401038 loc_401038:
.text:00401038 xor eax, eax
.text:0040103A retn
.text:0040103A _main endp

потом код можно прогнать упаковщиком, и станет он выглядеть так:
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401000 jmp sub_408520 ; полетели в дебри виртуальной машины
.text:00401000 ; ------------------------------тут рандомный мусор------------------------
.text:00401005 db 33h, 5Ah, 0B0h, 90h, 0DBh, 7Eh, 0F3h, 0AAh, 0F2h, 0F7h, 0C7h, 0C4h, 0B7h, 0F0h, 1Eh, 97h
.text:00401005 db 26h, 11h, 0DEh, 33h, 0DFh, 0A9h, 0B8h, 0EAh, 20h, 0F8h, 82h, 78h, 2, 2Ah, 1Ch, 29h
.text:00401005 db 0BEh, 0EBh, 10h, 0A8h, 23h, 1Fh, 13h, 0C2h, 0B8h, 0DDh, 3Fh, 51h, 7Eh, 0A9h, 29h, 0C1h
.text:00401005 db 7Bh, 0A4h, 54h
.text:00401038 ; ---------------------------------------------------------------------------
.text:00401038 xor eax, eax
.text:0040103A retn
.text:0040103A _main endp

destructor
21.03.2011, 18:28
пишеш свой, понятный код, и потом начинаеш разбиратся как его ломать.

Добавлено через 23 минуты
макрос1:
:00401000 jmp short loc_401012
.text:00401002 db 43h, 56h, 20h, 20h, 0Ch, 0, 0, 0, 0, 0, 0, 0, 43h, 56h, 20h, 20h

макрос2:
.text:00401026 jmp short loc_401038
.text:00401028 db 43h, 56h, 20h, 20h, 0Dh, 0, 0, 0, 0, 0, 0, 0, 43h, 56h, 20h, 20h


и все что между ними надо зашифровать

supernewbie
21.03.2011, 18:30
откуда взяты и почему именно такие макросы даж страшно спрашивать)

destructor
21.03.2011, 18:31
после шифровки, то что вне макросов остается в нормальном виде:
.text:00401038 xor eax, eax
.text:0040103A retn


поэтому у тебя гдето нормальный код, а гдето куйпойми

supernewbie
21.03.2011, 18:32
ОУ, пооооняяяяял...

---

правда общему горю это маловато поможет))

destructor
21.03.2011, 18:47
откуда взяты и почему именно такие макросы даж страшно спрашивать)
такой набор байт придумал разрабочик защиты, и выложил в "мануалах по упаковке"
чтобы прога для шифрования могла найти участок кода, который надо шифровать.

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

Добавлено через 7 минут
правда общему горю это маловато поможет))частично, в пакер не любой код сворачивают,
например:

int secret()
{

#макрос_start
sleep(1);
#макрос_end

while(*b)
{
*a=*b xor key;
a++;
b++;
};

#макрос_start
sleep(2);
#макрос_end

return 0;
};

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

jmp sub_408520 ; полетели в дебри виртуальной машины
; ------------------------------тут рандомный мусор------------------------
db 33h, 5Ah, 0B0h, 90h, 0DBh, 7Eh, 0F3h, 0AAh, 0F2h, 0F7h, 0C7h, 0C4h, 0B7h, 0F0h, 1Eh, 97h
db 26h, 11h, 0DEh,
//--а гдето тут читаемый код--
33h, 0DFh, 0A9h, 0B8h, 0EAh, 20h, 0F8h, 82h, 78h, 2, 2Ah, 1Ch, 29h
db 0BEh, 0EBh, 10h, 0A8h, 23h, 1Fh, 13h, 0C2h, 0B8h, 0DDh, 3Fh, 51h, 7Eh, 0A9h, 29h, 0C1h
db 7Bh, 0A4h, 54h, 33h, 5Ah, 0B0h, 90h, 0DBh, 7Eh,
//------------------------------
0F3h, 0AAh, 0F2h, 0F7h, 0C7h, 0C4h, 0B7h, 0F0h, 1Eh, 97h
db 26h, 11h, 0DEh, 33h, 0DFh, 0A9h, 0B8h, 0EAh, 20h, 0F8h, 82h, 78h, 2, 2Ah, 1Ch, 29h
db 0BEh, 0EBh, 10h, 0A8h, 23h, 1Fh, 13h, 0C2h, 0B8h, 0DDh, 3Fh, 51h, 7Eh, 0A9h, 29h, 0C1h
db 7Bh, 0A4h, 54h
---------------------------------------------------------------------------
xor eax, eax
retn

supernewbie
21.03.2011, 18:50
но ида при этом нихера ж не поймет наверняка, и не покажет сама этот "где-то читаемый код" )

destructor
21.03.2011, 18:57
читаемый код ручками не сложно угадать.