首页
社区
课程
招聘
[原创]另类挂钩-RING3数据包监视
发表于: 2009-2-1 15:20 182416

[原创]另类挂钩-RING3数据包监视

2009-2-1 15:20
182416
收藏
免费 8
支持
分享
最新回复 (178)
雪    币: 356
活跃值: (38)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
151
NtDeviceIoControlFile返回后不一定传输完毕了吧。如果是异步的要如何取得recv的数据呢?
2010-7-12 17:12
0
雪    币: 288
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
152
为什么用CPP生成dll,注入失败呢?delphi版本的没问题
==>
dllmain()return true才能加载成功,此cpp的dllmain返回true,因此与这无关。
跟踪调试后找到原因如下:
把函数SuperHookDeviceIoControl中的这一句char* functionname = (char*)((ULONG)hMod + ThunkData->u1.AddressOfData + 2);
改为char* functionname = (char*)((ULONG)hMod + (ULONG)ThunkData->u1.AddressOfData + 2);

调试时使用这个注入工具,dll注入辅助工具[带源码],注入进程选择这个工具进程。
也可以自己写个测试程序,只需LoadLibrary加载一下dll即可。测试程序中LoadLibrary跟不进去,需要从dll工程中使用测试程序才能调试跟踪。

抓包时需把dll注入到firefox或者ieexplore等网络进程。
2010-7-13 11:35
0
雪    币: 352
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
153
hao hao xue xi~!
2010-7-13 11:44
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
154
学习学习!
2010-9-18 14:40
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
155
做个记号。慢慢学习大牛的作品
2010-11-9 05:18
0
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
156
占座继续看,MJ,教主,老V。。强人
2011-5-10 21:28
0
雪    币: 68
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
157
标记一下 虽然我来的很晚
2011-5-11 14:23
0
雪    币: 151
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
158
可以做的还有很多啊,加上对afd_send_info,afd_recv_info的拦截,就能做出非常好玩的东西~
2011-7-20 09:17
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
159
__asm
  {
    push  OutputBufferLength
    push  OutputBuffer
    push  InputBufferLength
    push  InputBuffer
    push  IoControlCode
    push  IoStatusBlock
    push  ApcContext
    push  ApcRoutine
    push  Event
    push  FileHandle
    call  pNtDeviceIoControl
    mov    stat ,eax
  }

这种写法,有啥好处?
2011-7-20 09:26
0
雪    币: 204
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
160
马克一下
2011-8-27 07:34
0
雪    币: 94
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
161
收藏之...............
2011-8-27 16:27
0
雪    币: 21
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
162
看起来确实很直观,只能膜拜。MJ的强大...唉
2011-10-31 10:31
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
163
[QUOTE=木桩;571841]这个还真没见过,立即改个Delphi的去瞧瞧。

果然好用,膜拜一下!明天试试修改数据包内容
翻译的Delphi版源码见附件,这是我GET百度的数据。[/QUOTE]

