Ver Mensaje Individual
  #10  
Antiguo 19-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Lo prometido es deuda:
Código Delphi [-]
// 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 ...
Responder Con Cita