欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

对抗OD内存断点

对抗OD内存断点

10月11号提前版,纪念“堕落天才”这个ID注册一周年。
   (标题看起来可能很诱人,内容却很简单,希望你不会太失望)
1,OD内存断点原理
   A,内存访问断点,OD将目标内存所在的页面(范围圆整为1000h的倍数)设置为PAGE_NOACCESS,当被调试程序对这个内存进行任何“读、写或运行”操作时,都会触发异常。
   B,内存写入断点,OD将目标内存所在的页面(范围圆整为1000h的倍数)设置为PAGE_EXECUTE_READ,当被调试程序对这个内存进行“写”操作时触发异常。
   (原来都不是传说中的PAGE_GUARD?太惊讶了。)   
2,反OD内存断点原理
   要知道OD可以通过VirtualProtectEx改变内存页面属性,我们当然也可以修改,这样我们就可以发现内存断点或使其失效。
3,代码1

代码:
.386

.model flat,stdcall

option casemap:none

include windows.inc

include kernel32.inc

include user32.inc

includelib kernel32.lib

includelib user32.lib

.data

szAppName  db "Anti memory break point - By 堕落天才",0

szText     db "Hi,try to set a memory break point here!",0

szFound    db "A memory break point was found!",0

.data?

dwOldProtect dd ?

.code     

     

_start:                       

      

     invoke lstrlen,addr szText

     inc eax 

              

     invoke VirtualProtect,addr szText,eax,PAGE_READWRITE,addr dwOldProtect   

     

     .if eax == FALSE

         

          invoke GetLastError 

          .if eax == ERROR_NOACCESS

            

             invoke MessageBox,NULL,addr szFound,addr szAppName,MB_OK

             jmp @ExitMain

                         

          .endif

         

     .endif  

     

     invoke MessageBox,NULL,addr szText,addr szAppName,MB_OK     

     

  @ExitMain:     

     invoke ExitProcess,0       

     

     

end _start  

    用OD载入附件中AntiMBP_ASM.exe,对00403026-00403057(szText)内存范围下内存访问断点,F9运行,很快就中断了,是在lstrlen的内部。一直F9,如无意外程序将会显示“A memory break point was found!”提示框(在我的电脑里面是这样)。因为lstrlen后面的VirtualProtect试图改变szText所在内存范围的属性,失败后,LastError == ERROR_NOACCESS,这样我们就知道szText被设置内存断点了。
4,代码2
 
代码:
#include<windows.h>

char szAppName [] = "Anti memory break point - By 堕落天才";

char szFound[] = "A memory break point was found!";

char szText[] = "Hi! try to set a memory break point here! Success?";

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )

{

     DWORD dwOldProtect;

   int nLen = lstrlen( szText );

   nLen++;

   if(! VirtualProtect( &szText,nLen,PAGE_READWRITE,&dwOldProtect ) ){

           

     if(GetLastError() == ERROR_NOACCESS ){

       MessageBox( NULL,szFound,szAppName,MB_OK );

     }

   }else{

             MessageBox(NULL,szText,szAppName,MB_OK);

   }

     

   return 0;

} 

    用OD载入附件中的AntiMBP_CPP.exe,对00405078-004050A9(szText)内存范围下内存访问断点,F9运行,一样很快就中断在lstrlen内部。一直F9,如无意外程序将会显示“Hi! try to set a memory break point here! Success?”提示框(在我的电脑上是这样)。因为lstrlen后面的VirtualProtect试图改变szText所在内存范围的属性,成功后,下面的MessageBox函数对szText读取,不会再中断,这样szText上面设置的内存断点就失效了。
5,最后
   上面两段代码机会一摸一样,我不知为什么会有两个结果,不过无论是发现还是使其失效,我们反OD内存断点的目标已经达到。
6,反-反OD内存断点
   对VirtualQuery,VirtualQueryEx,VirtualProtect,VirtualProtectEx下断点,应该很快就能到达反内存断点的地方。
******************************************************************************************************
   “堕落天才”这个ID注册快一年了,认识看雪论坛也有一年了。一年前,不会汇编、不会驱动连OD都不知为何物,后来有少少发现就到论坛上灌,真是“不知自己无知”。半
年前,终于“知道自己无知”,不敢再乱灌,就沉默了下来。一年来,在看雪上学到了很多,借烂文一篇感谢一下。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功