这个代码有个问题,只检查和修改了FirstThunk而没有处理CharacteristicsOrOriginalFirstThunk,所以并不通用,我改了一下..
  function SuperHook(HookPro,DllName,ApiName:PAnsiChar;NewHookAdderss:Pointer;var OldNtDeviceIoControl:Pointer):Boolean;
  var
    hMod: HMODULE;
    pDosHeader: PImageDosHeader;
    pNtHeaders: PImageNtHeaders;
    ImportDescriptor: PImageImportDescriptor;
    ThunkData: PImageThunkData;
    dll_name, func_name: PAnsiChar;
    iNum: Integer;
    lpAddr: Pointer;
    myaddr :DWORD;
    btw:SIZE_T;
    Ordinal:DWORD;

  begin
    Result := False;
    //得到目标的模块基址
    hMod := GetModuleHandleA(HookPro);
    if (hMod = 0) then
    begin
      Exit;
    end;

    //得到DOS头
    pDosHeader := PImageDosHeader(hMod);
    //如果DOS头无效
    if ( pDosHeader^.e_magic <> IMAGE_DOS_SIGNATURE ) then
    begin
      Exit;
    end;

    //得到NT头
    pNtHeaders := PImageNtHeaders(hMod + DWORD(pDosHeader^._lfanew));
    //如果NT头无效
    if ( pNtHeaders^.Signature <> IMAGE_NT_SIGNATURE ) then
    begin
      Exit;
    end;

    //检查输入表数据目录是否存在
    if (pNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = 0)
      or (pNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = 0) then
    begin
      Exit;
    end;


    //得到输入表描述指针
    ImportDescriptor := PImageImportDescriptor(hMod + pNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

    //检查每个输入项
    while (ImportDescriptor^.FirstThunk <> 0) do
    begin
      // 检查输入表项是否为ntdll.dll
      dll_name := PAnsiChar(hMod + ImportDescriptor^.Name);
      // 如果不是,则跳到下一个处理
      if (StrIComp(dll_name, DllName) <> 0) then
      begin
        ImportDescriptor := PImageImportDescriptor(DWORD(ImportDescriptor) + SizeOf(_IMAGE_IMPORT_DESCRIPTOR));
        Continue;
      end;

      ThunkData := PImageThunkData(hMod + ImportDescriptor^.CharacteristicsOrOriginalFirstThunk);
      iNum := 1;
      while (ThunkData^.Function_ <> 0) do
      begin
        Ordinal := (ThunkData^.Ordinal and $80000000);
        func_name := PAnsiChar(hMod + ThunkData^.AddressOfData + 2);
        if (StrIComp(func_name , ApiName) = 0) then
        begin
          OutputDebugString(PChar(Format('[HOOK] Lock "%s" for HOOK.', [StrPas(func_name)])));
          myaddr := dword(NewHookAdderss);
          lpAddr := Pointer(hMod + ImportDescriptor^.FirstThunk + DWORD(iNum-1)*4);
          DWORD(OldNtDeviceIoControl) := Pdword(lpAddr)^;
          OutputDebugString(PChar(Format('[HOOK] Base=%0.8X, Thunk=%0.8X, ID=%X', [hMod, ImportDescriptor^.FirstThunk, iNum-1])));
          OutputDebugString(PChar(Format('[HOOK] Orign[0x%0.8X]=0x%0.8X, new Addr=0x%0.8X', [DWORD(lpAddr), PDWORD(lpAddr)^, myaddr])));
          WriteProcessMemory(GetCurrentProcess(), lpAddr, @myaddr, 4, btw);
          //需要处理一下 CharacteristicsOrOriginalFirstThunk
          lpAddr := Pointer(hMod + ImportDescriptor^.CharacteristicsOrOriginalFirstThunk + DWORD(iNum-1)*4);
          //如果FirstThunk无效则使用CharacteristicsOrOriginalFirstThunk作为返回地址
          if ImportDescriptor^.FirstThunk = 0 then DWORD(OldNtDeviceIoControl) := Pdword(lpAddr)^;
          WriteProcessMemory(GetCurrentProcess(), lpAddr, @myaddr, 4, btw);
          Result := True;
        //  Exit;
        end;

        Inc(iNum);
        ThunkData := PImageThunkData(DWORD(ThunkData) + SizeOf(_IMAGE_THUNK_DATA));
      end;

      Inc(ImportDescriptor);
    end;
  end;
2011-11-3 21:28
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
164
靠,收藏了,学习了,看雪就是这一点好,

永远雪藏着国内顶尖技术。
2011-11-4 09:33
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
165
MJ最近怎么没有现身哈?去哪了?
2011-12-5 22:55
0
雪    币: 123
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
166
我不觉得用spi有什么问题!!!
2011-12-6 08:59
0
雪    币: 43
活跃值: (186)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
167
另类挂钩 RING3数据包监视 不错
2011-12-6 11:09
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
168
弱弱的请教一下,这种方法HOOK了一个程序,退出时需要还原吗,谢谢啦~~~
2011-12-19 09:47
0
雪    币: 297
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
169
看不懂。。。。努力学习
2011-12-19 21:47
0
雪    币: 170
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
170
高手啊,但愿这种帖子多一些
2012-2-23 15:22
0
雪    币: 71
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
171
网络抓包,思路另类~~~
2012-3-21 17:36
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
172
"网上的方法都非常挫"

既然非常挫,那你去看什么? 无意义
2012-4-19 11:34
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
173
收藏了~~~~~~
2012-4-23 17:07
0
雪    币: 151
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
174
也不是什么高深莫测的技术啊....
逆向下afd.sys,就什么都有了
原以为是一片处女地啊,不想那马早就被开发了...
2012-5-30 15:57
0
雪    币: 151
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
175
也不是什么高深莫测的技术啊....
逆向下afd.sys,就什么都有了
原以为是一片处女地啊,看来已被开发了...
2012-5-30 15:59
0
游客
登录 | 注册 方可回帖
返回
//