首页
社区
课程
招聘
VEH_Hook时遇到的问题
发表于: 2014-7-27 23:24 3987

VEH_Hook时遇到的问题

2014-7-27 23:24
3987

LONG NTAPI CALL_MessageBoxA(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
PVOID addr;
if(ExceptionInfo->ExceptionRecord->ExceptionCode==EXCEPTION_BREAKPOINT)
{
addr=ExceptionInfo->ExceptionRecord->ExceptionAddress;
//获取当前异常的地址
if (addr!=(PVOID)0)
{
char *lpText=(char*)ExceptionInfo->ContextRecord->Esp+8;
char *lpCaption=(char*)ExceptionInfo->ContextRecord->Esp+0xC;
lpText="Hello World!";
lpCaption="Hello World!";
//获取参数,修改参数
//::MessageBox(0,lpText,lpCaption,MB_OK);
//*(LPBYTE)(ExceptionInfo->ContextRecord->Eip)=0x90;
//ExceptionInfo->ContextRecord->Eip++;

ExceptionInfo->ContextRecord->EFlags |= 0x100;
//设置状态寄存器
VirtualProtect((void*)addr,BREAKPOINTLEN,dwNewProtect,&dwOldProtect);
*(BYTE*)(addr) = MessageBoxA_Ole_INT;
//恢复int3的原代码
VirtualProtect((void*)addr,BREAKPOINTLEN,dwOldProtect,&dwNewProtect);
AddVectoredExceptionHandler((ULONG)ExceptionInfo,NULL);

return ExceptionContinueExecution;
int lpaddr=(int)addr+(int)1;
addr=(PVOID)lpaddr;
__asm jmp addr;
}
}
return EXCEPTION_EXECUTE_HANDLER;
}


上面代码 是通过int 3 造成异常后 获取异常的代码 我处理完成之后 如何才能让代码继续运行呢????求助啊
原因找到了 感谢楼下三位的帮助 为我提供了不少思路 由衷地感谢~~
原因是我的返回值错误 如果想让程序继续任务除了修改EIP 和还原代码外 还需要
ExceptionInfo->ContextRecord->ContextFlags=CONTEXT_CONTROL;
返回EXCEPTION_CONTINUE_EXECUTION(-1)让程序从EIP继续执行。留下答案 希望别人碰到问题时可以帮到。

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
设置好_EXCEPTION_POINTERS的Context,然后return EXCEPTION_CONTINUE_EXECUTION。
2014-7-28 00:13
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
请问可以说的具体一点的 有点不太明白
2014-7-28 01:39
0
雪    币: 433
活跃值: (1930)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
妈的我以为我写的已经很丑了
2014-7-28 01:57
0
雪    币: 66
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ExceptionInfo->ContextRecord->EFlags |= 0x100; 会让你的异常接管再得到一个异常就是单步异常,
你还需要处理一次单步异常,加入你需要重新把cc指令加上去的话,如果不需要就删除掉
在这个代码下面需要增加一条
ExceptionInfo->ContextRecord->Esp = addr 让程序重新执行一次代码 ,因为你是int3回复代码后需要重新执行正确的代码

int lpaddr=(int)addr+(int)1;
      addr=(PVOID)lpaddr;
      __asm jmp addr;
  这些都是垃圾代码 删除掉吧。

你控制的是寄存器不是代码。你要改成JMP 的话你就直接改eip 值

程序执行到call  
call 内有cc指令
触发断点异常
改回原来的指令
修改eip为原来指令的地址 让系统重新执行正确代码
设置单步异常,
执行完正确代码后给我们一次写入CC断点的机会
2014-7-28 02:26
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
6
你可以参考下我原来写的内存监视器的代码,基于VEH的。
代码写的很烂,别见怪0.0
[URL="http://bbs.pediy.com/showthread.php?t=174704"]自己写的非附加调试的内存监视器[/URL]
2014-7-28 10:45
0
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
感谢哦~
2014-7-28 14:26
0
游客
登录 | 注册 方可回帖
返回
//