Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внедрение DLL 
:(
    Опции темы
a.S.d
Дата 14.3.2005, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Я внедряю длл в чужой процесс. В длл код, который должен отсылать почту. Но почему-то ничего не отсылается(если сделать просто приложение, то отсылка работает).
Вот код, внедряющий длл:
Код
 
dll:='c:\testlib.dll'; 
pid:=GetIDProcess('IEXPLORE.exe'); //процедура GetIDProcess 
//описана ранее 
Process := OpenProcess(PROCESS_ALL_ACCESS, False, PID); 
param:=VirtualAllocEx(Process, nil, 40960, MEM_COMMIT, PAGE_READWRITE); 
WriteProcessMemory(Process, param, pointer(dll), 4096, byt); 
CreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA'), Param, 0, ThreadId); 

Сама длл:
Код
 
library testlib; 
uses 
  Windows, 
  Messages, 
  sysutils, 
  system, 
  registry,idsmtp,IdMessage; 
 
var 
mes:tidmessage; 
smtp:tidsmtp; 
procedure MailSend; 
begin 
 smtp:=TIdSMTP.Create(nil); 
 mes:=TIdMessage.Create(smtp); 
 smtp.Host := 'smtp.xxx.ru'; 
 smtp.Port := 25; 
 mes.From.Text := '[email protected]'; 
 mes.Recipients.EMailAddresses := '[email protected]'; 
 mes.Subject := 'XXX'; 
 mes.Body.Text :='YYYYYYYYYYY '; 
 smtp.Connect(100000); 
 smtp.Send(mes); 
 smtp.Disconnect; 
 mes.Free; smtp.Free; 
end; 
begin 
mailsend; 
end. 

В чём тут дело?


PM MAIL   Вверх
a.S.d
Дата 14.3.2005, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Причём запарывается на smtp.Connect(100000); почему-то.
PM MAIL   Вверх
a.S.d
Дата 15.3.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Как выяспилось в библиотеке не работает всё, что связано с сетью, даже просто соединение сокетов, не зависимо от того какой процесс её подгружает. Как сделать чтоб отправка работала?

Это сообщение отредактировал(а) a.S.d - 15.3.2005, 00:24
PM MAIL   Вверх
oleg1973
Дата 15.3.2005, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



я вообще удевляюсь как оно у тебя работает
фактически ты просто впихиваеш длл в процесс,даже не как длл а как просто кусок кода, без учета специфики загоузки РЕ файлов в винде,
тамже нада импорты заполнить да и секции раскидать по своим местам







--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 15.3.2005, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Цитата(oleg1973 @ 15.3.2005, 01:22)
я вообще удевляюсь как оно у тебя работает
фактически ты просто впихиваеш длл в процесс,даже не как длл а как просто кусок кода, без учета специфики загоузки РЕ файлов в винде,
тамже нада импорты заполнить да и секции раскидать по своим местам

Дык вроде у него судя по коду всё-таки DLL подгружается к чужому процессу... CreateRemoteThread "вызывает" LoadLibrary ('c:\testlib.dll')... А в DLL при подключении делаются свои дела...
Delphi нормально должна компилить DLL, с импортами и секциями...

Или ты про что ?...


--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 15.3.2005, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



А причём тут внедрение? smile

проблема там где ты пытаешься отправить почту, тот код отправки сам посебе вобще работоспобен?

и что за smtp.Connect(100000); ?
у моих индейцев такого вообще нет, просто smtp.Connect;
(может у меня старая версия индейцев)
Добавлено @ 06:21
Кстати есть такаой компонент CTRLSOCK (не VCL) специально для таких целей.

http://tothpaul.free.fr/zip/CRTSOCK.ZIP

Это сообщение отредактировал(а) RAdmin - 15.3.2005, 06:22
PM   Вверх
a.S.d
Дата 15.3.2005, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



RAdmin
Код работоспособен, я же написал что если сделать приложение а не библиотеку, то всё работает.
PM MAIL   Вверх
RA
Дата 15.3.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



a.S.d Ладно тогда покажи полный код того как ты внедряешь DLL.
PM   Вверх
oleg1973
Дата 15.3.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



Код

CreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA'), Param, 0, ThreadId); 

вся фигня в том что после этого куска что происходит?
выполнив LoadLibrary треад заканчивает свою работу и соответственно автоматом выгружается либа

я думаю тут косяк


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
RA
Дата 15.3.2005, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Знач, после этого куска нужно вставить WaitForSingleObject(Thread,INFINITE);
PM   Вверх
Girder
Дата 15.3.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(oleg1973 @ 15.3.2005, 11:26)
я думаю тут косяк
smile

Цитата(RAdmin @ 15.3.2005, 11:35)
Знач, после этого куска нужно вставить WaitForSingleObject(Thread,INFINITE);
smile

Код

 dll:='e:\testlib.dll'+#0;
 pid:=...
 Process := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
 param:=VirtualAllocEx(Process, nil, Length(dll), MEM_COMMIT, PAGE_READWRITE);
 WriteProcessMemory(Process, param, PChar(dll), Length(dll), byt);
 oTheread:=CreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA'), Param, 0, ThreadId);
 ...


Код
library testlib;

uses
  Windows, idsmtp, IdMessage;


{$R *.res}

var mes:tidmessage;
    smtp:tidsmtp;
procedure MailSend;
begin
 smtp:=TIdSMTP.Create(nil);
 mes:=TIdMessage.Create(nil);
 smtp.Host := 'smtp.XXX.XX';    
 smtp.Port := 25;
 smtp.Password:='Мой пароль';
 smtp.Username:='Мой логин';
 smtp.AuthenticationType:=atLogin; //Типо по паролю и все такое
 smtp.HeloName:='Info';
 mes.From.Text := '[email protected]';
 mes.Sender.Text:='[email protected]';
 mes.Recipients.EMailAddresses:='[email protected]';
 mes.Subject := 'Gbvier';
 mes.Body.Text :='YYYYYYYYYYY';
 mes.MessageParts.Clear;
 try
  smtp.Connect;
  smtp.Send(mes);
 except
 end;
 smtp.Disconnect;
 mes.Free;
 smtp.Free;
end;

begin
 mailsend; 
end.


PS: Если не хочеш по паролю и все такое... то береш нужный тебе домен к примеру newmail.ru и через DNS определяеш Mail сервера (IdDNSResolver.QueryRecords:=[qtMX]) для данного адресса и пытаешся послать письмо через полученные Mail сервера(в ентом случаи smtp.AuthenticationType:=atNone).



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
RA
Дата 15.3.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Я просто имел в виду это:

Код


uses
  Windows, TLHelp32, SysUtils;

VAR
  PID     : DWORD;
  Process : DWORD;


function GetProcessID(PeFile:STRING) : Integer;
VAR
  hProcSnap : THandle;
  pe32      : TProcessEntry32;
BEGIN
  Result:=-1;
  hProcSnap:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
  IF hProcSnap=INVALID_HANDLE_VALUE THEN Exit;
  pe32.dwSize:=SizeOf(ProcessEntry32);
  IF Process32First(hProcSnap,pe32)=True THEN
  WHILE Process32Next(hProcSnap,pe32)=True DO IF Pos(PeFile,UpperCase(pe32.szExeFile))>0 THEN Result:=pe32.th32ProcessID;
end;

function InjectLibrary(Process:LongWord;DLLPath:pChar) : Boolean;
VAR
  BytesWritten : DWORD;
  Thread       : DWORD;
  ThreadID     : DWORD;
  Parameters   : Pointer;
BEGIN
  Result:=False;
  Parameters:=VirtualAllocEx(Process,NIL,4096,MEM_COMMIT,PAGE_READWRITE);
  IF Parameters=NIL THEN Exit;
  WriteProcessMemory(Process,Parameters,Pointer(DLLPath),4096,BytesWritten);
  Thread:=CreateRemoteThread(Process,NIL,0,GetProcAddress(GetModuleHandle('KERNEL32.DLL'),'LoadLibraryA'),Parameters,0,ThreadId);
  WaitForSingleObject(Thread,INFINITE);
  VirtualFreeEx(Process,Parameters,0,MEM_RELEASE);
  IF Thread=0 THEN Exit;
  CloseHandle(Thread);
  Result:=True;
end;

  PID:=GetProcessID('HL.EXE');
  Process:=OpenProcess(PROCESS_ALL_ACCESS,False,PID);
  InjectLibrary(Process,'C:\cd.dll');


PM   Вверх
Girder
Дата 15.3.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(RAdmin @ 15.3.2005, 13:27)
Я просто имел в виду это:
Можно... конечно(Но ожидание все таки... лишние - нам же результат не нужен).

PS: a.S.d не забудь выгружать библиотеку smile

Это сообщение отредактировал(а) Girder - 15.3.2005, 15:48


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
a.S.d
Дата 15.3.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Всем спасибо, всё работает, проблема была здесь:
Код

try    
smtp.Connect;    
smtp.Send(mes);    
except    
end;

PM MAIL   Вверх
a.S.d
Дата 16.3.2005, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 20.2.2005

Репутация: нет
Всего: 2



Ещё вопрос: почему приложение, которое подгружает библиотеку, всё время виснет, ведь библиотека работает независимо от приложения? Как этого избежать?
Girder
А как её выгружать? Надо опять писать в память процесса процедуру выгрузки?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0665 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.