那位大大有HOOK OpenProcess的delphi源代码啊?给个吧。

解决方案 »

  1.   

    function HookDllProcedure(ImportModule: THandle; ExportModule: string; OldProc, NewProc: Pointer;
      ProcName: string; CanFail, Unhook: Boolean): Pointer;
    var
      FromProcDebugThunk, ImportThunk: PWin9xDebugThunk;
      IsThunked, FoundProc: Boolean;
      NtHeader: PImageNtHeaders;
      ImportDir: TImageDataDirectory;
      ImportDesc: PImageImportDescriptor;
      CurrName: PChar;
      ImportEntry: PImageThunkData;
      Base: Pointer;
      SaveDLLProc: PSaveDLLProc;  function IsWin9xDebugThunk(P: Pointer): Boolean;
      begin
        with PWin9xDebugThunk(P)^ do
          Result := (PUSH = $68) and (JMP = $E9);
      end;  // Mapped or loaded image related functions
      function PeMapImgNtHeaders(const BaseAddress: Pointer): PImageNtHeaders;
      begin
        Result := nil;
        if (not IsValidBlockAddr(DWord(BaseAddress), SizeOf(TImageDosHeader))) then Exit;    if (PImageDosHeader(BaseAddress)^.e_magic <> IMAGE_DOS_SIGNATURE) or
          (PImageDosHeader(BaseAddress)^._lfanew = 0) then Exit;    Result := PImageNtHeaders(DWORD(BaseAddress) + DWORD(PImageDosHeader(BaseAddress)^._lfanew));
        if (not IsValidBlockAddr(DWord(Result), SizeOf(TImageNtHeaders))) or
          (Result^.Signature <> IMAGE_NT_SIGNATURE) then Result := nil
      end;  procedure CheckFail;
      begin
        if (not CanFail) then
          raise EHookingError.CreateFmt(EHookingErrorStr, [ProcName]);
      end;begin
      Result := nil;  if (OldProc = nil) then
        raise EProcNull.CreateFmt(EProcNullStr, [ProcName]);  if (ImportModule > SharedMem) and // Shared Area...
        (Win32Platform <> VER_PLATFORM_WIN32_NT) then // Win9X/ME ...
        raise ESharedArea.CreateFmt(ESharedAreaStr, [ModuleFileName(ImportModule)]);  Base := Pointer(ImportModule);
      FromProcDebugThunk := PWin9xDebugThunk(OldProc);
      IsThunked := (Win32Platform <> VER_PLATFORM_WIN32_NT) and IsWin9xDebugThunk(FromProcDebugThunk);
      NtHeader := PeMapImgNtHeaders(Base);
      if (NtHeader = nil) then
      begin
        CheckFail;
        Exit;
      end;  ImportDir := NtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
      if (ImportDir.VirtualAddress = 0) then
      begin
        CheckFail;
        Exit;
      end;  ImportDesc := PImageImportDescriptor(DWORD(Base) + ImportDir.VirtualAddress);
      while (ImportDesc^.Name <> 0) do
      begin
        CurrName := (PChar(Base) + ImportDesc^.Name);
        if (StrIComp(CurrName, PChar(ExportModule)) = 0) then
        begin
          ImportEntry := PImageThunkData(DWORD(Base) + ImportDesc^.FirstThunk);
          while (ImportEntry^.Function_ <> 0) do
          begin
            if IsThunked then
            begin
              ImportThunk := PWin9xDebugThunk(ImportEntry^.Function_);
              FoundProc := IsWin9xDebugThunk(ImportThunk) and
                (ImportThunk^.Addr = FromProcDebugThunk^.Addr);
            end
            else
              FoundProc := Pointer(ImportEntry^.Function_) = OldProc;
            if FoundProc then
            begin
              WriteMem(@ImportEntry^.Function_, NewProc, 4);
              if (not Unhook) then
              begin
                New(SaveDLLProc);
                SaveDLLProc^.OldProc := OldProc;
                SaveDLLProc^.NewProc := NewProc;
                SaveDLLProc^.HookModule := ImportModule;
                SaveDLLProc^.ExportModule := ExportModule;
                DllList.Add(SaveDLLProc);
              end;
              Result := OldProc;
            end;
            Inc(ImportEntry);
          end;
        end;
        Inc(ImportDesc);
      end;  if (not CanFail) and (Result = nil) then
        raise EHookingError.CreateFmt(EHookingErrorStr, [ProcName]);
    end;
      

  2.   

    就是IAT HOOK……自己找找资料吧,很多的