Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Запись в exe-файл

Автор: ShIvADeSt
Дата сообщения: 11.05.2004 00:01

Цитата:
Да эти способы полюбому беспантовые..

Поясни, ИМХО это твой способ беспантовый так как расчитан на ламеров, но не будем переходить на личности

Цитата:
Я уже залез в адресное пространство эксплорера
там нужно выделить память, и создать там поток... и думаю как это сделать
мож кто поможет

Это делается многими способами, некоторые описаны в журнале Хакер. А классики предлагают следующий способ. Процедура нужного тебе потока помещается в длл. там же находится процедура Хука. Ставишь хук в главный поток проводника, и из него делаешь CReateThread с нужной тебе процедурой, все твой поток выполняется в проводнике. Только на х....н тебе это надо, аааааа кажется понял ты из него хочешь писать в совй файл правильно?
Автор: KoboL
Дата сообщения: 11.05.2004 16:30
В принцыпе я с помощью куков в него и залез
Проблема в том что когда в CreateThread ты сылаешся на процедуру, то всё работает но при выгрузки Dll и процедуры не станет...
А мне нужно чтоб код работал автономно без програм и библиотек...
Чтоб я мог вообще их удалить а в оперативке всё равно выполнялись мои команды..
Для этого нужно выделить память в процесе эксплорера ,записать туда действия и передать управление...
Автор: ShIvADeSt
Дата сообщения: 11.05.2004 23:58

Цитата:
Проблема в том что когда в CreateThread ты сылаешся на процедуру, то всё работает но при выгрузки Dll и процедуры не станет...
А мне нужно чтоб код работал автономно без програм и библиотек...

А как ты выгрузишь библиотеку, когда она загружена вругом процессе. А вообще, я тебе сказал посмотри в Хакере, там точно есть это, просто не охото дублировать. Если не нацдешь пуляй в ПМ я вышлю.
Автор: UncoNNecteD
Дата сообщения: 12.05.2004 10:27
На Королевстве Дельфи есть хорошие примеры в разделе о защите программ.
Там описано как CRC менять и все такое.
Автор: KoboL
Дата сообщения: 12.05.2004 12:45
ShIvADeSt

C помощью UnhookWindowsHookEx я выгружу библиотеку со всех процесов, и потом пошлю SetEvent экзешнику, а он получив его выгрузит и библиотеку с себя..

Автор: ShIvADeSt
Дата сообщения: 12.05.2004 23:46

Цитата:
C помощью UnhookWindowsHookEx я выгружу библиотеку со всех процесов,

Ага, помечтай об этом, у тебя же поток загружен из нее Пока поток не прибьешь не получится. Библиотеки выгружаются обычно сами, когда счетчик их использования становится арвным нулю. А FreeLibrary делают только тогда, когда для загрузки библиотеки используют LoadLibrary и GetProcAdress, что то вроде этого.
Автор: UncoNNecteD
Дата сообщения: 13.05.2004 12:28
Где исходники то?
Автор: KoboL
Дата сообщения: 13.05.2004 13:06
ShIvADeSt
Я думал если я сосдам поток в эксплорере то он будет работь без моей длл-ки.
Тогда это всё меняет и я в пролёте

UncoNNecteD
про какие исходники ты говориш, та которая использует батник ссылка на исодник :на 10 сообщений назад.
Автор: ShIvADeSt
Дата сообщения: 13.05.2004 23:53

Цитата:
Я думал если я сосдам поток в эксплорере то он будет работь без моей длл-ки.

Я тоже когда программил это дело так думал Просто если длл будет выгружена, то где будет код процедуры для потока? Есть правда способ, который ты примерно описал, но он гемморный и надо хорошо знать работу с памятью. Все делает твой поток в чужом приложении. Выделяется область памяти в нужном тебе процессе, туда копируется код другой процедуры, создается поток, а в качестве указателя на процедуру передается адрес этой памяти, потом твой поток завершается и естессно библиоетка выгружается так как ее больше никто не испоьльзует, а вот другой поток работает ноьрмально, так как его код целиком находится в памяти процесса. Программной реадизации у меня нет, но я видел исходники в инете. правда там используется асм.
Автор: KoboL
Дата сообщения: 14.05.2004 10:16
Кхе-кхе... Так, между прочим замечу, что мой препод далеко не лопух...
И про уявимости этой проги он тоже мне сказал. Что файл ресурсов пропаливается, про терминэйт и еще парочку. Как я уже по-моему говорил, он сказал, что решение моей задачи очень хорошее для ПЕВОКУРСНИКА. Так что мово препода не обижать! Он один из ведущий спеуиалистов по информатике на северном кавказе...
Так вот.

