PDA

Ver la Versión Completa : Jugando con el messenger


seoane
17-07-2007, 22:36:38
Hace unos días hablábamos de la inyección de código y hacer hooks a las APIs. Pues bien me he puesto a jugar un poco, y esto es lo que he conseguido por ahora, una dll que se inyecta en el messenger, hace un hook en las APIs Send, WSASend y WSARecv, y cuando el messenger envía o recibe algo la dll utiliza la función OutputDebugString para mostrarnos lo que se envía o se recibe.

Es solo una prueba de concepto:

library HookIt;

uses
Windows,
Sysutils,
Messages,
Psapi,
ImageHlp,
winsock;

type
IMAGE_IMPORT_DESCRIPTOR = record
Characteristics: DWORD;
TimeDateStamp: DWORD;
ForwarderChain: DWORD;
Name: DWORD;
FirstThunk: DWORD;
end;
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;

u_int = Integer;
TSocket = u_int;

TWSABUF = record
len: u_long;
buf: PChar;
end;
PWSABUF = ^TWSABUF;

TSendFunc = function (s: TSocket; Buf: Pchar; len, flags: Integer): Integer; stdcall;
TWSASendFunc = function(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
TWSARecvFunc = function(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;

const
// Cambiar la ruta del messenger si es necesario
strTarget = 'C:\Archivos de programa\MSN Messenger\msnmsgr.exe';

var
Injected: Boolean;
ModuleHandle: DWORD;
OldSend: TSendFunc;
OldWSASend: TWSASendFunc;
OldWSARecv: TWSARecvFunc;

function newSend(s: TSocket; Buf: PChar; len, flags: Integer): Integer; stdcall;
begin
OutputDebugString(PChar('Send: ' + String(Buf)));
if @OldSend <> nil then
Result:= OldSend(s,Buf,len,flags)
else
Result:= -1;
end;

function newWSASend(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
var
i: DWORD;
P: PWSABUF;
begin
i:= dwBufferCount;
P:= lpBuffers;
while i > 0 do
begin
OutputDebugString(PChar('Recv: ' + String(P.Buf)));
dec(i);
inc(P);
end;
if @OldWSASend <> nil then
Result:= OldWSASend(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,
lpOverlapped,lpCompletionRoutine)
else
Result:= -1;
end;

function newWSARecv(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
var
i: DWORD;
P: PWSABUF;
begin
if @OldWSARecv <> nil then
Result:= OldWSARecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,
lpOverlapped,lpCompletionRoutine)
else
Result:= -1;
i:= dwBufferCount;
P:= lpBuffers;
while i > 0 do
begin
OutputDebugString(PChar('Recv: ' + String(P.Buf)));
dec(i);
inc(P);
end;
end;

// Ajustamos los privilegios
function EnablePrivilege(PrivilegeName: PChar; Enable: Boolean): Boolean;
var
hToken: THandle;
Tp: TOKEN_PRIVILEGES;
Luid: TLargeInteger;
begin
Result:= FALSE;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY or TOKEN_READ, hToken) then
if LookupPrivilegeValue(nil,PrivilegeName,Luid) then
begin
Tp.PrivilegeCount:= 1;
Tp.Privileges[0].Luid:= Luid;
if Enable then
Tp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED
else
Tp.Privileges[0].Attributes:= 0;
Result:= AdjustTokenPrivileges(hToken,FALSE,Tp,0,nil,PDWORD(nil)^);
CloseHandle(hToken);
end;
end;

function HookFunction(ModName, ProcName: PChar; Nuevo: Pointer): Pointer;
var
i: Integer;
hProcess: THandle;
hModules: array[0..1024] of HMODULE;
cbNeeded: DWORD;
hMod: HMODULE;
ImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
Size: Cardinal;
szModName: PChar;
Thunk: PPointer;
MBI: MEMORY_BASIC_INFORMATION;
begin
Result:= nil;
hMod:= GetModuleHandle(ModName);
if hMod <> 0 then
begin
Result:= GetProcAddress(hMod, ProcName);
if Result <> nil then
begin
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
FALSE, GetCurrentProcessId);
if hProcess <> 0 then
begin
if EnumProcessModules(hProcess, @hModules, Sizeof(hModules), cbNeeded) then
for i:= 0 to (cbNeeded div Sizeof(HMODULE)) - 1 do
begin
ImportDesc:= ImageDirectoryEntryToData(Pointer(hModules[i]),
TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, Size);
if ImportDesc <> nil then
begin
while ImportDesc.Name > 0 do
begin
szModName:= PChar(hModules[i] + ImportDesc.Name);
if StrIComp(szModName,ModName) = 0 then
begin
Thunk:= Pointer(hModules[i] + ImportDesc.FirstThunk);
while Thunk^ <> nil do
begin
if Thunk^ = Result then
begin
OutputDebugString('Hookeado');
VirtualQuery(Thunk,MBI,Sizeof(MEMORY_BASIC_INFORMATION));
VirtualProtect(MBI.BaseAddress,MBI.RegionSize,PAGE_READWRITE,
MBI.Protect);
Thunk^:= Nuevo;
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,
MBI.Protect);
end;
inc(Thunk);
end;
end;
inc(ImportDesc);
end;
end;
end;
end;
end;
end;
end;

procedure Inject(LibPath: PChar); stdcall;
var
Procesos: array[1..1024] of DWORD;
Needed, i: DWORD;
Process, Thread: THandle;
ModName, Target: array[0..MAX_PATH] of Char;
RemLibPath: PChar;
begin
if ModuleHandle = 0 then
if EnablePrivilege('SeDebugPrivilege', TRUE) then
begin
FillChar(Target,Sizeof(Target),#0);
//GetSystemDirectory(@Target,Sizeof(Target)-1);
StrLCat(Target,strTarget,Sizeof(Target)-1);
if EnumProcesses(@Procesos, SizeOf(Procesos), Needed ) then
begin
for i:= 1 to (Needed div Sizeof(DWORD)) do
begin
Process := OpenProcess(PROCESS_ALL_ACCESS, FALSE,Procesos[i]);
if Process <> 0 then
begin
if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1) > 0 then
begin
if AnsiStrPos(ModName,Target) <> nil then
begin
RemLibPath:= VirtualAllocEx(Process, nil,StrLen(LibPath)+1,
MEM_COMMIT, PAGE_READWRITE);
if RemLibPath <> nil then
begin
if WriteProcessMemory(Process, RemLibPath, LibPath,
StrLen(LibPath),PDWORD(nil)^) then
begin
Thread:= CreateRemoteThread(Process, nil, 0,
GetProcAddress(GetModuleHandle('Kernel32'),'LoadLibraryA'),
RemLibPath, 0, PDWORD(nil)^);
if Thread <> 0 then
begin
WaitForSingleObject(Thread,INFINITE );
GetExitCodeThread(Thread,ModuleHandle);
CloseHandle(Thread);
end;
end;
VirtualFreeEx(Process,RemLibPath,StrLen(LibPath)+1,MEM_RELEASE);
end;
end;
end;
CloseHandle(Process);
end;
end;
end;
EnablePrivilege('SeDebugPrivilege', FALSE);
end;
end;

