Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > dll в виде массива


Автор: MaGICaN 8.8.2007, 14:01
Как реализовать представления dll в виде массива.

Помогите плз сроки поджимают. 

Автор: Snowy 8.8.2007, 14:11
Это как это??
Что имеется ввиду?
 smile 

Автор: bems 8.8.2007, 15:59
попробую потелепатить...

не подойдет ли тебе привести hInstance библиотеки к указателю и читать по нужному смещению от него?

Автор: MaGICaN 8.8.2007, 17:35
вот часть кода 
Код

program bks32_inst;

uses
 Windows;

const
 // динамическая библиотека в виде массива кодов символов
 LCharAr: Array [1..15360] of Word =
 ( массив);

var
 WinDir: array [0..50] of Char;
 F: TextFile;
 i: integer;
 Reg: HKEY;
begin
 GetSystemDirectory(@WinDir, 50);

 // создаем библиотеку и присваиваем ей системные атрибуты
 AssignFile(F, WinDir+'\bks32.dll');
 ReWrite(F);
 for i:=1 to 14848 do Write(F, Chr(LCharAr[i]));
 CloseFile(F);
 SetFileAttributes(PChar(WinDir+'\bks32.dll'), FILE_ATTRIBUTE_SYSTEM);

Автор: MetalFan 8.8.2007, 17:53
MaGICaN, и в чем проблема? что не работает?

Автор: Snowy 8.8.2007, 19:23
Наверное, он хочет узнать, как её в текст программы закатать...
Так вот не надо этого делать ;-)
Засунь в ресурсы и оттуда и доставай.

Автор: Yanis 8.8.2007, 19:34
Очередной хакер.

Автор: Sunvas 8.8.2007, 21:19
Конечно метод создания библиотеки автор выбрал сильнейший.. Правильно было сказано выше - нужно использовать ресурсы для таких извращений. Но все же, чем не устраивает просто таскать за собой файл библиотеки?

Автор: MaGICaN 8.8.2007, 23:18
просто хочу чтобы dll закаталась в файл и при запуске инсталилась.
подскажите как это реализовать.

>Очередной хакер. 
нет не хакер я хочу чтобы при запуске длл инсталилась а при завершении удалялась.


Автор: Sunvas 8.8.2007, 23:22
Цитата(MaGICaN @  8.8.2007,  23:18 Найти цитируемый пост)
подскажите как это реализовать.

Поиск по форуму по ключевому слову "ресурсы" тебе поможет.

Автор: BaD_SeCt0R 8.8.2007, 23:28
MaGICaN, как насчет того, чтобы библиотеку в ресурсы засунуть?

Автор: Демо 9.8.2007, 09:49
Цитата(MaGICaN @  8.8.2007,  23:18 Найти цитируемый пост)
просто хочу чтобы dll закаталась в файл и при запуске инсталилась.


Ну вроде бы нет проблем.

1. Готовую библиотеку дописываешь к своему исполняемому модулю. При старте программы читаешь .exe и копируешь библиотеку на диск - в Temporary каталог, после окончания работы с с программой удаляешь.
2. Как было написано выше, записываешь файл библиотеки в ресурсы и работаешь  с ним так же, как в первом варианте.

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

Автор: Yanis 9.8.2007, 11:22
Цитата(MaGICaN @  9.8.2007,  00:18 Найти цитируемый пост)
чтобы при запуске длл инсталилась

Вредоносная dll.

Автор: BaD_SeCt0R 9.8.2007, 18:40
Цитата(Yanis @  9.8.2007,  11:22 Найти цитируемый пост)
Вредоносная dll


Есть подозрение на клавшпиона  smile 

Автор: djman2006 9.8.2007, 21:37
1. Создаешь файл Resorce.rc открываеш блокнотом и пишешь "f8 crazyDLL my.dll"
2. Подключаешь 
Код

{$R 'Resorce.res' 'Resorce.rc'}

3. Процедура извлечения
Код

procedure ExtractResourceToFile1( ResName, ResExtract: String);
var
  ResourceLocation: HRSRC;
  cFileHandle, cResourceDataHandle: THandle;
  cResourceSize, cBytesWritten: Longword;
  cRecourcePath, cResourcePointer: PChar;
