首页
社区
课程
招聘
[原创]菜菜对od,F2断点的小小理解
发表于: 2011-2-23 20:02 10481

[原创]菜菜对od,F2断点的小小理解

2011-2-23 20:02
10481

主题:Od中F2断点深入解析
语言:C,内联asm
平台:win32
工具:vc6.0  od  计算器
*******附件83 85,加不上去,楼下有。。真是做的稀烂。。。自卑。。
哈哈,自我申明,没有什么高深的技术,只是想逼自己做什么都需要动手,高手请过。。(纸上谈来终觉浅,绝知此事要躬行)。。
首先我们知道,在od中下 F2(或vc中F9)断点通常是在运行前编译器,将断点的位置写入int 3(机器码即0xcc),.当被调试的进程执行int3 指令时导致一个异常时,调试器会捕捉这个异常从而停在断点处,然后将断点处的指令恢复原来的指令。就是这样么?我们接下来具体操作操作,由于实际在od中下断处,我们观察内存根本看不见有cc出现(对像我这样的新手来说,其实通过其他方法是可以看到的),让我用小code来证明一下:两个问题
1.是否0xcc被插入。。
2.插入后是否一直恢复了原指令?答案:不是,它还有一个执行完后,继续写回的操作。

证1:code
#include "windows.h"
void Sample()
{  
  int sum=0;
  sum+=2;
  MessageBox(NULL,"SampleSelf!","Sample",MB_OK);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  byte *PointA;
  PointA=(byte *)Sample;                //Sample处下断
  if (*PointA==0xcc)                        //检测
                MessageBoxA(0,"CC exist!","Debugger",0);
  Sample();  
  if (*PointA==0xcc)
                MessageBoxA(0,"CC exist!","Debugger",0);
}

代码很简单,呵呵。。。我们来看看载入od的结果





1证明成立确实是int 3 插入,这个来论坛没人不知道呵呵。。。

第二条证明,可能有很多像我这样的新手会认为F2断点的原理早已掌握,其实不然。。我可能是个特殊。。

证2代码:
#include<windows.h>
#include<stdio.h>
DWORD  Calculation(DWORD StartAddr,DWORD dwCodeLength)
{
  _asm
  {
      xor eax,eax
      xor ebx,ebx
      mov esi,StartAddr
      mov ecx,dwCodeLength
Label1:
      mov bl,byte ptr [esi]
      add eax,ebx
      inc esi
      loop Label1      
  }
  
}

DWORD CheckSelf(DWORD StartAddr,DWORD dwCodeLength)
{
  _asm
  {
      xor eax,eax
      xor ebx,ebx
      mov esi,StartAddr
      mov ecx,dwCodeLength
Label1:
      mov bl,byte ptr [esi]
      add eax,ebx  
      inc esi
      loop Label1
      sub eax, 3763//3763是由dwSumbyte提前提供
  }
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)

{
  DWORD dwStartAddr=0;
  DWORD dwEndAddr=0;
  DWORD dwCodeLength=0;
  DWORD dwChecksum=0;
  DWORD dwSumbyte=0;
  DWORD dwOdd=0;
  char  temp[200]={0};
  _asm
  {
Start:
    xor eax,eax
    xor ebx,ebx
    xor ecx,ecx
    xor edx,edx
    add ebx,ecx
    add edx,ebx
    add ebx,eax
    add eax,ebx
    mov dwStartAddr,offset Start
    mov dwEndAddr,offset End  
End:
  }

dwCodeLength=dwEndAddr-dwStartAddr;
dwSumbyte=Calculation(dwStartAddr,dwCodeLength);
dwOdd = CheckSelf(dwStartAddr,dwCodeLength);
wsprintf(temp,"the Deviation is %d",dwOdd);
MessageBox(NULL,temp,"OK",MB_OK);                   //显示差值,od是否作用过。。。
}

代码也很简单,了解代码校验的估计都会。。所以也不多说。。
我测试的断点是 Start和End标签直接。。。
好我们来看结果:
1.不下断点:

结果正常!

2.下断点:


------1,下在此处:


为什么是这个值呢?
答:应该是0xcc,代替了图中的0x33,算算就知道 0xcc-0x33=153 正确

------2.那你来猜猜第二次应该是多少呢?
0xcc+0xcc-0x33-0x03应该等于354.。。


哈哈都对了。。。
确实是机器码cc起了作用。。
但==,看看我的代码2,发现了什么异常吗?不是说过它执行完了就回把源代码还原吗,
我的Start和End 之间的代码可在计算函数之前执行的哦!!为什么它还会存在int 3(0xcc),
我想,它在之后又还是将int 3 写入进程text一次,只要不结束,它就存在,是这样吗,实际确实是这样滴!(想想我们在断F2时,如果你不清除,断点是始终存在的,恩就是这个道理!)

我来实际操作看看,还是执行code1,Sample处下F2断点:
操作结果是:依次显示3副图




[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
2
附件83:

附件85:
上传的附件:
2011-2-23 20:11
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
引用一下:纸上谈来终觉浅,绝知此事要躬行
2011-2-23 21:03
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
4
你的雪碧  很多呀。。。呵呵
2011-2-23 21:32
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
我还送了好多邀请码出去的啊,不知道为神马还有这么多,我也感觉郁闷啊
2011-2-23 21:36
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
阅~~~~~~~~~~~~~~~~~~~
2011-2-23 21:59
0
雪    币: 47147
活跃值: (20480)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=ycmint;928808]主题:Od中F2断点深入解析
语言:C,内联asm
平台:win32
工具:vc6.0  od  计算器
*******附件83 85,加不上去,楼下有。QUOTE]

参考这个方法,应该可以放到文章中去。
http://bbs.pediy.com/showpost.php?postid=292659
2011-2-23 22:03
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
谢谢分享~~
2011-2-23 22:30
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享!!!
2011-2-23 22:48
0
雪    币: 123
活跃值: (295)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好看-----
2011-2-23 23:42
0
雪    币: 678
活跃值: (101)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
11
水水更健康啊,呵呵。
2011-2-24 08:20
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
12
谢谢。。。
我感觉都是照着这样传上去的,但他就是显示不存在。。。可能是我用的图太多了,以后不弄这么多图。。呵呵。。
2011-2-24 08:29
0
雪    币: 695
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
感谢分享,顺便膜拜下版主
2011-2-24 10:55
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
呵呵,看了看,确实很多东西要躬行才能有更深刻的体会。
2011-2-24 13:43
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了。。。
2011-2-24 20:47
0
雪    币: 1530
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感谢分享,  
2011-6-17 11:30
0
游客
登录 | 注册 方可回帖
返回
//