---恢复内容开始---
看了两篇帖子,在大牛们的引导下,有所感悟,遂以文记。
1.OD中内存访问断点的原理 |
内存访问断点:OD将目标内存所在的页面(范围圆整为1000h的倍数)设置为PAGE_NOACCESS,当被调试程序对这个内存进行任何“读、写或运行”操作时,都会触发异常。
内存写入断点:OD将目标内存所在的页面(范围圆整为1000h的倍数)设置为PAGE_EXECUTE_READ,当被调试程序对这个内存进行“写”操作时触发异常。
触发异常被捕捉到之后,OD停下来,就起到了“内存断点”的作用。
2.如何反内存断点?
使用VirtualProtect函数改变内存属性,没有异常触发,OD就不会段下来了。
没事就VirtualProtect((LPVOID)段始, 段长, PAGE_EXECUTE_READWRITE, (LPDWORD)..),使段属性可读刻写可执行。
仿照大牛的代码,自己改写了一个anti的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
#include<windows.h> #include <stdio.h> char
szAppName [] = "Anti memory break point!" ; char
szText[] = "Hi! try to set a memory break point here! Success?" ; int main() { printf ( "[+] 请在0x%X处下内存访问断点!\n" ,szText); printf ( "[+] 如果成功了,程序会断在lstrlen函数中,请返回到程序领空\n" ); DWORD
dwOldProtect; int
nLen = lstrlen( szText ); printf ( "[+] 已返回到程序领空!VirtualProtect函数马上改写内存页属性!\n" ); if
(VirtualProtect( &szText,nLen,PAGE_READWRITE,&dwOldProtect)) { printf ( "%s\n" ,szText); MessageBoxA(NULL, "恭喜!\n如果你下了内存断点,并执行到这里,那么VirtualProtect()帮你anti了内存断点" ,szAppName,MB_OK); } nLen++; return
0; } |
3.进一步的启发,如何反内存断点?
只要在代码一直掉用这个函数,那么内存断点就不起作用了。
思路:对于加壳软件来说,可以在段即将跳转的时候,给每个段中都使用vp函数,就可以达到anti的效果。
原文:http://www.cnblogs.com/Rrouned/p/3598341.html