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

hook KiUserExceptionDispatcher 的问题

2004-7-12 22:38
19079
为了写 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;

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

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

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


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

嗯我记得是这样的,和nt的有点区别
2004-7-13 22:03
0
游客
登录 | 注册 方可回帖
返回
//