Добавлено
а над продолжением думаю...
Автор: UncoNNecteD
Дата сообщения: 14.05.2004 11:15

Цитата:
Ошибка 404 (Page Not Found)


Запрашиваемый документ не найден.
Тщательно проверьте написание адреса - возможно, Вы просто ошиблись при наборе.


Вот твоя ссылка на что ведет.
Автор: KoboL
Дата сообщения: 14.05.2004 16:15
ShIvADeSt
Вот про этот сособ я и говорил... Где ты исходники реализации видел?.. Кинь ссылку если вспомниш.

UncoNNecteD, просто скопируй и вставь..
сама прога: rinoktruda.amillo.net/counter.rar
исходник: rinoktruda.amillo.net/s.rar
Автор: JonnySilver
Дата сообщения: 19.05.2004 11:29
Еще под добрым досом на BC++ 3.0 делал пассвордер. В коде создал переменную, нашел ее в готовом экзешнике и узнал смещение. А затем открывал ЭХЕ по этому смещению писал, то что надо (пасс зашифрованный при смене пароля) - отлично работало.
Автор: KoboL
Дата сообщения: 20.05.2004 10:14
Доброго всем дня!
Вот реализация записи в экзе-файл под досом.
А то Шивадест с Анконнектедом меня грузили...
Теперича верите??? Могу зачетку отсканить ))))))))))))



