首页
社区
课程
招聘
[讨论]【如何实现某个内存地址写入时中断?用编程实现,不是用工具!】
发表于: 2018-6-26 19:46 4530

[讨论]【如何实现某个内存地址写入时中断?用编程实现,不是用工具!】

2018-6-26 19:46
4530
是不是用VirtualProtectEx设置此地址不可写,然后用Debug API捕获异常并处理?如果是的话,它属于DEBUG_EVENT 中哪一类?如下:
union {
EXCEPTION_DEBUG_INFO Exception;
CREATE_THREAD_DEBUG_INFO CreateThread;
CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO ExitThread;
EXIT_PROCESS_DEBUG_INFO ExitProcess;
LOAD_DLL_DEBUG_INFO LoadDll;
UNLOAD_DLL_DEBUG_INFO UnloadDll;
OUTPUT_DEBUG_STRING_INFO DebugString;
RIP_INFO RipInfo;
}
如果是第一个的话,EXCEPTION_DEBUG_INFO 里又有成员 EXCEPTION_RECORD ExceptionRecord, ExceptionRecord 成员又包含成员DWORD ExceptionCode, ExceptionCode又有以下情况,那么用 VirtualProtectEx设置此地址不可写产生的异常,对应下面哪一个类型?
EXCEPTION_ACCESS_VIOLATION 存取越界 
EXCEPTION_ARRAY_BOUNDS_EXCEEDED 由硬件监测到的数组访问越界 
EXCEPTION_BREAKPOINT 触发断点 
EXCEPTION_DATATYPE_MISALIGNMENT 数据未对齐
EXCEPTION_FLT_DENORMAL_OPERAND 浮点操作数范围越界(太小或太大)
EXCEPTION_FLT_DIVIDE_BY_ZERO 浮点操作除数为0
EXCEPTION_FLT_INEXACT_RESULT 浮点运算结果不能用小数正常表示.
EXCEPTION_FLT_INVALID_OPERATION 其他未知的浮点数错误
EXCEPTION_FLT_OVERFLOW 浮点操作太大溢出
EXCEPTION_FLT_STACK_CHECK 浮点栈溢出.
EXCEPTION_FLT_UNDERFLOW 浮点操作太小溢出
EXCEPTION_ILLEGAL_INSTRUCTION 执行非法指令
EXCEPTION_IN_PAGE_ERROR 存取未存在的内存页
EXCEPTION_INT_DIVIDE_BY_ZERO 除数为0
EXCEPTION_INT_OVERFLOW 整数操作,最高位溢出
EXCEPTION_INVALID_DISPOSITION 错误的异常处理程序地址
EXCEPTION_NONCONTINUABLE_EXCEPTION 遇上不能继续执行的异常
EXCEPTION_PRIV_INSTRUCTION 当前模式下,不能执行该指令
EXCEPTION_SINGLE_STEP 单步跟踪断点触发
EXCEPTION_STACK_OVERFLOW 线程的栈空间溢出

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

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
VEH
2018-6-26 19:50
0
雪    币: 3586
活跃值: (4729)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
EXCEPTION_ACCESS_VIOLATION
2018-6-26 20:10
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
4
VEH
2018-6-27 08:12
0
雪    币: 1825
活跃值: (5354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-6-27 08:54
0
雪    币: 776
活跃值: (3425)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
6
调试启动的话可以设置硬断。非调试启动的话,改掉内存所在页的写权限,然后设置异常处理,判断异常方式为内存写入异常以及内存地址是你要监控的地址。具体代码没有,只提供思路
2018-6-27 10:26
0
雪    币: 285
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
EPT
2018-6-27 16:33
0
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
VEH 
2018-6-27 16:35
0
雪    币: 1825
活跃值: (5354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
VEH不行的,修改此地址的这一句汇编代码被很多地方共用,比如修改其他地址也同样调用这一句代码,如果用VEH在这一行拦截,都会拦截下来,游戏就可能变卡。所以我只能监视我的目标地址的写入。
2018-6-27 19:41
0
雪    币: 222
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
把程序里的所有的访问的指令都监控起来,打印出来岂不是更方便?
2018-7-1 09:50
0
雪    币: 68
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
vt ept
2018-7-1 17:24
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
PAGE_GUARD 堆栈溢出了解一下
2018-7-2 01:07
0
雪    币: 4942
活跃值: (4678)
能力值: ( LV10,RANK:171 )
在线值:
发帖
回帖
粉丝
13
VEH可以过滤得到中断时的状态,这可以用来实现软硬件断点;你上面提到DEBUG_EVENT,那个可能需要简单写个调试器(一个简单的循环,switch里对应异常类型,这个在论坛里搜可以找到),然后得到中断时的状态。
提示一点:VirtualProtectEx的flNewProtect参数有很多选项,各个选项对应不同的exception code,PAGE_GUARD对应EXCEPTION_GUARD_PAGE,把text节修改为PAGE_READONLY对应PAGE_ACCESS_VIOLATION,你如果想问哪个参数对应哪个异常,自己试验是最好的,同时比询问节约时间。
2018-7-3 20:07
0
雪    币: 1825
活跃值: (5354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
如果设置成PAGE_READONLY,那么有三个问题求教:
  ⑴如果设置成【只读】,中断是在【指令写入此地址之前】还是【指令写入此地址之后】产生?如果【指令写入此地址前】就已产生,那么为何还没写入,就已经产生【访问非法】?
  ⑵我想要的是【写入此地址后】或【读取此地址前】产生中断,因为这样改才有意义,否则如果在指令写入前就中断了,等我改完又会被程序自身的写入指令覆盖了,等于没改。
2018-7-4 10:55
0
雪    币: 1825
活跃值: (5354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
coneco VEH可以过滤得到中断时的状态,这可以用来实现软硬件断点;你上面提到DEBUG_EVENT,那个可能需要简单写个调试器(一个简单的循环,switch里对应异常类型,这个在论坛里搜可以找到),然后得到中 ...
如果设置成PAGE_READONLY,那么有三个问题求教:

  ⑴如果设置成【只读】,中断是在【指令写入此地址之前】还是【指令写入此地址之后】产生?如果【指令写入此地址前】就已产生,那么为何还没写入,就已经产生【访问非法】?

  ⑵我想要的是【写入此地址后】或【读取此地址前】产生中断,因为这样改才有意义,否则如果在指令写入前就中断了,等我改完又会被程序自身的写入指令覆盖了,等于没改。

2018-7-4 10:55
0
雪    币: 776
活跃值: (3425)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
16
设置成只读之后,异常是在写入时发生的,因为没有权限,所以会失败,结果就是【写入前】。你可以自己修改,并且把原写入指令跳掉。
不过我注意到一个现象,调试器里如果设置了硬断的话,是在【写入前】中断,如过设置的软断的话,似乎是在【写入后】中断。
2018-7-4 11:11
0
雪    币: 1825
活跃值: (5354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
yeyeshun 设置成只读之后,异常是在写入时发生的,因为没有权限,所以会失败,结果就是【写入前】。你可以自己修改,并且把原写入指令跳掉。 不过我注意到一个现象,调试器里如果设置了硬断的话,是在【写入前】中断,如过 ...

  我不是调试器,是自己写程序,如我回复中说的情况,是【写入前】还是【写入后】中断?有没有【写入后】或【读取前】的中断?这样就不用修改原指令了
2018-7-4 11:21
0
雪    币: 776
活跃值: (3425)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
18
BeholdSnow   我不是调试器,是自己写程序,如我回复中说的情况,是【写入前】还是【写入后】中断?有没有【写入后】或【读取前】的中断?这样就不用修改原指令了
你设置中断的话,其实就是两种方式,一种使用调试技术可以设置硬断。一种修改页面属性实现软断。软断估计会很卡。
10楼的哥们我觉得挺有道理的,先下个软断或者hook,把访问的指令地址都打印出来,然后根据自己的需求筛选,从上一级去处理。上一级不够的话就再上一级。
这样就避开了软断访问太频繁很卡的问题。
2018-7-4 11:37
0
游客
登录 | 注册 方可回帖
返回
//