Привязка чужой dll к приложению
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Привязка чужой dll к приложению - 2008-08-23 21:50:13.766666
|
|
|
TiJeY
Сообщений: 1
Оценки: 0
Присоединился: 2008-08-23 21:44:34.903333
|
Народ подскажите как можно привязать чужую dll к приложению, (не имея сурсов не ДЛЛ, не ЕХЕ) может есть какие то программы которые могут с этим справиться или все таки придется использовать Дебаг-программы, если да то можно по подробнее. Заранее спасибо!
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-23 22:23:53.840000
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
По моему мнению это если и реально то тебе придется половину этой программы в машинных кодах переписывать. А дебаг программы не думаю что тебе помогут. Почитай вообще о принципе работы приложения с DLL. Ну а если я не прав то кинь ссылку ге можно почитать как это сделать - удет очень интересно.
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 09:34:09.943333
|
|
|
fromRIDDER
Сообщений: 1075
Оценки: 30
Присоединился: 2008-01-14 20:20:53.380000
|
Тут три варианта, если библиотека - ActiveX-объект, тогда всё просто: регистрируешь библиотеку, открываешь программную среду, находишь пункт меню "Ссылки (Refference)", находишь там свою библиотеку, включаешь в проект и жмёшь информацию о ссылках. - Динамическая библиотека: нужно узнать имена экспортируемых функций и количество аргументов, если ты не знаешь как ими пользоваться, то еще надо узнать типы аргументов и варианты возвращаемых значений. Имена функций определить легко любым PE-редактором, если библиотека написана на C++, в имени функции может присутствать количество аргументов или функция не будет выравнивать стек. Всё остальное можно определить в отладчике. Если есть "родная" программа, использующая эту библиотеку, то всё узнать очень легко. - Статическая библиотека: к моменту, когда я начал изучать программый код, они уже не имели широкого распространения, изучать историю интереса нет, так что ничего не знаю.
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 10:25:22.636666
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
Ну насчет ActiveX возможно ты и прав я в нем ничего не понимаю. Но насчет динамической библиотеки найти имена экспортируемых функций он возможно и сможет, но для того чтобы вызывать их из программы он должен (так как у него не исходников) вызов этой функции вписать в машинных инструкциях и при этом заботиться чтобы не уронить стек и еще много чего (например разбиратсья в РЕ формате чтобы за предели секции кода ниечо не записать). Так что найти названия функции из DLL это самое легкое.
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 11:58:37.703333
|
|
|
SACh
Сообщений: 62
Оценки: 0
Присоединился: 2007-09-28 10:28:06.850000
|
Вот прога, выдёргивает названия функций http://www.wasm.ru/toollist.php?list=7 название D2Inc - ver 0.7 А что ложить в стек сам както должен догодатся[:o]
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 12:24:49.603333
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Я делал подобные вещи. Привязать можно что угодно, тем более dll к exeшнику. Самое главное: знать о экспортируемых функция dll нужно, с какими параметрами вызываются, и как передают результат. Для статической загрузки dll может пригодится прога PETools она просто добавит к уже существующему импорту необходимые функции. Вообще было пару статей по теме http://wasm.ru/print.php?article=addfunc http://cydem.org.ua/pars.php?lnk=add_functions&conf=12 http://wasm.ru/article.php?article=pemodify
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 14:40:04.626666
|
|
|
fromRIDDER
Сообщений: 1075
Оценки: 30
Присоединился: 2008-01-14 20:20:53.380000
|
quote:
ORIGINAL: Dgedit Ну насчет ActiveX возможно ты и прав я в нем ничего не понимаю. Но насчет динамической библиотеки найти имена экспортируемых функций он возможно и сможет, но для того чтобы вызывать их из программы он должен (так как у него не исходников) вызов этой функции вписать в машинных инструкциях и при этом заботиться чтобы не уронить стек и еще много чего (например разбиратсья в РЕ формате чтобы за предели секции кода ниечо не записать). Так что найти названия функции из DLL это самое легкое. Возможно я не прав, но ты знаешь о библиотеках только с точки зрения языков программирования высокого уровня, потому не сильно разбираешься в вызове функций dll. Не нужно ничего вписывать в машинных инструкциях (конечно, если ты мазахист, то можно и так) и заботится о секциях. Если известен прототип функции, её вызов происходит как обычно это происходит в любом языке программирования. Чтобы правильно выровнять стек, достаточно посмотреть в отладчике последнюю инструкцию функции (ret, ret 4, ret 8, …). Количество выравниваемых байт делим на 4 (в 32-битной ОС) - это есть количество аргументов. quote:
ORIGINAL: Flint_ta Вообще было пару статей по теме http://wasm.ru/print.php?article=addfunc http://cydem.org.ua/pars.php?lnk=add_functions&conf=12 http://wasm.ru/article.php?article=pemodify Статьи не совсем в тему, они о вписывании своего кода в уже имеющийся экзэшник. Как я понял у TiJeY есть не его библиотека, а программу он будет писать сам, нужна только информация и функциях библиотеки. TiJeY, если я правильно понял, то покопайся в библе в отладчике или залей её, может кто-нибудь ещё поможет.
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 16:35:17.153333
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
Ну насчет языков высокого уровня ты зря. Я на асме не то чтобы собаку съел, но кое что писал в свое время, так к сути вопроса: Автор топика DLL к файлу вешал не для размера или красоты а скорее всего чтобы вызвать функцию из нее (для других целей не представляю зачем это может понадобиться если знаешь - напиши буду рад расширить кругозор). И теперь главный вопрос а как это сделать? Вот я и пытался автору объяснить что надо для начала - найти секции экспорта - найти вставить там необходимые функции (уже тут начинать выравнивать размер образа PE) - потом после того как он вписал ее правильно начинает искать адрес секции кода который она получит при занрузке в память - после того как найдет начинает ручками считать сколько ему надо начальных машинных кодов программы перенести в конец секции данных - на их место вставляет сначала аргументы его функции из DLL - потом высчитывает адрес где будет находится первая инструкция программы(которую он перенес) - потом он пересчитывает размеры секций их смешение - меняет размеры секции кода OptionalHeader …. Я описал не все просто общий механизм А про языки высокого уровня ты зря я примерно такую программу писал на асме и понимаю про что пишу.
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 16:38:46.750000
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
Ты написал: - Статьи не совсем в тему, они о вписывании своего кода в уже имеющийся экзэшник. Как я понял у TiJeY есть не его библиотека, а программу он будет писать сам, нужна только информация и функциях библиотеки. Мне кажется ты его не так понял, читай что он написал: Народ подскажите как можно привязать чужую dll к приложению, (не имея сурсов не ДЛЛ, не ЕХЕ) Т.е у не него нет исходников ни того ни другого
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 16:51:20.223333
|
|
|
fromRIDDER
Сообщений: 1075
Оценки: 30
Присоединился: 2008-01-14 20:20:53.380000
|
quote:
ORIGINAL: Dgedit Ну насчет языков высокого уровня ты зря. Я на асме не то чтобы собаку съел, но кое что писал в свое время, так к сути вопроса: Автор топика DLL к файлу вешал не для размера или красоты а скорее всего чтобы вызвать функцию из нее (для других целей не представляю зачем это может понадобиться если знаешь - напиши буду рад расширить кругозор). И теперь главный вопрос а как это сделать? Вот я и пытался автору объяснить что надо для начала - найти секции экспорта - найти вставить там необходимые функции (уже тут начинать выравнивать размер образа PE) - потом после того как он вписал ее правильно начинает искать адрес секции кода который она получит при занрузке в память - после того как найдет начинает ручками считать сколько ему надо начальных машинных кодов программы перенести в конец секции данных - на их место вставляет сначала аргументы его функции из DLL - потом высчитывает адрес где будет находится первая инструкция программы(которую он перенес) - потом он пересчитывает размеры секций их смешение - меняет размеры секции кода OptionalHeader …. Я описал не все просто общий механизм А про языки высокого уровня ты зря я примерно такую программу писал на асме и понимаю про что пишу. Вот ты о чём, если в экспорте библиотеки нет нужной функции, тогда полностью согласен, я не подумал об этом, я подумал, что нужные функции экспортируются и проблема в их вызове. Просто, если в экспорте нет нужных функций, как он догадался, что они там вообще есть.
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-24 16:58:42.896666
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
Если ты думать так как ты его понял, то ты абсолютно прав ))) Лучше автор топика сам бы вышел и уточнил что ему надо )))
|
|
|
RE: Привязка чужой dll к приложению - 2008-08-27 12:25:02.806666
|
|
|
SLESH
Сообщений: 109
Оценки: 0
Присоединился: 2005-08-19 11:37:22
|
Лично я действовал следующим методом - написал функцию которая через вирусные методы приписывает код к файлу, перебивает ан него точку входа. код подгружает нужную DLL а потом передает управление на реальный адрес. Кому нуна могут пользоваться данным кодом - я им explroer патчил P.S. заточен код под эксплорер. по этому может не пахать на других прогах. это связано с тем что я внедряю код без увиличения размера проги
var
data: array[0..92] of byte = (
$68, $44, $33, $22, $11, $60, $9C, $E8, $00, $00, $00, $00, $5D, $83, $ED, $0C,
$83, $C5, $5D, $64, $A1, $30, $00, $00, $00, $8B, $40, $0C, $8B, $70, $1C, $AD,
$8B, $40, $08, $55, $89, $C3, $03, $40, $3C, $8B, $50, $78, $01, $DA, $8B, $4A,
$18, $8B, $7A, $20, $01, $DF, $89, $DE, $03, $74, $8F, $FC, $81, $7E, $08, $61,
$72, $79, $41, $75, $08, $81, $3E, $4C, $6F, $61, $64, $74, $06, $E2, $E7, $31,
$C0, $EB, $05, $93, $03, $44, $8A, $24, $FF, $D0, $9D, $61, $C3);
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;
Procedure SetDword(buf:pointer; offs:dword; d:dword);assembler;
asm
mov [eax+edx],ecx
end;
procedure PatchExplorer(dllname:string);
type
TSectionTable=record // структура таблица секции
Object_Name:array[1..8] of char;
Virtual_Size:dword;
Section_RVA:dword;
Physical_Size:dword;
Physical_Offset:dword;
Reserved:array[1..12] of byte;
Object_Flags:dword;
end;
PSectionTable=^TSectionTable;
TARRAY=array[0..255] of byte;
PARRAY=^TARRAY;
var
h:thandle;
PE,EP,IB:dword; // PE Head / Entry Point / Image Base
buf:PARRAY;
x:integer;
correct:boolean;
PID:dword;
d:dword;
hMapping:dword;
mapping:pointer;
Sect:PSectionTable;
windir:TARRAY;
filename:string;
begin
filename:='explorer.exe';
dllname:=dllname+#0;
h:=CreateFile(pansichar(filename), DWORD($80000000) or $40000000, $00000001 or $00000002, nil, 3, $00000080, 0);
d:=GetFileSize(h, nil);
hMapping:=CreateFileMapping(h, nil, 4, 0, d, nil);
mapping:=MapViewOfFile(hMapping, 4 or 2, 0, 0, d);
PE:=dword(pointer(dword(mapping)+$3C)^);
EP:=dword(pointer(dword(mapping)+PE+$28)^);
IB:=dword(pointer(dword(mapping)+PE+$34)^);
SetDword(@data[0],1,EP+IB);
Sect:=pointer(dword(mapping)+PE+248);
buf:=pointer(dword(mapping)+Sect^.Physical_Offset+Sect^.Physical_Size-sizeof(data)-dword(length(dllname)));
correct:=true;
for x:=0 to sizeof(data)+length(dllname)-1 do if buf^[x]<>0 then correct:=false;
if correct then
begin
EP:=Sect^.Section_RVA+Sect^.Physical_Size-sizeof(data)-dword(length(dllname));
dword(pointer(dword(mapping)+PE+$28)^):=EP;
CopyMemory(pointer(dword(mapping)+Sect^.Physical_Offset+Sect^.Physical_Size-sizeof(data)-dword(length(dllname))),@data,sizeof(data));
CopyMemory(pointer(dword(mapping)+Sect^.Physical_Offset+Sect^.Physical_Size-dword(length(dllname))),@dllname[1],length(dllname));
end else exit;
UnmapViewOfFile(mapping);
CloseHandle(hMapping);
CloseHandle(h);
end;
юзается это примерно так: PatchExplorer('myDLL.dll');
|
|
|
|
|