zoukankan      html  css  js  c++  java
  • [转]对抗OD内存断点

    标 题: 【原创】对抗OD内存断点
    作 者: 堕落天才
    时 间: 2007-09-28,21:08:51
    链 接: http://bbs.pediy.com/showthread.php?t=52503

    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都不知为何物,后来有少少发现就到论坛上灌,真是“不知自己无知”。半
    年前,终于“知道自己无知”,不敢再乱灌,就沉默了下来。一年来,在看雪上学到了很多,借烂文一篇感谢一下。 
    上传的附件
    文件类型: rar AntiMBP.rar (8.5 KB, 263 次下载) [谁下载?]
  • 相关阅读:
    51nod 1004 n^n的末位数字
    51nod 1003 阶乘后面0的数量
    unity3d-多媒体与网络
    unity3d-代码控制游戏角色控制器移动
    unity3d-角色控制器续
    unity3d-物理引擎
    unity3d-碰撞检测
    unity3d-射线(Ray)
    unity3d-小案例之角色简单漫游
    unity3d-绘制贴图
  • 原文地址:https://www.cnblogs.com/moher/p/3058574.html
Copyright © 2011-2022 走看看