{$A+,B-,D+,E+,F+,G-,I+,L+,N+,O-,P-,Q+,R+,S+,T+,V+,X+,Y+}
{$M 65520,0,65520}
uses DOS,Crt;
const
RunCount : LongInt = $0A;
var
Self : file; {exe file}
HdrSize : Word; {Header Size of exe file}
RunCountOffset : LongInt; {Offset in exe file of Const RunCount}
i : Byte;
Pos : ^Byte;
const
CheckRunCount : LongInt = $0A; {Zdes dolzhno byt' znachenie RunCount}

procedure Expired; {Eta procedura zapuskaetsya kogda limit ischerpan}
{(RunCount = 0) }
begin
WriteLn('Vash limit ischerpan...');
end;

procedure NotExpired;{RunCount<>0}
begin
WriteLn('Ostalos'' zapuskov : ', RunCount);
end;

begin {main}
ClrScr;
{Odna iz zashit}
if CheckRunCount<RunCount then
begin
Expired;
RunCount:=0;
end;

if RunCount=0 then
Expired
else
begin
Assign(Self,ParamStr(0)); {}
Reset(Self,1); {}
Seek(Self,8); {}
BlockRead(Self,HdrSize,2);{Read header size}
{formula vychisleniya smesheniya peremennoi RunCount v faile trial.exe}
RunCountOffset:=Ofs(RunCount)+LongInt((Seg(RunCount)-PrefixSeg-$10+HdrSize))*16;
RunCount:=RunCount-1;
Seek(Self,RunCountOffset);
for i:=0 to 3 do
begin
Pos:=Ptr(Seg(RunCount),Ofs(RunCount)+i);
{ WriteLn(Pos^);}
BlockWrite(Self,Pos^,1);
end;
Close(Self);
NotExpired;
end;
WriteLn('Press any key...');
ReadKey;
end. {main}

Добавлено
Блин, сессия началась... С матаном такая халява не прокатит... Так что небольшой перерывчик... где на недельки 3... Прошу тему не закрывать.
Заранее благодарю. Всем студентам успешной сдачи сессии.
Автор: ShIvADeSt
Дата сообщения: 21.05.2004 00:01

Цитата:
Доброго всем дня!
Вот реализация записи в экзе-файл под досом.

А при чем тут ДОС? KoboL Я насчет винды говорил всегда, так как именно там запись файла в себя достаточна интересна. И еще неужели так трудно нажать на имени, что не видеть вот этого

Цитата:
Шивадест с Анконнектедом


Ты посмотри свой второй пост
Цитата:
под win32
Я и не знал, что ДОС 32 разрядный . В общем надо правильно спрашивать и получишь правильные ответы (хоть и не сразу) так как я так и не нашел пока, как перенести код процедуры в адрес друго процесса. но ищу потихоньку - дело принципа
Автор: JonnySilver
Дата сообщения: 27.05.2004 18:20
ShIvADeSt

Цитата:
не нашел пока, как перенести код процедуры в адрес друго процесса

Джеффри Рихтер поможет. Ты там уже искал... Давай адрес. Кину пример.
Автор: KoboL
Дата сообщения: 28.05.2004 10:09
zaur@emfy.com
Кидай, заранее саул
Автор: JonnySilver
Дата сообщения: 28.05.2004 21:48
Отправил тебе пример. Смотри мыл.
Автор: Andrey_aka_Master
Дата сообщения: 24.01.2005 04:16
Хотелось бы узнать как считать данные из ехе файла во время его выполнения, тоесть программа должа считывать данные сама с себя.(данные имеют размер 304 байта и находяться в самом конце файла)
Автор: ShIvADeSt
Дата сообщения: 24.01.2005 06:21
Andrey_aka_Master
Когда был пример, но сейчас найти не могу.
Попробую по памяти восстановить

Цитата:

var
F1 :File Of Byte;
bt:byte;
i:integer;
begin
AssignFile(F1,'myprog.exe');
Seek(F1,GetFileSize('myprog.exe')-304);
for i:=1 to 304 do read(F1,bt);
end;

думаю смысл понятен. Проблема не в том, как считать данные из файла во время выполнения, а как писать в файл во время его выполнения. Пути естессно надо полные к файлу писать.
Автор: Andrey_aka_Master
Дата сообщения: 24.01.2005 21:16
делал нечто пододобное но при помощи ф-ий из sysutils, получал runtime error, попробую еше разик, мб проблема была в коде, я то думал что программа просто не может октрыть сама себя во время выволнения (ф-ия fileopen).

Вот написал следующее:

Код:
Procedure GetParams;
var
Buffer: array[0..30] of byte;
i:integer;
params:string;
F1:file of byte;
begin
AssignFile(F1,getexename); {getexename - ф-ия которая возврашает имя запушеного файла}
reset(f1);
Seek(F1,81);
for i:=0 to 30 do
begin
read(F1,buffer[i]);
params:=params+chr(buffer[i]);
end;
closefile(f1);
MessageBox(getactivewindow,pchar(params),'INFO',MB_OK);
end;
Автор: ShIvADeSt
Дата сообщения: 25.01.2005 02:21
Andrey_aka_Master
Однако надо хелпы читать Вот рабочий код, что то читает из файла и не выдает ошибок

Цитата:

procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: array[0..30] of byte;
i:integer;
params:string;
F1:file of byte;
begin
AssignFile(F1,Application.ExeName); {getexename - ф-ия которая возврашает имя запушеного файла}
{$I-}

reset(f1);
Seek(F1,1);
for i:=0 to 30 do
begin
read(F1,buffer[i]);
params:=params+chr(buffer[i]);
end;
closefile(f1);
{$I+}

MessageBox(getactivewindow,pchar(params),'INFO',MB_OK);
end;

Автор: Andrey_aka_Master
Дата сообщения: 25.01.2005 03:47

Цитата:
Andrey_aka_Master
Однако надо хелпы читать Вот рабочий код, что то читает из файла и не выдает ошибок


Код:
i:=0;
{copyfile(pchar(getexename),pchar(extractfiledir(getexename)+'\~'),false)};
{AssignFile(F1,extractfiledir(getexename)+'\~'); }
AssignFile(F1,getexename);
{$I-}
reset(F1);
Seek(F1,GetFileSizeByName(getexename)-212);
for i:=0 to sizeof(buffer)-1 do
begin
read(F1,buffer[i]);
end;
closefile(f1);
{$I+}
{deletefile(pchar(extractfiledir(getexename)+'\~'));}
Автор: ShIvADeSt
Дата сообщения: 25.01.2005 06:01
Andrey_aka_Master
Ладно, какая дельфи для начала. Потому как код который я тебе дал работает без ошибок. У меня Дельфи 5.5
Автор: Andrey_aka_Master
Дата сообщения: 25.01.2005 19:09
ShIvADeSt, delphi 7. Твой код у меня выдает ошибку.
Автор: ShIvADeSt
Дата сообщения: 26.01.2005 02:19
Andrey_aka_Master

Цитата:
Твой код у меня выдает ошибку.

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

Добавлено:
Нашел в инете рабочий код, только немного его переделал, чтобы читал из запущенного файла

Цитата:

procedure TForm1.Button1Click(Sender: TObject);
function ReadOneByte(filename: string): byte;
var fh, tmp: cardinal;
begin
fh:=CreateFile(PChar(filename),GENERIC_READ,FILE_SHARE_READ ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(fh, 0, nil, FILE_BEGIN);
ReadFile(fh, result, 1, tmp, nil);
CloseHandle(fh);
end;
var
qq:byte;
begin
qq:=ReadOneByte(Application.ExeName);
ShowMessage(Chr(qq));
end;

при помощи него прочитал первую букву заголовка M
Автор: Andrey_aka_Master
Дата сообщения: 26.01.2005 03:20
ShIvADeSt, интересно. Спасибо.
Автор: STEEL
Дата сообщения: 19.05.2006 21:36
Может немного оффтоп, не решаюсь создавать новый топик, ибо не знаю как правильно это называется.
Есть приложение (в виде одного экзешника), есть редактор, который должен конфигурировать этот экзешник, вся беда в том, что все настройки должны хранится непосредственно в экзешнике, помещать их ни в реестр, ни в иник нельзя! Как это организовать? Очень нравится как работает конфигуратор трояна Pinch, после конфигурации он компилит ЕХЕ.
Автор: vserd
Дата сообщения: 20.05.2006 12:28
STEEL
возьми описание формата PE файла (это win32 EXE|DLL) и почитай. Секцию тебе удасться создать, вот только загвоздка будет, сможешь ли ты ее прочитать при запущенном EXE. Сам таким не занимался, но когда искал инфу о вычислении размера EXE натыкался на такой способ. Помоему это для тебя будет хорошей отправной точкой:
hччp://www.programmersheaven.com/phwiki/printer.aspx?w=2&p=Inject-code-to-Portable-Executable-file

Также рассмотри возможность записывать данные в некоторый ресурс (возможно с шифрированием).
Автор: ShIvADeSt
Дата сообщения: 22.05.2006 00:50
STEEL
даю полный пример по работе с ехешниками.

Цитата:

Чтение и запись в ехе-файлы

function ReadOneByte(filename: string): byte;
var fh, tmp: cardinal;
begin
fh:=CreateFile(PChar(filename),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(fh, -1, nil, FILE_END);
ReadFile(fh, result, 1, tmp, nil);
CloseHandle(fh);
end;

procedure WriteOneByte(filename: string; b: byte);
var fh, tmp: cardinal;
begin
fh:=CreateFile(PChar(filename),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(fh, 0, nil, FILE_END);
WriteFile(fh, b, 1, tmp, nil);
CloseHandle(fh);
end;
в случае запущенного файла не забыть SHARE_READ

файл, в конец которого добавлена таким образом инфа нормально запускается (только что проверил). Итак тебе нужно будет сделать след, определяешь реальный размер файла (он тебе нужен будет, чтобы знать где находится область данных). Придумываешь, каким образом будет хранится инфа (то есть на каком смещении от реального окончания файла будут лежать какие данные). Пишешь конфигуратор, который будет добавлять данные в конец файла (вернее по смещению относительно реального конца) для этого делаешь две константы в самом файле и в конфигураторе, и если после очередной модификации файла у тебя изменился размер, то просто меняешь эти константы.
ЗЫ забудь в этом случае про упаковку пакерами.

Страницы: 123

Предыдущая тема: Эволюция в виртуальной машине


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.