-
добрый день, сразу оговорюсь, пишется не вредоносное ПО... нужно от имени блокнота выполнить некоторые действия, т.е. в недрить свою библиотеку в его процесс. вот функция внедрения (мне кажется она многим знакома будет)):
function Load_DLL(DllName: PChar; PID: dword): boolean;
var
hProc: dword;
lpStartAddress, pmem: pointer;
wrb, lpThId: dword;
begin
if not FileExists(DLLName) then
ShowMessage('dll not found')
else
begin
hProc:=OpenProcess(PROCESS_ALL_ACCESS or PROCESS_VM_WRITE, true, PID);
if (hProc<>0) then
begin
lpStartAddress:= GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
pmem:= VirtualAllocEx(hProc, nil, 255, MEM_COMMIT, PAGE_READWRITE);
if (pmem=nil) then
result:=false
else
begin
if not WriteProcessMemory(hProc, pmem, DllName, Length(DllName), wrb) then
result:=false
else
if (dword(Length(DllName)) = wrb) then
result:=CreateRemoteThread(hProc, nil, 0, lpStartAddress, pmem, 0, lpThId)<>0
else
result:=false;
end;
end
else
result:=false;
end;
end;
Функция отрабатывается с результатом true, но до библиотеки дело не доходит(( т.е. если я, при компиляции dll, укажу в host application свое приложение, подгружающее dll, поставлю в начале библиотеки точку остановки... приложение отрабатывает, но в dll не суется... Подскажите что не так?
-
Вероятно просто отладочная информация к библиотеке не подключилась - это давний известный глюк дельфевого отладчика. В самой библиотеке MessageBox выведи и увидишь что она внедрилась нормально.
-
ну вот пока элементарный код библиотеки: library ShowMe;
uses
Windows, Dialogs;
begin
try
ShowMessage('dll is load');
except
end;
end. ставлю точку останова на ShowMessage... фиг(..
-
ну и собственно сообщения тоже нет
-
а нукась сделай так: lpStartAddress:= GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW');
-
тот же эффект, вернее его отсутствие)
-
сначала грешил на Win 7, думал может че поменяли при работе с потоками, проверил на ХР - тоже самое..
-
Выкладывай проект архивом.
-
программа, внедряющая dll:
program rp;
uses
Windows,
Tlhelp32,
SysUtils,
Dialogs;
function Load_DLL(DllName: PChar; PID: dword): boolean;
var
hProc: dword;
lpStartAddress, pmem: pointer;
wrb, lpThId: dword;
begin
if not FileExists(DLLName) then
ShowMessage('dll not found')
else
begin
hProc:=OpenProcess(PROCESS_ALL_ACCESS or PROCESS_VM_WRITE, true, PID);
if (hProc<>0) then
begin
lpStartAddress:= GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW');
pmem:= VirtualAllocEx(hProc, nil, 255, MEM_COMMIT, PAGE_READWRITE);
if (pmem=nil) then
result:=false
else
begin
if not WriteProcessMemory(hProc, pmem, DllName, Length(DllName), wrb) then
result:=false
else
if (dword(Length(DllName)) = wrb) then
result:=CreateRemoteThread(hProc, nil, 0, lpStartAddress, pmem, 0, lpThId)<>0
else
result:=false;
end;
end
else
result:=false;
end;
end;
function SetSeDebugPrivilege:boolean;
var
ht:THandle;
luid:TLargeInteger;
tkp:TTokenPrivileges;
rl:Cardinal;
begin
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, ht) then
begin
LookupPrivilegeValue(nil, 'SeDebugPrivilege', luid);
tkp.Privileges[0].Luid:=luid;
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(ht, false, tkp, 0, nil, rl) then
result:=true
else
result:=false;
end
else
result:=false;
end;
function GetPID(ExeFileName: string): dword;
var
ContinueLoop, ffound: boolean;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
UpEFN: string;
begin
result:=0;
ffound:=false;
UpEFN:=UpperCase(ExeFileName);
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpEFN)
or (UpperCase(FProcessEntry32.szExeFile) = UpEFN)) then
begin
result := FProcessEntry32.th32ProcessID;
ffound:=true;
break;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
if not ffound then
ShowMessage('notepad.exe is not runing');
end;
const DllName = 'ShowMe.dll';
var
PID: dword;
begin
SetSeDebugPrivilege;
PID:=GetPID('notepad.exe');
if (PID>0) then
Load_DLL(DllName, PID);
end.
ну и сама dll:
library ShowMe;
uses
Windows, Dialogs;
begin
try
ShowMessage('dll is load');
except
end;
end.
весь проект) застрял на начальном этапе..
-
Путь к библиотеке неправильно передаешь, он должен быть полный: Load_DLL(PChar(ExtractFilePath(ParamStr(0)) + DllName), PID);
-
-
путь к библиотеке может и некоректно прописан, но тем не менее, она все равно лежит в папке с проектом... да и в функции, до попытки ее загрузки есть проверка ее присутствия.. так что дело не в этом
-
за ссылку - отдельное спасибо... сколько не искал в поисковиках - на нее не выходил.
-
> так что дело не в этом
Что значит не в этом? :) Обьясняю на пальцах, допустим твой экзешник и библиотека лежат в папке C:\tmp\. Путь к библиотеке у тебя не указан, указано только ее имя. Когда выполняется FileExists, раз пути нет - используется текущий, который как раз и равен C:\tmp\. Когда ты инжектируешь библиотеку в блокнот, то с какой радости ты предполагаешь что его путь по умолчанию тоже равен твоему C:\tmp\? Нет, он у него свой и равен C:\Windows\ и в этой папке твоей библиотеки ShowMe.dll нет, поэтому ничего и не загружается.
Это только первый нюанс.
Во вторых ты не сказал какую версию дельфи ты используешь? Если Delphi 2010 и выше, то там PChar по умолчанию юникодный, поэтому загружать нужно функцию LoadLibraryW, если же используется Delphi версии 2007 и ниже, то использовать нужно LoadLibraryA
Когда поправишь все эти моменты - все заработает.
-
delphi 2010, 1 нюанс - согласен, не додумал, 2 - даже не знал... тем нее менее:
begin
SetSeDebugPrivilege;
PID:=GetPID('notepad.exe');
if (PID>0) then
begin
Load_DLL(PChar(ExtractFilePath(ParamStr(0)) + DllName), PID);
end;
end.
и тут:
lpStartAddress:= GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW');
неработает...
-
для возможности отладки библиотеки, пока сделал так:
const DllName = 'E:\projects\DLL Injecting\dll\ShowMe.dll';
и вызов оставил таким:
Load_DLL(DllName, PID);
не подгружается
-
-
о как... все оказалось странно). messagebox отрабатывается, а showmessage нет...
-
но вопрос остается: как отлаживать dll?
-
Сначала делай отладку на своем тестовом приложении, а потом можешь уже подключаться к удаленному... Мне всегда на тестовом отладки хватало.
-
т.е. сначала стандартно подключаю библиотеку в своем приложении, отлаживаю, а уж потом, готовую, внедряю в чужой процесс, так?
-
> нужно от имени блокнота выполнить некоторые действия
занятно. почему от имени блокнота и какие действия ?
-
блокнот - это образно, просто на нем тестирую внедрение.)
-
> cad (12.04.13 12:07) [20] > т.е. сначала стандартно подключаю библиотеку в своем приложении, > отлаживаю, а уж потом, готовую, внедряю в чужой процесс, > так?
угу
-
> пишется не вредоносное ПО... нужно от имени блокнота выполнить > некоторые действия,
> блокнот - это образно, просто на нем тестирую внедрение
теперь на счет вредоносного ПО - не верю. или приведи имя ПО для которого это делается? почему сразу не озвучено для кого?
-
мужики, вам так сильно нужно знать зачем? я же сказал, не собираюсь я писать трояны и продавать их. Вас устроит, если я отвечу, что пишу курсовую по теме обхода безопасности в Windows?) или пишу "свой" punto switcher?). если нет, ну пусть модераторы банят тему. Rouse_ - отдельное спасибо за помощь.
-
> писать трояны и продавать их
их не продают, а впаривают )
-
brather: ну наверное тебе виднее) впаривать я тоже ниче не собираюсь)
-
чет не понял - а чего это народ так перевозбудился на абсолютно штатную тему инжектирования? :) Список задач, в которых данных подход применяется легально будет достаточно обширен, если что :)
-
Rouse_ - еще раз спасибо! поддержал..)
-
> cad (12.04.13 18:46) [29] > Rouse_ - еще раз спасибо! поддержал..)
Та не переживай, если что я и есть модераторы, которых ты звал :)
-
ух ты!! обалдеть...
-
кстати, статья твоя оч полезна была
-
> cad (12.04.13 18:50) [32] > кстати, статья твоя оч полезна была
Верю, там в блоге еще много чего полезного :) Можешь еще тут глянуть - тоже пригодиться :) http://rouse.drkb.ru/
-
думаю еще у меня вопросы возникнут.. уж не дуйся, задам) ребят, кто писал, тоже не думайте что я "злойсуперхакер")
-
Rouse_ - слушай, а как думаешь, почему ShowMessage не отрабатывалось, а MessageBox отработала?
-
> cad (12.04.13 18:56) [35] > Rouse_ - слушай, а как думаешь, почему ShowMessage не отрабатывалось, > а MessageBox отработала?
А шут ее знает, я даже не анализировал. На домашней машине ShowMessage отработал, на рабочей нет (я поэтому и удивался когда ты сказал что не показывает).
Лезть в глубь и выяснять причину - не охота ес чесно :)
-
согласен)
-
> Rouse_ © (12.04.13 18:21) [28] > > чет не понял - а чего это народ так перевозбудился на абсолютно > штатную тему инжектирования?
А чё тут не понятного? Инжектирование - средство двоякого применения. Может использоваться как в "мирных", так и в "военных" целях. А истинные свои стремления ТС выразил очень туманно и подозрительно. А то, что автор аноним тем более подозрительно.
-
опять 45
-
Удалено модератором
-
Удалено модератором
-
Завязывайте с флудом...
-
> Германн © (13.04.13 02:37) [38] > А чё тут не понятного? > Инжектирование - средство двоякого применения.
Мошт обсуждение записи в реестр запретим? А то я там тоже очень много страшных вещей знаю. ;)
-
респект мужик (to Rouse_)
-
> cad (13.04.13 14:05) [44]
А ты кстати, зарегистрируйся, так оно правильней будет :)
-
ок
-
> Rouse_ © (13.04.13 12:07) [43]
Я просто забыл поставить там смайлик :)
-
Но пока подожду, пока cad зарегистрируется.
-
зарегистрировался дядьки
-
и все звали сирожа его)
-
)))))) бинго
-
лет 5 уже на форуме.. вот заставил Rouse_ имя сказать))
-
Rouse_ : "Если Delphi 2010 и выше, то там PChar по умолчанию юникодный, поэтому загружать нужно функцию LoadLibraryW" - фиг... как раз LoadLibraryA корректно работает
-
> cad © (14.04.13 22:02) [53] > фиг... как раз LoadLibraryA корректно работает
Хм, значит я зря распылялся. Учишь вас... а знаний не прибавляется :) Посмотри мой пример внимательно и объясни почему он работает именно через LoadLibraryA, не смотря на то что Char в 2010-ой дельфи юникодный :)
-
Правила форума нужно уважать.
-
Удалено модератором
-
Rouse_:
DllPath: AnsiString;
потому что имя библиотеки хранится как ANSI строка?
-
> cad © (18.04.13 13:55) [57] > DllPath: AnsiString; > потому что имя библиотеки хранится как ANSI строка?
Абсолютно верно :)
-
Удалено модератором
-
|