procedure ProcessAttach; stdcall;
var
Process: THandle;
ModName: array[0..MAX_PATH] of Char;
Target: array[0..MAX_PATH] of Char;
begin
Injected:= FALSE;
ModuleHandle:= 0;
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,
GetCurrentProcessId);
if Process <> 0 then
begin
if GetModuleFileNameEx(Process, 0, ModName,SizeOf(ModName)-1) > 0 then
begin
FillChar(Target,Sizeof(Target),#0);
//GetSystemDirectory(@Target,Sizeof(Target)-1);
StrLCat(Target,strTarget,Sizeof(Target)-1);
if AnsiStrPos(ModName,Target) <> nil then
begin
OldSend:= HookFunction('wsock32.dll','send',@newSend);
OldSend:= HookFunction('Ws2_32.dll','send',@newSend);
OldWSASend:= HookFunction('Ws2_32.dll','WSASend',@newWSASend);
OldWSARecv:= HookFunction('Ws2_32.dll','WSARecv',@newWSARecv);
end;
end;
CloseHandle(Process);
end;
end;

procedure ProcessDetach; stdcall;
begin
//
end;

procedure DLLEntryPoint(Reason: integer);
begin
case Reason of
Dll_Process_Detach: ProcessDetach;
Dll_Process_Attach: ProcessAttach;
end;
end;

exports
Inject;

begin
ProcessAttach;
DLLProc:= @DLLEntryPoint;
end.


Necesitaremos una aplicación que realice la inyección, una vez inyectada la dll la aplicación se puede cerrar. Por ejemplo:

program Probador;

{$APPTYPE CONSOLE}

uses Windows, SysUtils;

procedure Inject(LibPath: PChar); stdcall; external 'HookIt.dll';

var
LibPath: String;
begin
LibPath:= ExtractFilePath(ParamStr(0)) + 'HookIt.dll';
Inject(PChar(LibPath));
end.

Por último para ver los mensajes enviados por la función OutputDebugString necesitaremos un programa como DebugView (http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx) de Sysinternals.

¿Se le ocurre a alguien algo "divertido" que hacer con esto? :confused:

egostar
17-07-2007, 23:01:54
Esto me huele a capturar lo que se escribe en el messenger:rolleyes::rolleyes::rolleyes:, vaya habria muchas utilidades que se podrian crear:D:D.

Pero temo que sobrepasa mi precario conocimiento, no sabes como admiro que "juegues" con todo esto.

Pues nada, solo es un poco de envidia (de la buena:D).

Salud OS.

seoane
18-07-2007, 00:19:12
Esto me huele a capturar lo que se escribe en el messenger
Los mensajes comienzan todos por "MSG", y ya no digo mas ... :rolleyes: ;)

Y ya que estamos, si cambiamos las siguientes funciones, tendremos una visión un poco mas clara de lo que esta pasando, eliminando los caracteres no imprimibles o extraños:

