飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3744|回复: 7

[转贴] 对抗OD内存断点

[复制链接]

该用户从未签到

发表于 2008-4-21 02:40:58 | 显示全部楼层 |阅读模式
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下断点,应该很快就能到达反内存断点的地方。
PYG19周年生日快乐!

该用户从未签到

发表于 2008-4-23 20:53:39 | 显示全部楼层
哈哈,做下沙发,学习了。/:good
PYG19周年生日快乐!

该用户从未签到

发表于 2008-4-25 11:26:05 | 显示全部楼层
学习下,谢谢楼主!
PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 13:46
  • 签到天数: 530 天

    [LV.9]以坛为家II

    发表于 2008-5-2 12:28:15 | 显示全部楼层
    对抗OD内存断点,你这不是增加破解的难度吗?呵呵
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-6 14:41:30 | 显示全部楼层
    学习了,谢谢·······
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-6 16:07:18 | 显示全部楼层
    感谢楼主分享~~~~~~~~~~~~~~~~/:014 /:014 /:014
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-6 17:22:26 | 显示全部楼层
    谢谢楼主分享,支持
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2023-12-24 00:33
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2008-5-7 17:04:48 | 显示全部楼层
    这个东西是真的很让我晕
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表