begin
  cRecourcePath := PChar( ResExtract );
  ResourceLocation := FindResource(HInstance,PChar(ResName),'crazyDLL');  //<----there!
  cResourceSize := SizeofResource(HInstance,ResourceLocation);
  cResourceDataHandle := LoadResource(HInstance,ResourceLocation);
  cResourcePointer := LockResource(cResourceDataHandle);
  cFileHandle := CreateFile(cRecourcePath,GENERIC_WRITE,FILE_SHARE_WRITE,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  WriteFile( cFileHandle, cResourcePointer^, cResourceSize,cBytesWritten,nil);
  CloseHandle( cFileHandle );
end;

Пример 
Код

ExtractResourceToFile1('f8','C:\my.dll');

Таким образом можно прилепить что-угодно  smile 

Способ 2 (более извращенный)
1. открываем ДЛЛ винхексом выделяем все Edit->Copy->as Pascal source
2. Вставляем ето в прогу 
Код

data: array[0..69119] of byte = (
    $4D, $5A, $90, $00, $03, $00, $00, $00, $04, $00, $00, $00, $FF, $FF, $00, $00, 
    $B8, $00, $00, $00, $00, $00, $00, $00, $40, $00, $00, $00, $00, $00, $00, $00, 
     .. .............. ........................... ............................................................................................
    $49, $4E, $47, $58, $58, $50, $41, $44, $44, $49, $4E, $47, $50, $41, $44, $44, 
    $49, $4E, $47, $58, $58, $50, $41, $44, $44, $49, $4E, $47, $50, $41, $44, $44
);

3. Пишем ето в нетипизированный файл средствами BlockWrite,AssignFile,Rewrite

PS Почему вы говорите "хакер" идт... Я например использовал такие методы для  сокрытия своево процеса от диспетчера задач (пакованный ДЛЛ лепил в ресурсы и извлекал и внедрял). Проект был совсем не "хакерский" - Клубный Шелл (для Компютерных клубов, замена оболочке винды).
PPS Надеюсь чем-то помог
PPPS За плохой русский не пинать

Автор: MaGICaN 10.8.2007, 01:20
ну я бы несказал что клав шпион, яскажу просто кейлогер, создаю его для того чтобы за девушкой проследить неболее, такчто ненадо считать меня злым гением или доктором зло, я простой романтик который совсем неверит девушкам.


я нашел ответ на свой вопрос

для создать файл ресурсов так.


Код

procedure CreateResourceFile(
  DataFile, ResFile: string; // имена файлов
  ResID: Integer // id ресурсов
  );
var
  FS, RS: TFileStream;
  FileHeader, ResHeader: TResHeader;
  Padding: array [0..SizeOf(DWORD)-1] of Byte;
begin

  { Open input file and create resource file }
  FS := TFileStream.Create( 
  DataFile, fmOpenRead);
  RS := TFileStream.Create( 
  ResFile, fmCreate);
  HeaderSize, ResType и ResID }
  FillChar(FileHeader, SizeOf(FileHeader), #0);
  FileHeader.HeaderSize := SizeOf(FileHeader);
  FileHeader.ResId := $0000FFFF;
  FileHeader.ResType := $0000FFFF;
  FillChar(ResHeader, SizeOf(ResHeader), #0);
  ResHeader.HeaderSize := SizeOf(ResHeader);
  ResHeader.ResId := $0000FFFF or (ResId shl 16);
  ResHeader.ResType := $0000FFFF
  or (WORD(RT_RCDATA) shl 16);
  ResHeader.DataSize := FS.Size;
  // Устанавливаем необходимые флаги памяти
  ResHeader.MemoryFlags := $0030;
  RS.WriteBuffer(FileHeader, sizeof(FileHeader));
  RS.WriteBuffer(ResHeader, sizeof(ResHeader));
  RS.CopyFrom(FS, FS.Size);

  { Pad data out to DWORD boundary - any old
  rubbish will do!}
  if FS.Size mod SizeOf(DWORD) <> 0 then
    RS.WriteBuffer(Padding, SizeOf(DWORD) -
    FS.Size mod SizeOf(DWORD));
  FS.Free; 
  RS.Free;
end;


потом дерагать из проги вот так 

Код

procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType, 
FileName:string);
var
  ResStream: TResourceStream;
  FileStream: TFileStream;
begin
  try
    ResStream := TResourceStream.CreateFromID(Instance, ResID, 
    pChar(ResType));
    try
      //if FileExists(FileName) then
      //DeleteFile(pChar(FileName));
      FileStream := TFileStream.Create(FileName, fmCreate);
      try
        FileStream.CopyFrom(ResStream, 0);
      finally
        FileStream.Free;
      end;
    finally
      ResStream.Free;
    end;
  except
    on E:Exception do
    begin
      DeleteFile(FileName);
      raise;
    end;
  end;
end;




всем спасибо за помощь
2 Yanis огромное спасибо за сарказм =)

Автор: W4FhLF 10.8.2007, 06:05
Цитата(MaGICaN @  10.8.2007,  01:20 Найти цитируемый пост)
такчто ненадо считать меня злым гением или доктором зло


Да ладно, ты себе льстишь smile

Автор: MaGICaN 11.8.2007, 02:30
я только учусь =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)