codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
阅读:3526回复:14

ARPRcvIndicationNew 定义原型?顺便上传 360AntiARP 逆向代码。

楼主#
更多 发布于:2007-10-09 16:11
前段时间埋头工作,前两天突然发现 360AntiARP,顺便逆了一下。

现在已经逆到第二次 Hook 动作了,就是 ARPRcvIndicationNew 的 Hook。

网上找了半天也没发现该函数的原型定义,那位兄弟帮忙给出一下?谢谢!

就是下面代码中的 HookProc2 部分 :)

///////////////////////////////////////////////////////////////////////////////
// Hook: NdisRegisterProtocol

VOID
    HookProc (PNDIS_STATUS Status, PNDIS_HANDLE Handle,
                PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
                UINT CharacteristicsLength)
{
    UCHAR * p, * pMax;
    ULONG ul;
    KIRQL OldIrql;
    
    p = (UCHAR *)ProtocolCharacteristics->SendCompleteHandler;
    
    if ( !MmIsAddressValid (p) )
        goto quit_hook;
    
    if ((ULONG)p < _ul7)
        goto quit_hook;
    
    if ((ULONG)p > (_ul7+_ul8))
        goto quit_hook;
    
    pMax = p + 0x80;
    for (; p<pMax; p++) {
        if (!MmIsAddressValid(p) || (*p!=0xE8)) continue;
        
        ul = *(PULONG)(p+1);    // get call offset
        ul += (ULONG)p+5;        // goto subproc entry point
        _ulB = ul;
        
        if (!MmIsAddressValid((PVOID)ul)) continue;
        if (_ulB > _ul7) {
            if (_ulB < (_ul7+_ul8)) break;
        }
        
        _ulB = 0;
    }
    
    if (_ulB) {
        KeAcquireSpinLock (&_SpinLock, &OldIrql);
        DisableProtect ();
        
        // Hook & Hook again!
        *(PULONG)(p+1) = (ULONG)HookProc2 - (ULONG)p - 5;
        
        __asm
        {
            sti
            push eax
            mov eax, _oldCR0
            mov cr0, eax
            pop eax
        }
        
        KeReleaseSpinLock (&_SpinLock, OldIrql);
        
        p = (UCHAR *)ProtocolCharacteristics->ReceivePacketHandler;
        if (MmIsAddressValid(p)) {
            pMax = p + 0x100;
            
            if (p<pMax) {
            
                for (; p<pMax; p++) {
                    if (!MmIsAddressValid(p) || *p!= 0xE8) continue;
                    ul = *(PULONG)(p+1);
                    ul += (ULONG)p+5;
                    
                    if (ul == _ulB) break;
                }
                
                KeAcquireSpinLock (&_SpinLock, &OldIrql);
                DisableProtect();
                
                // Hook, Hook & Hook again!!!
                *(PULONG)(p+1) = (ULONG)HookProc2 - (ULONG)p - 5;
                
                __asm
                {
                    sti
                    push eax
                    mov eax, _oldCR0
                    mov cr0, eax
                    pop eax
                }
                
                KeReleaseSpinLock (&_SpinLock, OldIrql);
            }
        }
    }
    // para_1
    _ulA = (ULONG)ExAllocatePool (NonPagedPool, 0x1000);
    _ul9 = 0;
    memset ((PVOID)_ulA, 0, 0x1000);
    
    _ulC = (ULONG)ExAllocatePool (NonPagedPool, 0x6);
    memset ((PVOID)_ulC, 0, 0x6);
    
    if (!MmIsAddressValid ((PVOID)_ul4))
        goto quit_hook;
    
    if (!MmIsAddressValid ((PVOID)_ul6))
        goto quit_hook;
    
    KeAcquireSpinLock (&_SpinLock, &OldIrql);
    DisableProtect();
    *(PULONG)_ul4 = _ul6;
    __asm
    {
        sti
        push eax
        mov eax, _oldCR0
        mov cr0, eax
        pop eax
    }
    KeReleaseSpinLock (&_SpinLock, OldIrql);
    
quit_hook:
    ((NDIS_REGISTER_PROTOCOL)_ul6)(Status, Handle, ProtocolCharacteristics,
                                        CharacteristicsLength);
}

