首页
社区
课程
招聘
hook KiUserExceptionDispatcher 的问题
2004-7-12 22:38 18796

hook KiUserExceptionDispatcher 的问题

2004-7-12 22:38
18796
为了写 UPX dll类型脱壳代码,我参照 yoda AspackDie的代码 写了一个,它的原理大致上就是 hook system exception handler,所有你在代码中设的 INT3 中断,都能拦下,在NT下,这个handler就是NT.DLL中 的 KiUserExceptionDispatcher,通过hook这个函数你就能横扫千军,无人匹敌,但问题也就跟着就来了,虽然我可以准确地拦下代码,但在处理如何hook这个函数上,犯了难 --- 那就是从最后一次中断处返回后,想退出hook,恢复原来的KiUserExceptionDispatcher 函数,但我的程序随之也退出,这说明在退出hook之前的扫尾工作没有做好,让系统认为还是发生了exception,强行中止了程序运行。哪位朋友有这方面的进一步分析或者代码、文章或其他相关内容,先谢了,下面我贴出我改良的yoda代码(delphi),现在就是不能正常退出。

procedure HookExceptionHandlerOnNT; stdcall;
label
  OriKUED;
var
  ExcepRec: PExceptionRecord;
  Context: PContext;
begin
  asm
    mov eax, [EBP + 8]  //struct _CONTEXT*
          mov Context, eax
    mov eax, [EBP + 4]  // struct EXCEPTION_RECORD*
          MOV ExcepRec, eax
  end;
  if ExcepRec.ExceptionCode = EXCEPTION_BREAKPOINT then
  begin
    // 我在脱壳程序中分别设置了三个断点,都成功拦下,但从第三次返回后,进程被强迫中止,程序退出,问题就出在这里了
    case BpCounter of
      0: BP_HANLDER_FIRST_DLL(ExcepRec);
      1: BP_HANLDER_SECOND_DLL(Context);
      2:
        begin
          BP_HANLDER_THIRD_DLL(Context);
          UnhookExceptionHandlerOnNT; // KiUserExceptionDispatcher
        end;
    end;
    //Inc(Context.Eip); //这一句不加程序能正常运行,加了反而不成,为什么yoda的就可以
    TNtContinue(_NtContinue)(Context, 0);
    Exit;
  end;
  //正常情况下 下面的代码不应该执行吧?
  OriKUED:
  UnhookExceptionHandlerOnNT;
  asm
    // restore stack from procedure HookExceptionHandlerOnNT
    pop ecx
    pop ecx
    pop ebp
    // jmp to orignal entrypoint of KiUserExceptionDispatcher
    jmp pOrgKiUserExctDisp
  end;
end;

// 恢复 KiUserExceptionDispatcher 入口处的原始代码
procedure UnhookExceptionHandlerOnNT;
asm
  // restore orginal byte of KiUserExceptionDispatcher
        MOV    EDI, pOrgKiUserExctDisp
        MOV    EAX, KUED_Entry1
        MOV    DWORD PTR [EDI], EAX
        MOV    EAX, KUED_Entry2
        MOV    WORD PTR [EDI + 4], AX
  RET
end;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
打赏
分享
最新回复 (8)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2004-7-12 22:40
2
0
直接修改IDT...:D
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dREAMtHEATER 2004-7-12 22:43
3
0
别这么简单,我不是这方面的专家,给一些资料。文章,代码,demo任何一切让我可以参考的
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
lordor 6 2004-7-13 00:19
4
0
//Inc(Context.Eip); //这一句不加程序能正常运行,加了反而不成,为什么yoda的就可以

从异常中断处的eip加1?
你看一下你获得的的context是否正确
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
kongfoo 14 2004-7-13 07:58
5
0
inc(EIP)就破坏指令了,例:
40000:E8 00 00 00 00,在40000放个CC中断后EIP就是40000,inc(EIP)之后系统就返回到40001处继续执行了。
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dREAMtHEATER 2004-7-13 10:20
6
0
最初由 kongfoo 发布
inc(EIP)就破坏指令了,例:
40000:E8 00 00 00 00,在40000放个CC中断后EIP就是40000,inc(EIP)之后系统就返回到40001处继续执行了。


9x下等加1,我只是印象中是这样了,其他的我记不住了
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dREAMtHEATER 2004-7-13 10:21
7
0
没有朋友能具体地回答一下吗,等待中...
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
cyclotron 17 2004-7-13 11:29
8
0
9x下后面int3中断以后异常地址是int3下面的一个地址……
雪    币: 260
活跃值: (81)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
pll621 2004-7-13 22:03
9
0
最初由 cyclotron 发布
9x下后面int3中断以后异常地址是int3下面的一个地址……

嗯我记得是这样的,和nt的有点区别
游客
登录 | 注册 方可回帖
返回