function BufToString(Buf: PChar; Len: Integer): String;
var
i: Integer;
begin
Result:= EmptyStr;
for i:= 1 to Len do
begin
if (Buf^ in [#32..#126]) then
Result:= Result + Buf^
else
Result:= Result + '.';
inc(Buf);
end;
end;

function newSend(s: TSocket; Buf: PChar; len, flags: Integer): Integer; stdcall;
begin
OutputDebugString(PChar('Send: ' + BufToString(Buf,len)));
if @OldSend <> nil then
Result:= OldSend(s,Buf,len,flags)
else
Result:= -1;
end;

function newWSASend(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
var
i: DWORD;
P: PWSABUF;
begin
i:= dwBufferCount;
P:= lpBuffers;
while i > 0 do
begin
OutputDebugString(PChar('Recv: ' + BufToString(P.Buf,P.len)));
dec(i);
inc(P);
end;
if @OldWSASend <> nil then
Result:= OldWSASend(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,
lpOverlapped,lpCompletionRoutine)
else
Result:= -1;
end;

function newWSARecv(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
var
i: DWORD;
P: PWSABUF;
begin
if @OldWSARecv <> nil then
Result:= OldWSARecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,
lpOverlapped,lpCompletionRoutine)
else
Result:= -1;
i:= dwBufferCount;
P:= lpBuffers;
while i > 0 do
begin
OutputDebugString(PChar('Recv: ' + BufToString(P.Buf,P.len)));
dec(i);
inc(P);
end;
end;

Phacko
18-07-2007, 01:24:45
Primero que nada, mi admiración y respeto.
Me da una idea lo que comentas en tu post, pero para ser sincero viendo el codigo que pusiste, no tengo ni idea de lo que hiciste; me pregunto cuanto fue lo que dedicaste en tiempo y esfuerzo para llegar a dominar tal nivel dentro de la programación, mi admiración mas sincera y mi envidia mas sana de la que pueda hacer gala, al igual que a otros de los compañeros del club que no los menciono puesto que podria no nombrar a alguno y no sería correcto pero que muchos sabemos quienes son. Gracias por su apoyo y enseñanza.

Un saludo y abrazo a todos ustedes que hacen posible este gran espacio.

seoane
18-07-2007, 12:11:17
¿Nadie se anima a "meter el dedo" en el código? :(

Bueno, yo sigo dándole un lavado de cara, quitando algunas cosas que sobraban y añadiendo algunas otras.

Ahora el objetivo es el FileZilla, es interesante ver como en una conexión FTP todo, incluso las contraseñas, se envían sin cifrar, mientras que usando FTPS todo se vuelve un revoltijo de bytes sin sentido.

El código de la dll:

library HookIt;

uses
Windows,
Sysutils,
Messages,
Psapi,
ImageHlp,
winsock;

type
IMAGE_IMPORT_DESCRIPTOR = record
Characteristics: DWORD;
TimeDateStamp: DWORD;
ForwarderChain: DWORD;
Name: DWORD;
FirstThunk: DWORD;
end;
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;

TWSABUF = record
len: u_long;
buf: PChar;
end;
PWSABUF = ^TWSABUF;

TSendFunc = function (s: TSocket; Buf: Pchar; len, flags: Integer): Integer; stdcall;
TRecvFunc = function (s: TSocket; Buf: Pchar; len, flags: Integer): Integer; stdcall;
TWSASendFunc = function(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
TWSARecvFunc = function(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;

TBufType = (btSend, btRecv);

const
//strTarget = 'C:\Archivos de programa\MSN Messenger\msnmsgr.exe';
strTarget = 'C:\Archivos de programa\FileZilla\FileZilla.exe';

var
OldSend: TSendFunc;
OldRecv: TRecvFunc;
OldWSASend: TWSASendFunc;
OldWSARecv: TWSARecvFunc;

function BufToString(Buf: PChar; Len: Integer): String;
var
i: Integer;
begin
Result:= EmptyStr;
for i:= 1 to Len do
begin
if (Buf^ in [#32..#126]) then
Result:= Result + Buf^
else
Result:= Result + '.';
inc(Buf);
end;
end;

// Todos los hooks apuntan hacia aqui
procedure SaveBuf(S: TSocket; Buf: PChar; Len: Integer; Tipo: TBufType);
var
Str: String;
begin
Str:= BufToString(Buf,len);
if Tipo = btSend then
Str:= Format('Send(%d): %s',[S,Str])
else if Tipo = btRecv then
Str:= Format('Recv(%d): %s',[S,Str]);
OutputDebugString(PChar(Str));
end;

function NewSend(s: TSocket; Buf: PChar; len, flags: Integer): Integer; stdcall;
begin
SaveBuf(s,Buf,len,btSend);
if @OldSend <> nil then
Result:= OldSend(s,Buf,len,flags)
else
Result:= SOCKET_ERROR;
end;

function NewRecv(s: TSocket; Buf: PChar; len, flags: Integer): Integer; stdcall;
begin
if @OldRecv <> nil then
Result:= OldRecv(s,Buf,len,flags)
else
Result:= SOCKET_ERROR;
if Result > 0 then
SaveBuf(s,Buf,Result,btRecv);
end;

function NewWSASend(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
var
i: DWORD;
P: PWSABUF;
begin
i:= dwBufferCount;
P:= lpBuffers;
while i > 0 do
begin
SaveBuf(s,P.Buf,P.len,btSend);
dec(i);
inc(P);
end;
if @OldWSASend <> nil then
Result:= OldWSASend(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,
lpOverlapped,lpCompletionRoutine)
else
Result:= SOCKET_ERROR;
end;

function newWSARecv(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
lpNumberOfBytesSent: Pointer; dwFlags: DWORD; lpOverlapped: Pointer;
lpCompletionRoutine: Pointer): Integer; stdcall;
var
i: DWORD;
P: PWSABUF;
begin
if @OldWSARecv <> nil then
Result:= OldWSARecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,
lpOverlapped,lpCompletionRoutine)
else
Result:= SOCKET_ERROR;
if Result <> SOCKET_ERROR then
begin
i:= dwBufferCount;
P:= lpBuffers;
while i > 0 do
begin
SaveBuf(s,P.Buf,P.len,btRecv);
dec(i);
inc(P);
end;
end;
end;

function HookFunction(ModName, ProcName: PChar; Nuevo: Pointer): Pointer;
var
i: Integer;
hProcess: THandle;
hModules: array[0..1024] of HMODULE;
cbNeeded: DWORD;
hMod: HMODULE;
ImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
Size: Cardinal;
szModName: PChar;
Thunk: PPointer;
MBI: MEMORY_BASIC_INFORMATION;
begin
Result:= nil;
hMod:= GetModuleHandle(ModName);
if hMod <> 0 then
begin
Result:= GetProcAddress(hMod, ProcName);
if Result <> nil then
begin
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
FALSE, GetCurrentProcessId);
if hProcess <> 0 then
begin
if EnumProcessModules(hProcess, @hModules, Sizeof(hModules), cbNeeded) then
for i:= 0 to (cbNeeded div Sizeof(HMODULE)) - 1 do
begin
ImportDesc:= ImageDirectoryEntryToData(Pointer(hModules[i]),
TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, Size);
if ImportDesc <> nil then
begin
while ImportDesc.Name > 0 do
begin
szModName:= PChar(hModules[i] + ImportDesc.Name);
if StrIComp(szModName,ModName) = 0 then
begin
Thunk:= Pointer(hModules[i] + ImportDesc.FirstThunk);
while Thunk^ <> nil do
begin
if Thunk^ = Result then
begin
OutputDebugString(PChar(String(ProcName) + ': ' + 'Hookeado'));
VirtualQuery(Thunk,MBI,Sizeof(MEMORY_BASIC_INFORMATION));
VirtualProtect(MBI.BaseAddress,MBI.RegionSize,PAGE_READWRITE,
MBI.Protect);
Thunk^:= Nuevo;
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,
MBI.Protect);
end;
inc(Thunk);
end;
end;
inc(ImportDesc);
end;
end;
end;
end;
end;
end;
end;

procedure Inject(LibPath: PChar); stdcall;
var
Procesos: array[1..1024] of DWORD;
Needed, i: DWORD;
Process, Thread: THandle;
ModName, Target: array[0..MAX_PATH] of Char;
RemLibPath: PChar;
ExitCode: Cardinal;
begin
FillChar(Target,Sizeof(Target),#0);
StrLCopy(Target,strTarget,Sizeof(Target)-1);
if EnumProcesses(@Procesos, SizeOf(Procesos), Needed ) then
begin
for i:= 1 to (Needed div Sizeof(DWORD)) do
begin
Process := OpenProcess(PROCESS_ALL_ACCESS, FALSE,Procesos[i]);
if Process <> 0 then
begin
if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1) > 0 then
begin
if AnsiStrPos(ModName,Target) <> nil then
begin
RemLibPath:= VirtualAllocEx(Process, nil,StrLen(LibPath)+1,
MEM_COMMIT, PAGE_READWRITE);
if RemLibPath <> nil then
begin
if WriteProcessMemory(Process, RemLibPath, LibPath,
StrLen(LibPath),PDWORD(nil)^) then
begin
Thread:= CreateRemoteThread(Process, nil, 0,
GetProcAddress(GetModuleHandle('Kernel32'),'LoadLibraryA'),
RemLibPath, 0, PDWORD(nil)^);
if Thread <> 0 then
begin
WaitForSingleObject(Thread,INFINITE );
GetExitCodeThread(Thread,ExitCode);
CloseHandle(Thread);
end;
end;
VirtualFreeEx(Process,RemLibPath,StrLen(LibPath)+1,MEM_RELEASE);
end;
end;
end;
CloseHandle(Process);
end;
end;
end;
end;

procedure ProcessAttach; stdcall;
var
Process: THandle;
ModName: array[0..MAX_PATH] of Char;
Target: array[0..MAX_PATH] of Char;
begin
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,
GetCurrentProcessId);
if Process <> 0 then
begin
if GetModuleFileNameEx(Process, 0, ModName,SizeOf(ModName)-1) > 0 then
begin
FillChar(Target,Sizeof(Target),#0);
StrLCopy(Target,strTarget,Sizeof(Target)-1);
if AnsiStrPos(ModName,Target) <> nil then
begin
OldSend:= HookFunction('Ws2_32.dll','send',@NewSend);
OldRecv:= HookFunction('Ws2_32.dll','recv',@newRecv);
OldWSASend:= HookFunction('Ws2_32.dll','WSASend',@NewWSASend);
OldWSARecv:= HookFunction('Ws2_32.dll','WSARecv',@NewWSARecv);
end;
end;
CloseHandle(Process);
end;
end;

procedure ProcessDetach; stdcall;
begin
//
end;

procedure DLLEntryPoint(Reason: integer);
begin
case Reason of
Dll_Process_Detach: ProcessDetach;
Dll_Process_Attach: ProcessAttach;
end;
end;

exports
Inject;

begin
ProcessAttach;
DLLProc:= @DLLEntryPoint;
end.





Y por si alguien tiene curiosidad sobre lo que comentaba del ftp:

FTP normal:

00000000 0.00000000 [3420] send: Hookeado
00000001 0.00014471 [3420] send: Hookeado
00000002 0.00025730 [3420] recv: Hookeado
00000003 0.00033300 [3420] recv: Hookeado
00000004 0.00044000 [3420] WSASend: Hookeado
00000005 0.00054169 [3420] WSARecv: Hookeado
00000006 0.01691332 [3420] WSARecv: Hookeado
00000007 6.09645510 [3420] Recv(472): 220---------- Welcome to Pure-FTPd [TLS] ----------..220-You are user number 10 of 100 allowed...220-Local time is now 11:57. Server port: 21...220-This is a private system - No anonymous login..220 You will be disconnected after 15 minutes of inactivity...
00000008 6.10500622 [3420] Send(472): USER usuario..
00000009 6.20800686 [3420] Recv(472): 331 User usuario OK. Password required..
00000010 6.21136618 [3420] Send(472): PASS password..
00000011 7.68974400 [3420] Recv(472): 230-User usuario has group access to: usuario ..230 OK. Current restricted directory is /..
00000012 7.69142294 [3420] Send(472): SYST..
00000013 7.79814720 [3420] Recv(472): 215 UNIX Type: L8..
00000014 7.79918385 [3420] Send(472): FEAT..
00000015 7.90416002 [3420] Recv(472): 211-Extensions supported:.. EPRT.. IDLE.. MDTM.. SIZE.. REST STREAM.. MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;.. MLSD.. ESTP.. PASV.. EPSV.. SPSV.. ESTA.. AUTH TLS.. PBSZ.. PROT..211 End...
00000016 7.92951632 [3420] Send(472): PWD..
00000017 8.03565025 [3420] Recv(472): 257 "/" is your current location..
00000018 8.03662586 [3420] Send(472): TYPE A..
00000019 8.14296532 [3420] Recv(472): 200 TYPE is now ASCII..
00000020 8.14391899 [3420] Send(472): PASV..
00000021 8.25138378 [3420] Recv(472): 227 Entering Passive Mode (86,109,99,252,148,1)..
00000022 8.25234795 [3420] Send(472): LIST..


Y esto es FTPS:

00000000 0.00000000 [3444] send: Hookeado
00000001 0.00014499 [3444] send: Hookeado
00000002 0.00025925 [3444] recv: Hookeado
00000003 0.00033663 [3444] recv: Hookeado
00000004 0.00044447 [3444] WSASend: Hookeado
00000005 0.00057186 [3444] WSARecv: Hookeado
00000006 0.01196353 [3444] WSARecv: Hookeado
00000007 8.25035477 [3444] Recv(472): 220 Indy FTP Server ready...
00000008 8.25047493 [3444] Send(472): AUTH SSL..
00000009 8.27392101 [3444] Recv(472): 234 AUTH Command OK. Initializing SSL..
00000010 8.51114845 [3444] Send(472): .j....Q......9..8..5..............3..2../.............................@.....................>^...z....T..).Q
00000011 8.51255322 [3444] Recv(472): ._....../....0..+0...............j...0...*.H........0E1.0...U....AU1.0...U....Some-State1!0...U....Internet Widgits Pty Ltd0...070709185831Z..100708185831Z0E1.0...U....AU1.0...U....Some-State1!0...U....Internet Widgits Pty Ltd0\0...*.H.........K.0H.A...#...-..tyv.o....w....u.BC......:....&....}.P.":....9.2VI.X.s..........0..0...U......$.*$B...4.P.%..[.pHJ0u..U.#.n0l..$.*$B...4.P.%..[.pHJ.I.G0E1.0...U....AU1.0...U....Some-State1!0...U....Internet Widgits Pty Ltd.......j...0...U....0....0...*.H.........A.........'DQ....2..K..<.h|.*.8QT]..x<.... v.?...5d..0B..m.[.4..................@.......-#..UWB..-..0.E
00000012 8.51360226 [3444] Send(472): .R.......@...<.#$./d.!..Ji....C......+{}$....`..~.M.....\(.."...u%J..L...Uh.2N.....O.(........g..diz...?nsN.LgOS...9.B...<Z....
00000013 8.51596642 [3444] Recv(472): .(..R.....B..h+.Cx..(..../....S..V..z#......(.t....l.,....)P.....c.Ky$K.....5.Z.T..K8.

seoane
18-07-2007, 14:15:41
Pues yo sigo jugando, así que probé a inyectarme en el Opera, Firebird y IExplorer. Los resultados no fueron los que esperaba, solo tuve éxito en el firebird.

Ejemplo de llamada a google desde firebird:

00000000 0.00000000 [1612] send: Hookeado
00000001 0.00023970 [1612] send: Hookeado
00000002 0.00030451 [1612] send: Hookeado
00000003 0.00040508 [1612] recv: Hookeado
00000004 0.00055957 [1612] recv: Hookeado
00000005 0.00061293 [1612] recv: Hookeado
00000006 0.00079116 [1612] WSARecv: Hookeado
00000007 0.01721001 [1612] WSARecv: Hookeado
00000008 3.87779331 [1612] Send(424): 8
00000009 3.87790227 [1612] Recv(400): 8
00000010 7.33975983 [1612] Send(424): 8
00000011 7.36298990 [1612] Recv(400): 8
00000012 7.36321735 [1612] Send(760): GET /search?q=hola&ie=utf-8&oe=utf-8&aq=t (... continua ...)
00000013 7.50138474 [1612] Send(424): 8
00000014 7.50156593 [1612] Recv(760): HTTP/1.1 302 Found..Location: http://www.google.es/search?q=hola (... continua ...)
00000015 7.50168085 [1612] Send(424): 8
00000016 7.50173950 [1612] Recv(400): 88
00000017 7.51233768 [1612] Send(424): 8
00000018 7.51238394 [1612] Recv(400): 8
00000019 7.51343203 [1612] Send(424): 8
00000020 7.51364422 [1612] Send(792): GET /search?q=hola&ie=utf-8&oe=utf-8&aq=t (... continua ...)
00000021 7.51375008 [1612] Recv(400): 8
00000022 7.66461515 [1612] Send(424): 8
00000023 7.66482592 [1612] Recv(792): HTTP/1.1 200 OK..Cache-Control: private..Content-Type: text/html; (... continua ...)
00000024 7.66492271 [1612] Recv(400): 8
00000025 7.69945812 [1612] Send(424): 8
00000026 7.69976521 [1612] Recv(400): 8
00000027 7.74328566 [1612] Send(808): GET /images/nav_logo3.png HTTP/1.1..Host: www.google.es..User-Agent: Mozilla/5.0 (... continua ...)
00000028 7.76948357 [1612] Recv(792): 585...\.R.H......*L.b;..a+.......B`k.jImYXR;-...\.>......V.r.w.&.${NK.._ .. (... continua ...)
00000030 7.79967022 [1612] Send(424): 8
00000031 7.85533857 [1612] Send(424): 8
00000032 7.85574055 [1612] Send(424): 8
00000033 7.86081028 [1612] Recv(808): HTTP/1.1 200 OK..Content-Type: image/png..Last-Modified: (... continua ...)
00000036 7.86227322 [1612] Recv(400): 888
00000037 7.86240196 [1612] Send(424): 8
00000038 7.86249828 [1612] Send(424): 8
00000039 7.86318731 [1612] Recv(400): 88
00000040 7.93753862 [1612] Recv(808): >.0.K..NA......LZ.d......k.Q.e?j0R...X.l...{.C....... ..' (... continua ...)
00000042 7.94816399 [1612] Send(424): 8
00000043 7.94913769 [1612] Recv(400): 8
00000044 7.96834993 [1612] Send(424): 8
00000045 7.96871567 [1612] Recv(400): 8
00000046 8.02914429 [1612] Send(736): GET / HTTP/1.1..Host: www.hola.com..User-Agent: Mozilla/5.0 (... continua ...)
00000047 8.11064625 [1612] Recv(736): HTTP/1.1 200 OK..Server: Apache..Pragma: no-cache..Last-Modified: (... continua ...)
00000048 8.11452866 [1612] Send(424): 8
00000049 8.11458588 [1612] Recv(400): 8
00000050 18.88658333 [1612] Send(424): 8
00000051 18.88676453 [1612] Recv(400): 8
00000052 33.90203857 [1612] Send(424): 8
00000053 33.90223312 [1612] Recv(400): 8
00000054 48.91870117 [1612] Send(424): 8
00000055 48.91886902 [1612] Recv(400): 8
00000056 64.33921051 [1612] Send(424): 8
00000057 64.34007263 [1612] Recv(400): 8

*(... continua ...) = El mensaje era mas largo pero lo corte, para postearlo aquí

Lo que me tiene extrañado es por que Opera e IExplorer son inmunes. Ahora estoy interceptando las llamada send, recv, wsasend, wsarecv así que supongo que estos dos no utilizan estas funciones, y me pregunto cuales usaran. O acaso están protegidos contra las inyecciones de código.

Seguiré investigando, es decir jugando :p

cheke
19-07-2007, 08:26:19
Que tal

Esta muy interesante el codigo (ojala lo pudieramos ir documentando)
sobre todo cuando haces el inject con WriteProcessMemory

Estuve haciendo unas pruebas pero al principio no veia nada en el debug View, asi que modifique la dll del hook para que escribiera a un archivo de .log y al poco tiempo empezo a mostrarse tambien en el debug viewer, algunas veces parece que no logra hacer el hook hasta despues de varios intentos.
Crees que se podria hacer estos hooks de winsock a nivel de sistema, que sirviera para monitorear la red o hacer algo como un firewall?

ArdiIIa
19-07-2007, 11:10:39
Estoy un poco lerdo... se me están pasando mensajes que no se me deberían pasar...

Excelente seoane, si ya por de sí es difícil andar jugando con sockets, parece aún mas parchear las propias funciones de estos. Muy original lo de OutputDebugString,

En todo caso "recuerda" que también es posible interceptar el puerto en cuestión...:D y ahí seguro que ni el Opera ni nadie se resiste.

Una más para tu repositorio...:D :eek:

seoane
19-07-2007, 12:24:17
Hola cheke, me alegro de que alguien se animara a revisar el código.

Esta muy interesante el codigo (ojala lo pudieramos ir documentando)
sobre todo cuando haces el inject con WriteProcessMemory

:o Lo siento, es una costumbre muy fea que tengo, nunca documento el código. Intentare documentar esa función.

Estuve haciendo unas pruebas pero al principio no veia nada en el debug View, asi que modifique la dll del hook para que escribiera a un archivo de .log y al poco tiempo empezo a mostrarse tambien en el debug viewer, algunas veces parece que no logra hacer el hook hasta despues de varios intentos.

Esto es interesante, no debería fallar nuca. Me gustaría saber en que procesos te fallaba la inyección, cual de los código que puse estabas utilizando y si te mostraba en el DebugView "Hookeado" o simplemente ya no te mostraba nada. Yo solo he tenido problemas con el opera y el explorer, pero con los que me ha funcionado, lo ha hecho siempre, al primer intento :confused:

Crees que se podria hacer estos hooks de winsock a nivel de sistema, que sirviera para monitorear la red o hacer algo como un firewall?

No veo porque no, siendo administradores, o ejecutándolo como un servicio, no hay problema de inyectarnos en todos los procesos del sistema. Y como monitor de red puede ser interesante, pero como firewall, resultaría un firewall bastante malo. Hay muchas formas de hacer un firewall y esta seria la mas mala, no te la aconsejo.

Otra opción interesante es utilizar para inyectarnos la función SetWindowsHookEx, usando la librería como un hook de windows. Así seria el propio windows el encargado de inyectarnos en todos los procesos que tuvieran ventanas, una solución bastante cómoda. Aunque no controlaríamos las aplicaciones de consola.

Yo por ahora el código lo veo mas como un juguete para ver como funcionan los programas "por dentro", que como una herramienta de seguridad. Pero nada impide evolucionarlo un poquito mas, es decir, afinando el proceso de inyección y hook de las apis, interceptando las llamadas a las apis que crean procesos y cargan librerías (para así reajustar los hooks), interceptando mas apis del winsock, etc ...

Hola Ardilla,

Estoy un poco lerdo... se me están pasando mensajes que no se me deberían pasar...

Si, ya estabas tardando :p

Excelente seoane, si ya por de sí es difícil andar jugando con sockets, parece aún mas parchear las propias funciones de estos. Muy original lo de OutputDebugString,..

Pues no creas, como lo que me interesa son los buffer, el resto de los parámetros de las funciones ni se lo que son ni mi importa :p

En cuanto a la función OutputDebugString, desde que la descubrí hace un par de años, es una de mis funciones preferidas. Utilisima y muy recomendable, sobre todo cuando estas escribiendo código que no tiene una salida por pantalla.

En todo caso "recuerda" que también es posible interceptar el puerto en cuestión... y ahí seguro que ni el Opera ni nadie se resiste.

:rolleyes: Yo todavía estoy esperando un ejemplo completo, ya sabes, bajar el archivo zip, descomprimir, compilar y ver los resultados. Lo demás es teorizar :p :D

Una más para tu repositorio...

Si, hacia tiempo que no posteaba código. Ya iba siendo hora ...

seoane
19-07-2007, 12:53:22
Lo prometido es deuda:

// ModName: dll donde se encunetra la funcion
// ProcName: Nombre de la funcion
// Nuevo: Direccion de la nueva funcion
function HookFunction(ModName, ProcName: PChar; Nuevo: Pointer): Pointer;
var
i: Integer;
hProcess: THandle;
hModules: array[0..1024] of HMODULE;
cbNeeded: DWORD;
hMod: HMODULE;
ImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
Size: Cardinal;
szModName: PChar;
Thunk: PPointer;
MBI: MEMORY_BASIC_INFORMATION;
begin
Result:= nil;
// Obtenemos el handle de la dll donde se encuentra la funcion original
hMod:= GetModuleHandle(ModName);
if hMod <> 0 then
begin
// Obtenemos la direccion de la funcion original
Result:= GetProcAddress(hMod, ProcName);
if Result <> nil then
begin
// Obtenemos el handle del proceso
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
FALSE, GetCurrentProcessId);
if hProcess <> 0 then
begin
// Enumeramos cada uno de los modulos que tiene cargados el proceso
if EnumProcessModules(hProcess, @hModules, Sizeof(hModules), cbNeeded) then
for i:= 0 to (cbNeeded div Sizeof(HMODULE)) - 1 do
begin
// Obtenemos la seccion import, que es una array de estructuras
// del tipo IMAGE_IMPORT_DESCRIPTOR, terminado por una estructura
// con todos sus campos a cero
ImportDesc:= ImageDirectoryEntryToData(Pointer(hModules[i]),
TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, Size);
if ImportDesc <> nil then
begin
// Recorremos el array hasta llegar al elemento con todos
// los campos a cero.
while ImportDesc.Name > 0 do
begin
// Obtenemos el nombre del modulo importado
szModName:= PChar(hModules[i] + ImportDesc.Name);
// Lo comparamos con el que buscamos
if StrIComp(szModName,ModName) = 0 then
begin
Thunk:= Pointer(hModules[i] + ImportDesc.FirstThunk);
// Recorremos cada una de las funciones de ese modulo
while Thunk^ <> nil do
begin
// Si coincide con la que buscamos
if Thunk^ = Result then
begin
OutputDebugString(PChar(String(ProcName) + ': ' + 'Hookeado'));
// Obtenemos algunos parametros sobre la memoria
VirtualQuery(Thunk,MBI,Sizeof(MEMORY_BASIC_INFORMATION));
// Desprotegemos la zona de memoria donde esta
// guardada la direccion de la funcion original
VirtualProtect(MBI.BaseAddress,MBI.RegionSize,PAGE_READWRITE,
MBI.Protect);
// Reemplazamos la direccion de memoria de la funcion actual
// por la direccion de memoria de nuestra funcion
Thunk^:= Nuevo;
// Volvemos a proteger esa zona de memoria
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,
MBI.Protect);
end;
inc(Thunk);
end;
end;
inc(ImportDesc);
end;
end;
end;
end;
end;
end;
end;

Espero que se entienda ... :)

ArdiIIa
19-07-2007, 12:58:35
:rolleyes: Yo todavía estoy esperando un ejemplo completo, ya sabes, bajar el archivo zip, descomprimir, compilar y ver los resultados. Lo demás es teorizar :p :D

Eso me suena a reto.:D :D
Yo lo hice con un programa que se conecta a un servidor de ajedrez y los resultados como comenté fueron fabulosos.

De todas formas, "aquel código" que publique hace unas fechas, es justamente el que utilizaba para monitorizar el puerto, si ya sabes, aquel de la "promiscuidad". Así que solamente sería cuestión de probar ese código y ver los resultados en cualquier puerto que esté ocupado por una aplicación...
Eso código, básicamente en lo que difiere a otros que utilizan sockets, es en los parámetros de conexión, y en lo que hemos/han dado por llamar "modo promiscuo".

Saludos.

seoane
19-07-2007, 13:13:18
Eso me suena a reto.:D :D

Veo que se ha notado, y sigo esperando ese ejemplo :cool: :p :D Es broma, ya se que no todo el mundo dispone de tanto tiempo como yo, y menos para emplearlo en estos asuntos.

en lo que hemos/han dado por llamar "modo promiscuo".

El nombre no me lo invente yo, y se utiliza mucho cuando se habla de capturar paquetes. Además suena muy chulo :cool: , este tipo de expresiones son las que te hacen parecer un experto (aunque no lo seas :p )

ArdiIIa
19-07-2007, 13:18:29
Veo que se ha notado, y sigo esperando ese ejemplo :cool: :p :D Es broma, ya se que no todo el mundo dispone de tanto tiempo como yo, y menos para emplearlo en estos asuntos.


Precisamente estos asuntos son los que a mi me gustan, el manejar datos "parriba/pabajo", como que resulta tedioso, pero no en vano, parece que es lo que produce ingresos. Y hablando de ingresos.... con este hilo, ya has fastidiado a todas luces un "posible negocio". :D :D

seoane
19-07-2007, 14:03:36
Precisamente estos asuntos son los que a mi me gustan, el manejar datos "parriba/pabajo", como que resulta tedioso, pero no en vano, parece que es lo que produce ingresos.

Si, recuerdo que ya lo hablamos en alguna ocasión, que lo que da dinero, y sobre todo si hablamos de delphi, son las bases de datos :( Lo demás esta bien como afición, pero esta difícil ganar dinero con estas cosas.

Y hablando de ingresos.... con este hilo, ya has fastidiado a todas luces un "posible negocio".

:D Pues ya me dirás cual, que te parece: "Fisgón 3000: Sepa lo que su hijita habla por el messenger". En serio, últimamente he estado realizando algún código bastante interesante, pero me lo he guardado, precisamente por la posibilidad de hacer negocio. Y no creas que me ha gustado hacerlo, los que me conocéis, aunque solo sea virtualmente, sabéis que me encanta compartir el código, "dejar libre el código cautivo", pero con eso no se saca dinero, y de algo hay que vivir.

Vaya giro inesperado sufrió el tema de este hilo :p :D

Pues nada ArdiIIa, cuando tu quieres montamos un proyecto de los interesantes ¿que se te ocurre?

Enan0
19-07-2007, 14:37:54
Hola Seoane.. Bueno vi que estubiste jugando con el msn y me gusto muucho lo que hiciste..

En algun momento estube intentando hacer "Una aplicacion" (va un cacho de codigo loco) que intentase conectarse a la red MSN y obtener la lista de contactos . para luego empezar a jugar.. cosa que no fue muy productiva..


Pero la verdad que voy a probar que informacion se puede obtener con todo eso.. y que se puede modifica! :D

y bueno lo de loguear los mensajes.. tambien peude hacerse con algun snifer.. pero bueno (si es general se complica un poco) pero se puede..


Ardilla!!.. de todos maneras me gusto mucho lo de escuchar directamente el puerto (Podrias darme una idea de como empezar algo asi?).. (ya que no estariamos limitados a injectar un hook en memoria) obvio que con esto estamos limitados solo a nuestra maquina..

con lo que esta poniendo Seoane + alguna que otra cosita.. como que se esconda + un servido FTP. o simplemente.. Capturando el navegador por defecto y cuando esta activo Subri un archivejo con datos Determinados, aun servidor...
mmm creo que se podrian hacer cosas demasiado malas!!!
bueno dejo de soñar tonterias y a seguir trabajando!!
saludos..

seoane
19-07-2007, 15:00:41
mmm creo que se podrian hacer cosas demasiado malas!!!

Por qué sera tan divertido hacer "cosas malas" :D . Lo malo, es que estos mega-antivirus que están de moda ahora (panda, symantec, etc ...) se ponen muy nerviosos con las inyecciones de código, hooks, etc ... y saltan a la mínima, así le quitan toda la diversión :mad:

Enan0
19-07-2007, 15:26:39
Por qué sera tan divertido hacer "cosas malas" :D .

Jajaja es verdad. ls cosas malas son lo masdivertido..

Lo malo, es que estos mega-antivirus que están de moda ahora (panda, symantec, etc ...) se ponen muy nerviosos con las inyecciones de código, hooks, etc ... y saltan a la mínima, así le quitan toda la diversión :mad:

Pero se que hay alguna forma de hacer la injeccion de codigo sin que se activen.. bueno no prometo nada.. primero voy a bajar tu Codigo Fuente.. leerlo, entenderlo (si puedo):(
y despues ver que se puede hacer con los anti virus.. (porque algo siempre se puede hacer) jeje

Saludos!

ArdiIIa
19-07-2007, 18:16:02
Vaya giro inesperado sufrió el tema de este hilo :p :D


Pues casi que si, no se si editarlo o borrarlo. Es obvio que no trataba de distraer a los contertulios del tema central.... :(


Pues nada ArdiIIa, cuando tu quieres montamos un proyecto de los interesantes ¿que se te ocurre?

Soy muy poco imaginativo, y cuando hay necesidad, lo interesante pasa a un segundo término...:D
Pero estoy seguro que posibilidades habrá...

ArdiIIa
19-07-2007, 18:20:31
Ardilla!!.. de todos maneras me gusto mucho lo de escuchar directamente el puerto (Podrias darme una idea de como empezar algo asi?).. (ya que no estariamos limitados a injectar un hook en memoria) obvio que con esto estamos limitados solo a nuestra maquina..


Podrías echar un vistazo a esta retaíla (http://www.clubdelphi.com/foros/showthread.php?t=45277)

cheke
19-07-2007, 19:21:26
Hola seoane :)

Esto es interesante, no debería fallar nuca. Me gustaría saber en que procesos te fallaba la inyección, cual de los código que puse estabas utilizando y si te mostraba en el DebugView "Hookeado" o simplemente ya no te mostraba nada. Yo solo he tenido problemas con el opera y el explorer, pero con los que me ha funcionado, lo ha hecho siempre, al primer intento :confused:

Pues eso que te comento me paso en la maquina de mi casa, utilizando el primer codigo que posteaste, ya no me dio tiempo depurar donde fallaba, pero llegando a mi trabajo empece a realizar pruebas de nuevo y.... todo bien funciono a la primera, lo deje funcionando como 20 min. hasta que se bloqueo el msn y me saco este mensaje:

AppName: msnmsgr.exe AppVer: 8.1.178.0 AppStamp:45b12d6a
ModName: hookit.dll ModVer: 0.0.0.0 ModStamp:2a425e19
fDebug: 0 Offset: 00001c0d

Bueno no se a que se deba tal vez esta muy saturado mi msn, tenia cerca de 60 conectados de un total de 400.. o tal vez el msn despues de un rato se da cuenta que a sido intervenido :p

Y acerca de lo que comentan de hacer dinero con este tipo de programacion, estoy muy seguro de que si se puede, hace poco antes de encontrar este post compre una dll para hacer hooks de sistema para monitorear una impresora esta dll que en realidad son dcus para delphi me costaron 199 dls. pero creo que es mas redituable aun las aplicaciones que se puedan generar a partir de esto.
Por cierto estos dcus que compre (www.madshi.net (http://www.madshi.net)) hacen un hook del sistema, mi pregunta es como lo haran porque segun lo que comentas habria que inyectarnos en todos los procesos del sistema. Tiene que ser por cada proceso o habra alguna manera general de inyectarse a todo el sistema?

¡Por cierto excelente trabajo seoane! da gusto encontrar este tipo de codigos ;)

seoane
19-07-2007, 19:58:22
Lo del error debe ser culpa de mi código, ya dije que era una "prueba de concepto" y puede que se colara algún error. Es lo que tiene jugar con procesos ajenos :p

mi pregunta es como lo haran porque segun lo que comentas habria que inyectarnos en todos los procesos del sistema


Pues no conozco el funcionamiento de esa librería, pero según su pagina:

The package "madCodeHook" offers everything you need to hook code (mostly APIs). Usually such hooks show effect only in the current process. But madCodeHook also can inject a specified DLL into any desired 32bit process or even "system wide" (that is into all currently running and into all in the future created processes). So by putting your hooking stuff into a little DLL and injecting it "system wide", you can realize effective and easy to use system wide API hooking. Of course everything works just as fine under both OS families (9x/NT).

Es decir, que lo que hace es inyectarse en todos los procesos del sistema y, controlando las apis apropiadas, inyectarse en todos los futuros procesos según estos se van creando.

De todas formas, seguro que se puede ir mucho mas abajo. He oído hablar de rootkits hechos en delphi que se mueven a nivel del kernel, pero eso ya se me hace algo complicado de entender. Puede que mas adelante, quien sabe ...

egostar
19-07-2007, 22:33:07
Hola amigo Domingo, he visto el transcurso de este hilo y se me ocurre algo interesante, obviamente para sacarle algo ($$$) a tus juguetitos.

Mas o menos esto:

Hacer un estudio enfocandose en la capa 1 y 2 para garantizar el buen funcionamiento de la red de datos.

Es decir gestionar

Tiempos de Respuesta
Perdida de paquetes
Utilizacion del CPU
Utilizacion de Memoria
Utilizacion de Discos

en fin todo lo que se pueda gestionar a través de SNMP.

Como ves, te interesa?

Si es así hay un mercado muy interesante que está guardando su dinerito para quien lo quiera y se atreva.

Salud OS.

cheke
19-07-2007, 22:57:28
Que tal

Estuve haciendo unas pruebas con esa libreria que mencione pero parece que no funciona a nivel de kernel :rolleyes: bueno al menos eso creo porque la probe en windows vista y funciona bien, segun se windows vista ya no permite el acceso a la tierra del kernel creo que le llaman ring 0, si es asi entonces lo que me supongo que hace es inyectarse en todos los procesos creados y los que se creen posteriormente. Voy a probar el hookit que posteaste en windows vista y despues comento que pasa.

Enan0
20-07-2007, 13:55:20
Bueno aca dejo un poquito de lo que se ve con el firefox y el Skype (no devuelve nada interesanet)

Enan0
20-07-2007, 14:00:34
[quote]
00000011 1.69074035 [1744] Host: www.clubdelphi.com

[CODE]
00000011 1.69074035 [1744] Host: www.clubdelphi.com
00000012 1.69074035 [1744] User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; es-AR; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5
00000015 1.69074035 [1744] Accept-Encoding: gzip,deflate
00000016 1.69074035 [1744] Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
00000017 1.69074035 [1744] Keep-Alive: 300
00000018 1.69074035 [1744] Connection: keep-alive
00000020 1.69074035 [1744] Cache-Control: max-age=0
00000021 1.69074035 [1744]

[/qoute]


Mas reducida para no tener problemas con el FORO jojojo :D

//sKYPE



00000000 0.00000000 [608] Login took 272 ms
00000001 0.98467934 [608] GetDialogBackground took 8 ms
00000002 0.99355841 [608] GetDialogBackground took 9 ms
00000003 1.55131304 [608] Recv: HTTP/1.1 200 OK
00000004 1.55131304 [608] Date: Fri, 20 Jul 2007 11:41:50 GMT
00000005 1.55131304 [608] Server: Apache
00000006 1.55131304 [608] Last-Modified: Mon, 09 Jul 2007 13:17:49 GMT
00000007 1.55131304 [608] ETag: "cdfb-9-78aa9940"
00000008 1.55131304 [608] Accept-Ranges: bytes
00000009 1.55131304 [608] Content-Length: 9
00000010 1.55131304 [608] X-Debug: Served from cache
00000011 1.55131304 [608] Connection: close
00000012 1.55131304 [608] Content-Type: text/plain; charset=utf-8
00000013 1.55131304 [608] Content-Language: en
00000014 1.55131304 [608]
00000015 1.55131304 [608] 3.1.0.152
00000016 3.05160832 [608] Populating took 48 ms (32 ms + 1 us + 2 ms + 10 ms + 2 us + 5 ms)
00000017 34.88407898 [608] TMainUserList.BufferedPaint (w=438, h=251) took 47 ms (6 ms + 39 ms + 3 ms)
00000018 35.46070862 [608] RecreateInviteButton took 56 ms
00000019 35.56895828 [608] OPenChatByPartner took 469 ms