附件在 9 楼,嘿嘿。
密码: nanothyll

最新喜欢:

LeopardLeopar...
throb
驱动牛犊
驱动牛犊
  • 注册日期2005-02-23
  • 最后登录2022-03-04
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望86点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-10-09 17:31
查不多了,不用找原形的,你看看这个连接http://www.debugman.com/job.php?action=download&pid=2603&tid=622&aid=307的idb, 再加上debug 下应用层的传来的参数,可以把8-9个参数还原的查不多,可以看下tcpip.sys里面的函数,自己用ida 分析下,我分析过2000 下的,加符号表,只分析出来了2个参数.那个连接里分析出来了2个参数.
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-10-09 17:54
NDIS_STATUS __stdcall FakeARPRecvInNew(NDIS_HANDLE Handle,
                                       NDIS_HANDLE Context,
                                       PVOID Header,
                                       uint HeaderSize,
                                       PVOID Data,
                                       uint DataSize,
                                       uint TotalSize,
                                       ULONG Unknow1,
                                       ULONG Unknow2)

源码解惑~
驱动开发者 呵呵
throb
驱动牛犊
驱动牛犊
  • 注册日期2005-02-23
  • 最后登录2022-03-04
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望86点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-10-09 18:01
BOOL ARPRcvIndicationNew(
IN NDIS_HANDLE  ProtocolBindingContext,
IN NDIS_HANDLE  MacReceiveContext,
IN PVOID  HeaderBuffer,                // ethernet_head
IN UINT  HeaderBufferSize,
IN PVOID  LookAheadBuffer,            // ARP_PACKET
IN UINT  LookaheadBufferSize,
IN UINT  PacketSize,
IN UINT unKown,        // 可以取0, 4 字节
IN UINT unKown)        // 可以取0,  4 字节
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-09 19:32
嘿嘿,还是找原作者方便,下次直接联系你好了 :)
也谢谢 throb 的热心帮忙~
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-10-14 23:03
都搞定了,问个问题,为什么 360AntiARP 这个驱动的 SpinLock 在 KeAcquireSpinLock 和 KeReleaseSpinLock 之前没有调用 KeInitializeSpinLock 函数?

我没用过 SpinLock , 路过的大牛顺便答疑一下。
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-10-15 11:37
嘿嘿,来看看这个函数~

FORCEINLINE
VOID
NTAPI
KeInitializeSpinLock (
    __out PKSPIN_LOCK SpinLock
    )
{
    *SpinLock = 0;
}
驱动开发者 呵呵
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-15 14:06
果真如此,原来是这样子:

kd> u nt!KeInitializeSpinLock
nt!KeInitializeSpinLock:
804db5c4 8b442404        mov     eax,dword ptr [esp+4]
804db5c8 c70000000000    mov     dword ptr [eax],0
804db5ce c20400          ret     4

Many thanks!
throb
驱动牛犊
驱动牛犊
  • 注册日期2005-02-23
  • 最后登录2022-03-04
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望86点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2007-10-15 18:47
学习了
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-16 15:28
偷偷放出来了,大家看个热闹就好。呵呵。
反的比较差,变量也懒得修整,将就看吧。

。。。

添加一下,密码是:nanothyll
第一楼最后明明有写么,不明显么?
那就放在这里好了,嘿嘿
附件名称/大小 下载次数 最后更新
360antiarp.zip (5KB)  95 2007-10-16 15:28
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-10-17 08:49
有密码啊,下载下来无法看.
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-10-17 08:49
有密码啊,下载下来无法看.
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
12楼#
发布于:2007-10-17 11:54
引用第11楼wangjianfeng于2007-10-17 08:49发表的  :
有密码啊,下载下来无法看.

密码是:
nanothyll
没有战争就没有进步 X3工作组 为您提供最好的军火
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
13楼#
发布于:2007-10-17 13:42
好多GOTO,,,,我都看不懂了。。。
驱动开发者 呵呵
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
14楼#
发布于:2007-10-17 15:13
引用第13楼WQXNETQIQI于2007-10-17 13:42发表的  :
好多GOTO,,,,我都看不懂了。。。

很漂亮的goto~
没有战争就没有进步 X3工作组 为您提供最好的军火
游客

返回顶部