![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток без длл или самодостаточный код
kaZaNoVa © (2004-11-10 18:01:00)Идея: создать программу, которая могла бы "создавать самодостаточный код" - в плане того, чтобы возможно внедриться в другой процесс, и при этом НЕ подгружать дополнительных DLL ;)
Я давно интересовался этой темой, и только недавно нащёл реализацию:
(использованы материалы с сайта http://www.iamaphex.cjb.net)
код:
program Project1;
{$IMAGEBASE $13140000}
uses
Windows;
function Main(dwEntryPoint: Pointer): longword; stdcall;
begin
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
MessageBox(0, 'Ok', 'Hijacked Process', 0);
// ExitProcess(0);
Result := 0;
end;
procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;
var
ProcessHandle, PID: longword;
begin
GetWindowThreadProcessId(FindWindow('Progman', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
end.
Меня интересует - всё ли в этом примере правильно - нет ли негде "подводных камней" ?
И, что будет, если в созданном потоке возникнет исключение - "процесс-носитель" в этом случае завершится ? - как в таком случае можно обрабатывать исключения ?
Digitman (2004-11-17 08:09:00) [61]
> kaZaNoVa
без отладчика и хотя бы элементарного знания ассемблера решить подобную задачу надежно и эффективно вряд ли получится .. по кр.мере на первых порах
можно долго и нужно выспрашивать здесь "азы" (коих ой как немало), но толку от этого будет с гулькин нос .. для "толка" будет крайне полезно запустить под отладчиком целевой процесс, записать код внедряемого трэда в целевое АП, поставить брейкпойнт на точке входа в трэд-функцию и далее шаг за шагом пройти тело трэда, внимательно контролируя всякий раз обращения мащ.инструкций к памяти и сравнивая ожидаемое с действительным .. это лучший способ понять, "чего в супе не хватает" или чего там явно лишнего
kaZaNoVa (2004-11-16 19:06:00) [62]Игорь Шевченко © (16.11.04 17:43) [48]
также, по поводу " рано ли":
можно годами изучать "основы", и изучить их в совершенстве, и топтаться на месте ...
можно изучить основы, а потом и всё более сложное- идеальный вариант, но не всегда для этого есть время и желание ...
а можно так - поставить задачу, изучить быстро всё, что нужно именно для этой задачи - и выполнит её ! - пусть не будет глубоких систематических знаний, НО задача будет решена - а это главное !!!
п.с. раньше я всегда боялся "спросить что-нить простое" - так как боялся выглядеть некомпетентным ..
и этот подход мне принёс в своё время массу проблем ..
Теперь я считаю - лучше раз спросить что-то из азов, и , возможно, показаться "ламаком", но, при полученном грамотном ответе - понятьэто, и решить задачу более грамотно ..
по поводу "читай справку", "есть в FAQ" - не спорю, важно .. НО почему-то во всех университетах есть консультациис преподавателями - так как не каждая задача есть в справке, и не каждый сможет найти быстро ответ .. а иначе бы никаких "консультаций" не существовало бы - всех бы отсылали к энциклопедиям .. ;)
//извиняюсь за оффтоп - но это была моя самая главная мысль по поводу "внешне глупых вопросов" ...
kaZaNoVa (2004-11-16 18:53:00) [63]Игорь Шевченко © (16.11.04 17:43) [48]
признаюсь .. что некоторые вещи я вообще не знаю ..
- все мы специалисты в какой-то своей области ....
Игорь Шевченко (2004-11-16 17:43:00) [64]kaZaNoVa © (16.11.04 17:16) [46]
> string(переменная типа cardinal) - ерунда получается ...
> ;(
Я очень извиняюсь, но не рано ли с такими знаниями браться за "Поток без длл или самодостаточный код " ?
Digitman (2004-11-16 17:25:00) [65]
> string(переменная типа cardinal) - ерунда получается
разумеется ерунда ... ибо в дан.случае преобразование к неявному вызову п/программ, расположенных в system.pas
kaZaNoVa (2004-11-16 17:16:00) [66]Digitman © (16.11.04 8:09) [45]
а ручками - это как ?
string(переменная типа cardinal)- ерунда получается ... ;(
Digitman (2004-11-16 08:09:00) [67]
> как можно тогда преобразовать
ручками !
> при попытке вызвать какие-нить API-функции, могут возникнуть
> исключения
какие конкретно ?
kaZaNoVa (2004-11-15 21:00:00) [68]любопытно, что о сабже много в нете упоминаний, но дальше теории почти нигде ничего нет .. ;)
по теме - при попытке вызвать какие-нить API-функции, могут возникнуть исключения - как можно обработать ?
kaZaNoVa (2004-11-15 17:09:00) [69]Digitman © (15.11.04 17:00) [42]
> для использования станд.ф-ций "преобразования" в АП
> "чужого" процесса должны присутствовать как минимум
> модули System, SysUtils
так я же его (екзешник) полностью копирую, функции из System должны быть ..
функции из SysUtils не использую ...
- как можно тогда преобразовать ?
Digitman (2004-11-15 17:00:00) [70]
> мне надо отладить
на то есть, к примеру, оч даже неплохой дебаггер OllyDbg
> хотел все адреса (Pointer'ы) - преобразовать в стринги и
> вывести мессагебоксом .. - в целях отладки ...
для использования станд.ф-ций "преобразования" в АП "чужого" процесса должны присутствовать как минимум модули System, SysUtils
жми F1 на фразе "Str" - в справке черным по белому написано, что декларация и реализация этой проц-ры находится в модуле system.pas
> выдаётся исключение .. прога завершается .. странно
ничего странного.
kaZaNoVa (2004-11-15 16:53:00) [71]так при I(5) к примеры - выдаётся исключение .. прога завершается .. странно ..
kaZaNoVa (2004-11-15 16:52:00) [72]я хотел все адреса (Pointer'ы) - преобразовать в стринги и вывести мессагебоксом .. - в целях отладки ...
kaZaNoVa (2004-11-15 16:51:00) [73]Digitman © (15.11.04 16:36) [38]
мне надо отладить ..
как ? %_)))
> с какого перепугу "cardinal в string" преобразуется ?
Function I(t:cardinal):string;
Begin
Str(t,result);
End;
Digitman (2004-11-15 16:36:00) [74]
> галки НЕТ
щзначит, остается проблема "статики".
> как отлаживать его ?
вопрос отдельный.
> почему-то не могу преобразовать cardinal в string
с какого перепугу "cardinal в string" преобразуется ?
kaZaNoVa (2004-11-15 16:18:00) [75]а как отлаживать его ?
(код в чужом процессе ?)
и я почему-то не могу преобразовать cardinal в string . . выдвётся исключение
kaZaNoVa (2004-11-15 16:16:00) [76]галки НЕТ
Digitman (2004-11-15 16:11:00) [77]
> kaZaNoVa © (15.11.04 15:40) [34]
слушай, я устал уже.
говорим на совершенно разных языках.
последний вопрос в надежде восстановить "понимание" - в опциях проекта, в котором ты пытаешься "влупить" некий код в "чужое" АП, галка "Build With Run-Time Packages" стоит или "висит" ?
kaZaNoVa (2004-11-15 15:40:00) [78]Digitman © (15.11.04 15:38) [33]
> те самые 15-20к твоего ехе - это ВЕСЬ код ? или код в
> расчете на использование кода из ран-тайм пакетов ?
весь код ...
Digitman (2004-11-15 15:38:00) [79]
> kaZaNoVa © (15.11.04 15:28) [30]
> слыхал .. но это имхо не то ..
> (их таскать за собой придётся ...)
и это все что ты знаешь о ран-тайм пакетах ? применительно к поднятой тобой теме ?
те самые 15-20к твоего ехе - это ВЕСЬ код ? или код в расчете на использование кода из ран-тайм пакетов ?
kaZaNoVa (2004-11-15 15:30:00) [80]Digitman © (15.11.04 15:26) [29]
> и долго ты тут будешь захламлять ветку, без конца
> дублируя код от "старых попыток" ? например, код
> установки привелегий чего-то там, НЕ имеющий к сабжу
> никакого отношения ?
постараюсь приводить только "значимый" код ;)))