首页
社区
课程
招聘
[求助]加壳后的程序怎么Hook?
发表于: 2009-1-6 15:25 5215

[求助]加壳后的程序怎么Hook?

2009-1-6 15:25
5215
做了一个API Hook可以挂住一般的程序,但对加壳后的程序无效!不知是怎么回事,有什么其它办法吗?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
你是IAT Hook?I加壳程序会自己处理IAT,所以还是Inline Hook吧!把你的Hook方式和Hook时机说清楚,才好帮你找问题嘛
2009-1-6 16:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是用SetWindowsHookEx挂一个消息处理函数,然后在函数里修改API地址!
像这样:
     OldMessageBox := GetRealAddress(@MessageBox) ;
     RepointFunction(@OldMessageBox,@NewMessageBox) ;
2009-1-6 19:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
function GetRealAddress(addr: Pointer): Pointer;
var
   si : SYSTEM_INFO;
begin
     result := addr;
     GetSystemInfo(si);
     if DWORD(addr) > DWORD(si.lpMaximumApplicationAddress) then
     begin
          if PBYTE(addr)^ = $68 then
          begin
               result := PDWORD(DWORD(PBYTE(addr)) + 1);
               result := PDWORD(result^);
          end;
     end;
end;
2009-1-6 19:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
function RepointFunction(OldFunc, NewFunc: Pointer): Integer;
var
   IsDone: TList;
   function RepointAddrInModule(hModule: THandle; OldFunc, NewFunc: Pointer): Integer;
   var
      Dos: PImageDosHeader;
      NT: PImageNTHeaders;
      ImportDesc: PImage_Import_Entry;
      RVA: DWORD;
      Func: ^Pointer;
      DLL: string;
      f: Pointer;
      written: DWORD;
   begin
      Result := 0;
      Dos := Pointer(hModule);
      if IsDone.IndexOf(Dos) >= 0 then exit;
      IsDone.Add(Dos);

      OldFunc := LocateFunctionAddress(OldFunc);

      if IsBadReadPtr(Dos, SizeOf(TImageDosHeader)) then exit;
      if Dos.e_magic <> IMAGE_DOS_SIGNATURE then exit;
      NT := Pointer(Integer(Dos) + dos._lfanew);

      RVA := NT^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
         .VirtualAddress;

      if RVA = 0 then exit;
      ImportDesc := pointer(integer(Dos) + RVA);
      while (ImportDesc^.Name <> 0) do
      begin
         DLL := PChar(Integer(Dos) + ImportDesc^.Name);
         RepointAddrInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);
         Func := Pointer(Integer(DOS) + ImportDesc.LookupTable);
         while Func^ <> nil do
         begin
            f := LocateFunctionAddress(Func^);
            if f = OldFunc then
            begin
               WriteProcessMemory(GetCurrentProcess, Func, @NewFunc, 4, written);
               if Written > 0 then Inc(Result);
            end;
            Inc(Func);
         end;
         Inc(ImportDesc);
      end;
   end;

begin
   IsDone := TList.Create;
   try
      Result := RepointAddrInModule(GetModuleHandle(nil), OldFunc, NewFunc);
   finally
      IsDone.Free;
   end;
end;
2009-1-6 19:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Inline Hook是怎么回事
2009-1-6 19:08
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
你可以先Google一下。以前写了一篇关于Hook的文章,以为没有发的必要了,看来有必要科普一下?
2009-1-6 22:25
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=;]...[/QUOTE]
果然是IAT Hook…
2009-1-6 22:33
0
游客
登录 | 注册 方可回帖
返回
//