注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

古城风~~~

竹密无妨溪水过,天高不碍白云飞。这天下总有一份是属于我古城的天地!

 
 
 

日志

 
 

OllyDBG分析报告系列(2)---内存断点(上)  

2008-06-10 12:48:59|  分类: 反编译(OllyDBG |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这是分析报告的第二部分,请多多指教。 

Ollydbg(以下均简称为OD)中的内存断点的主要功能是:修改要下内存断点的内存页属性,如访问断点就设置禁止访问、执行断点就设置禁止执行。这样当程序要用到这个内存页时就会报异常,由OD捕获,OD比较一下是否是下了断点的内存区域,如果不是就继续执行,否则就断下等待调试人员操作。

内存断点的添加、设置以及判断部分是由不同的函数处理的,先说一下这三个函数的关系,然后写出其流程,最后分析代码:

内存断点添加函数一般只是设置内存断点信息表,并不修改内存访问属性,若是在运行状态时设置内存断点,则会修改内存页属性;内存断点设置函数是在按下F9时才会被调用的,并且每走一步调用一次,其主要作用就是根据内存断点信息表设置内存页属性;内存断点处理函数则是在一个大的异常处理函数中的一部分,OD通过异常事件结构体处理对应的各种异常,下面只提取有关的部分进行分析。

OD中用一个结构体来存储内存断点的信息,且只能下一个内存断点,下第二个断点会将前面的记录覆盖:

第一个4字节 00000000  未知

第二个4字节 00400654  标识内存断点首地址

第三个4字节 00000004  内存断点字节的长度

第四个4字节 00400000  内存断点首地址所在内存页的地址

第五个4字节 00401000  内存断点尾地址所在内存页的地址

第六个4字节 00000001  01-标识内存访问断点 20-标识内存写入断点

第七个4字节 00000000  未知

004D8138  00 00 00 00 33 05 40 00 02 00 00 00 00 00 40 00  ....3 @. .....@.

004D8148  00 10 40 00 01 00 00 00 00 00 00 00              . @. .......

此外还有一个存放内存信息的结构体:

typedef struct t_memory {      // Memory block descriptor

  ulong      base;             // Base address of memory block

  ulong      size;             // Size of block

  ulong      type;             // Service information, TY_xxx

  ulong      owner;            // Address of owner of the memory

  ulong      initaccess;       // Initial read/write access

  ulong      access;           // Actual status and read/write access

  ulong      threadid;         // Block belongs to this thread or 0

  char       sect[SHORTLEN];   // Name of module section

  char       *copy;            // Copy used in CPU window or NULL

  ulong      reserved[8];      // Reserved for plugin compatibility

} t_memory;

首先是添加部分的函数:

1.  内存断点的添加是通过消息来处理的,而且反汇编窗口和数据窗口的消息还不一样,这样就有了两组对应的消息,数据窗口中:访问断点-7Eh、写入断点-7Fh、清除断点-80h;反汇编窗口中:访问断点-23h、写入断点-24h、清除断点-25h;

2.  将Setmembreakpoint函数参数传入,让函数做相应的处理。该函数有三个参数,分别为标识断点属性、首地址以及长度,这里先概括的描述一下这个函数的流程:

  a)  将参数赋值给寄存器,并得到内存断点所在的内存页;

  b)  检查是否在系统内存处、资源内存处、堆栈内存处下断点,若是则弹出警告,并返回-1退出函数;

  c)  将内存断点的信息写入一个结构体中,便于查询;

  d)  写完结构体后检查是否运行状态,如果是则调用函数修改内存页属性,值得一提的这里修改内存页属性的API并不是直接调用,而是用一个指针指向这两个API:VirtualQuery、VirtualProtectEx,在使用前还会检查两个API是否存在;

  e)  最后返回0并退出

这部分为数据窗口中设置内存断点部分的代码:

判断是否为访问断点,并填入相应的参数让Setmembreakpoint函数处理:

00451C29   > \83FF 7>cmp     edi, 7E

00451C2C   .  75 2E  jnz     short 00451C5C

00451C2E   .  8B45 A>mov     eax, dword ptr [ebp-54]   ;  Case 7E of switch 0045115A

00451C31   .  2B45 B>sub     eax, dword ptr [ebp-50]

00451C34   .  50     push    eax                       ; /Arg3

00451C35   .  8B55 B>mov     edx, dword ptr [ebp-50]      ; |

00451C38   .  52     push    edx                       ; |Arg2

00451C39   .  6A 03  push    3                         ; |Arg1 = 00000003

00451C3B   .  E8 987>call    _Setmembreakpoint         ; \_Setmembreakpoint

00451C40   .  83C4 0>add     esp, 0C

00451C43   .  F683 5>test    byte ptr [ebx+25D], 10

00451C4A   .  0F84 2>je      00452C7C

00451C50   .  53     push    ebx                       ; /Arg1

00451C51   .  E8 F6C>call    0044E54C                  ; \Ollydbg.0044E54C

00451C56   .  59     pop     ecx

00451C57   .  E9 201>jmp     00452C7C

判断是否为写入断点,并填入相应的参数让Setmembreakpoint函数处理:

00451C5C   >  83FF 7>cmp     edi, 7F

00451C5F   .  75 2E  jnz     short 00451C8F

00451C61   .  8B4D A>mov     ecx, dword ptr [ebp-54]   ;  Case 7F of switch 0045115A

00451C64   .  2B4D B>sub     ecx, dword ptr [ebp-50]

00451C67   .  51     push    ecx                       ; /Arg3

00451C68   .  8B45 B>mov     eax, dword ptr [ebp-50]   ; |

00451C6B   .  50     push    eax                       ; |Arg2

00451C6C   .  6A 02  push    2                         ; |Arg1 = 00000002

00451C6E   .  E8 657>call    _Setmembreakpoint         ; \_Setmembreakpoint

00451C73   .  83C4 0>add     esp, 0C

00451C76   .  F683 5>test    byte ptr [ebx+25D], 10

00451C7D   .  0F84 F>je      00452C7C

00451C83   .  53     push    ebx                       ; /Arg1

00451C84   .  E8 C3C>call    0044E54C                  ; \Ollydbg.0044E54C

00451C89   .  59     pop     ecx

00451C8A   .  E9 ED0>jmp     00452C7C

判断是否为清除断点,并填入相应的参数让Setmembreakpoint函数处理:

00451C8F   >  81FF 8>cmp     edi, 80

00451C95   .  75 13  jnz     short 00451CAA

00451C97   .  6A 00  push    0                         ; /Arg3 = 00000000;

00451C99   .  6A 00  push    0                         ; |Arg2 = 00000000

00451C9B   .  6A 00  push    0                         ; |Arg1 = 00000000

00451C9D   .  E8 367>call    _Setmembreakpoint         ; \_Setmembreakpoint

00451CA2   .  83C4 0>add     esp, 0C

00451CA5   .  E9 D20>jmp     00452C7C

这部分为反汇编窗口中设置内存断点部分的代码:

判断是否为访问断点,并填入相应的参数让Setmembreakpoint函数处理:

004238D3   > \83FB 23    cmp     ebx, 23

004238D6   .  75 22      jnz     short 004238FA

004238D8   .  8B0D 31DA4>mov     ecx, dword ptr [4CDA31]   ;  Case 23 of switch 00422DD4

004238DE   .  A1 2DDA4C0>mov     eax, dword ptr [4CDA2D]

004238E3   .  2B0D 2DDA4>sub     ecx, dword ptr [4CDA2D]

004238E9   .  51         push    ecx                       ; /Arg3

004238EA   .  50         push    eax                       ; |Arg2 => 00000000

004238EB   .  6A 03      push    3                         ; |Arg1 = 00000003

004238ED   .  E8 E659FFF>call    _Setmembreakpoint         ; \_Setmembreakpoint

004238F2   .  83C4 0C    add     esp, 0C

004238F5   .  E9 E224000>jmp     00425DDC

判断是否为写入断点,并填入相应的参数让Setmembreakpoint函数处理:

004238FA   >  83FB 24    cmp     ebx, 24

004238FD   .  75 23      jnz     short 00423922

004238FF   .  8B15 31DA4>mov     edx, dword ptr [4CDA31]   ;  Case 24 of switch 00422DD4

00423905   .  8B0D 2DDA4>mov     ecx, dword ptr [4CDA2D]

0042390B   .  2B15 2DDA4>sub     edx, dword ptr [4CDA2D]

00423911   .  52         push    edx                       ; /Arg3

00423912   .  51         push    ecx                       ; |Arg2 => 00000000

00423913   .  6A 02      push    2                         ; |Arg1 = 00000002

00423915   .  E8 BE59FFF>call    _Setmembreakpoint         ; \_Setmembreakpoint

0042391A   .  83C4 0C    add     esp, 0C

0042391D   .  E9 BA24000>jmp     00425DDC

判断是否为清除断点,并填入相应的参数让Setmembreakpoint函数处理:

00423922   >  83FB 25    cmp     ebx, 25

00423925   .  75 13      jnz     short 0042393A

00423927   .  6A 00      push    0                         ; /Arg3 = 00000000; Case 25 of switch 00422DD4

00423929   .  6A 00      push    0                         ; |Arg2 = 00000000

0042392B   .  6A 00      push    0                         ; |Arg1 = 00000000

0042392D   .  E8 A659FFF>call    _Setmembreakpoint         ; \_Setmembreakpoint

00423932   .  83C4 0C    add     esp, 0C

00423935   .  E9 A224000>jmp     00425DDC

下面就来详细的分析Setmembreakpoint这个函数:

首先将参数赋值给寄存器,并得到内存断点所在的内存页:

004192D8 >/$  55            push    ebp

004192D9  |.  8BEC          mov     ebp, esp

004192DB  |.  53            push    ebx

004192DC  |.  56            push    esi

004192DD  |.  57            push    edi

004192DE  |.  833D 38814D00>cmp     dword ptr [4D8138], 0

004192E5  |.  8B7D 10       mov     edi, dword ptr [ebp+10]    内存断点长度

004192E8  |.  8B75 0C       mov     esi, dword ptr [ebp+C]    内存断点首地址赋值

004192EB  |.  8B5D 08       mov     ebx, dword ptr [ebp+8]    内存断点标识赋值

004192EE  |.  0F85 99000000 jnz     0041938D

004192F4  |.  833D D8364D00>cmp     dword ptr [4D36D8], 2

004192FB  |.  0F84 8C000000 je      0041938D

00419301  |.  56            push    esi                          ; /Arg1

00419302  |.  E8 41870400   call    _Findmemory                  ; \_Findmemory

00419307  |.  59            pop     ecx

检查是否在系统内存处下断点,并弹出警告:

00419308  |.  81FE 00000080 cmp     esi, 80000000    

0041930E  |.  72 24         jb      short 00419334

00419310  |.  6A 14         push    14

00419312  |.  68 CA224B00   push    004B22CA

00419317  |.  68 2E224B00   push    004B222E

0041931C  |.  A1 7C3B4D00   mov     eax, dword ptr [4D3B7C]      ; |

00419321  |.  50            push    eax

00419322  |.  E8 EF610900   call    <jmp.&USER32.MessageBoxA>    ; \MessageBoxA

00419327  |.  83F8 06       cmp     eax, 6

0041932A  |.  74 61         je      short 0041938D

0041932C  |.  83C8 FF       or      eax, FFFFFFFF

0041932F  |.  E9 EA000000   jmp     0041941E

检查是否在资源内存处下断点,并弹出警告:

00419334  |>  85C0          test    eax, eax

00419336  |.  74 2B         je      short 00419363

00419338  |.  F640 0B 01    test    byte ptr [eax+B], 1

0041933C  |.  74 25         je      short 00419363

0041933E  |.  6A 14         push    14

00419340  |.  68 A1234B00   push    004B23A1

00419345  |.  68 EB224B00   push    004B22EB

0041934A  |.  8B15 7C3B4D00 mov     edx, dword ptr [4D3B7C]      ; |

00419350  |.  52            push    edx

00419351  |.  E8 C0610900   call    <jmp.&USER32.MessageBoxA>    ; \MessageBoxA

00419356  |.  83F8 06       cmp     eax, 6

00419359  |.  74 32         je      short 0041938D

0041935B  |.  83C8 FF       or      eax, FFFFFFFF

0041935E  |.  E9 BB000000   jmp     0041941E

检查是否在堆栈内存处下断点,并弹出警告:

00419363  |>  85C0          test    eax, eax

00419365  |.  74 26         je      short 0041938D

00419367  |.  F640 0B 04    test    byte ptr [eax+B], 4

0041936B  |.  74 20         je      short 0041938D

0041936D  |.  6A 10         push    10

0041936F  |.  68 24244B00   push    004B2424

00419374  |.  68 BF234B00   push    004B23BF

00419379  |.  8B15 7C3B4D00 mov     edx, dword ptr [4D3B7C]      ; |

0041937F  |.  52            push    edx

00419380  |.  E8 91610900   call    <jmp.&USER32.MessageBoxA>    ; \MessageBoxA

00419385  |.  83C8 FF       or      eax, FFFFFFFF

00419388  |.  E9 91000000   jmp     0041941E

函数中该部分主要设置内存属性:

0041938D  |> \E8 92FAFFFF   call    00418E24    该函数主要用于设置内存属性

00419392  |.  85C0          test    eax, eax

00419394  |.  74 08         je      short 0041939E  设置成功就去设置结构体,否则退出

00419396  |.  83C8 FF       or      eax, FFFFFFFF

00419399  |.  E9 80000000   jmp     0041941E

函数中该部分主要用于设置断点结构体:

0041939E  |> \8BC6          mov     eax, esi

004193A0  |.  8BD7          mov     edx, edi

004193A2  |.  A3 3C814D00   mov     dword ptr [4D813C], eax  ;填写结构体第二个字节

004193A7  |.  8BC8          mov     ecx, eax

004193A9  |.  03C2          add     eax, edx

004193AB  |.  81E1 00F0FFFF and     ecx, FFFFF000

004193B1  |.  05 FF0F0000   add     eax, 0FFF

004193B6  |.  8915 40814D00 mov     dword ptr [4D8140], edx    ;填写结构体第三个字节

004193BC  |.  25 00F0FFFF   and     eax, FFFFF000

004193C1  |.  890D 44814D00 mov     dword ptr [4D8144], ecx    ;填写结构体第四个字节

004193C7  |.  F6C7 10       test    bh, 10

004193CA  |.  A3 48814D00   mov     dword ptr [4D8148], eax  ;填写结构体第五个字节

004193CF  |.  0F95C0        setne   al

004193D2  |.  83E0 01       and     eax, 1

004193D5  |.  83E3 03       and     ebx, 3

004193D8  |.  A3 38814D00   mov     dword ptr [4D8138], eax

004193DD  |.  C705 5C8D4D00>mov     dword ptr [4D8D5C], 1

004193E7  |.  85DB          test    ebx, ebx

004193E9  |.  74 04         je      short 004193EF

004193EB  |.  85FF          test    edi, edi

004193ED  |.  75 04         jnz     short 004193F3

004193EF  |>  33C0          xor     eax, eax

004193F1  |.  EB 2B         jmp     short 0041941E

004193F3  |>  83FB 02       cmp     ebx, 2

004193F6  |.  75 0C         jnz     short 00419404

004193F8  |.  C705 4C814D00>mov     dword ptr [4D814C], 20    ;填写结构体第六个字节

00419402  |.  EB 0A         jmp     short 0041940E

00419404  |>  C705 4C814D00>mov     dword ptr [4D814C], 1

设置完内存断点记录后,检查是否是运行状态,如果是则调用函数设置内存页属性:

0041940E  |>  833D 5C5A4D00>cmp     dword ptr [4D5A5C], 3  ;查看是否是运行状态

00419415  |.  75 05         jnz     short 0041941C  ;不是则结束

00419417  |.  E8 18FCFFFF   call    00419034    ;如果是则调用函数修改内存页属性

恢复现场,返回0:

0041941C  |>  33C0          xor     eax, eax  ;返回0

0041941E  |>  5F            pop     edi

0041941F  |.  5E            pop     esi

00419420  |.  5B            pop     ebx

00419421  |.  5D            pop     ebp

00419422  \.  C3            retn

其次是设置部分的函数:

1.  一些参数的检查,错误则返回-1并结束;

2.  检查VirtualQuery、VirtualProtectEx这两个函数是否加载成功,若失败则返回-1并结束;

3.  这里是一个循环体,用于设置内存断点范围内的内存页属性,主要流程如下:

  a)  初始化循环体,得到内存断点所在的第一个内存页地址,并检查其合法性;

  b)  加上内存页最小单位(1000h),检查是否大于等于内存断点的尾地址,若小于则得到其内存断点的范围减去1000h,用于下次判断;

  c)  一些标志、长度的判断以及设置;

  d)  按内存断点的范围设置内存页属性,将内存页原来的属性保存到两个数组中去,并检查是否设置成功,若设置失败则跳出循环体;

  e)  判断判断是否设置完内存断点范围内的所有内存页,并检查是否超出最大内存断点范围(1000h*100h),若超过或者设置完则退出循环,否则跳转到b步骤;

4.  检查设置内存页属性后其地址是否等于内存断点范围首地址,若等于说明一开始就设置失败,删除内存断点表,并给出相应的提示以及弹出窗口;

5.  检查设置内存页属性后其地址是否大于等于内存断点范围尾地址,若小于说明有一部分设置失败,缩小内存断点的范围,并给出相应的提示以及弹出窗口;

该函数我命名为SetMembpoint,主要用于F9运行后内地断点的设置,下面来详细分析:

首先是一些参数的检查,错误则跳转到错误处理处:

00419034  /$  53              push    ebx

00419035  |.  56              push    esi

00419036  |.  57              push    edi

00419037  |.  55              push    ebp

00419038  |.  81C4 E4FDFFFF   add     esp, -21C

0041903E  |.  BD 588D4D00     mov     ebp, 004D8D58

00419043  |.  833D 685A4D00 0>cmp     dword ptr [4D5A68], 0    ; 检查线程句柄

0041904A  |.  74 12           je      short 0041905E

0041904C  |.  833D 40814D00 0>cmp     dword ptr [4D8140], 0    ; 检查断点长度

00419053  |.  74 09           je      short 0041905E

00419055  |.  833D 34814D00 0>cmp     dword ptr [4D8134], 0    ; 检查是否已经检查的标识

0041905C  |.  74 07           je      short 00419065    ; 若正确则跳过下面的错误处理

错误处理,返回-1并跳转到结束处:

0041905E  |>  33C0            xor     eax, eax

00419060  |.  E9 66020000     jmp     004192CB  ; 跳转到结束处

下面检查VirtualQuery、VirtualProtectEx这两个函数是否加载成功:

00419065  |>  833D 145A4D00 0>cmp     dword ptr [4D5A14], 0  ; 检查VirtualQuery

0041906C  |.  74 09           je      short 00419077

0041906E  |.  833D 185A4D00 0>cmp     dword ptr [4D5A18], 0    ; 检查VirtualProtectEx

00419075  |.  75 08           jnz     short 0041907F    ; 若正确则跳过下面的错误处理

错误处理,返回-1并跳转到结束处:

00419077  |>  83C8 FF         or      eax, FFFFFFFF

0041907A  |.  E9 4C020000     jmp     004192CB

通过内存断点所在页的首地址得到其内存相关信息结构体t_memory,检查是否取得成功;并检查该内存断点所在页是否是TY_GUARDED(被保护状态),若是则跳转到最后检查是否比较完处,初始化循环体:

0041907F  |>  33D2            xor     edx, edx

00419081  |.  8955 00         mov     dword ptr [ebp], edx

00419084  |.  A1 44814D00     mov     eax, dword ptr [4D8144]

00419089  |.  8BD8            mov     ebx, eax

0041908B  |.  8125 4C814D00 F>and     dword ptr [4D814C], FFFFFEFF>

00419095  |.  50              push    eax                 ; /Arg1

00419096  |.  E8 AD890400     call    _Findmemory          ; \_Findmemory

0041909B  |.  59              pop     ecx

0041909C  |.  85C0            test    eax, eax    ;检查是否取得成功

0041909E  |.  0F84 25010000   je      004191C9

004190A4  |.  F640 0B 20      test    byte ptr [eax+B], 20  ; 检查是否为TY_GUARDED

004190A8  |.  0F84 1B010000   je      004191C9

004190AE  |.  810D 4C814D00 0>or      dword ptr [4D814C], 100  ; 将写入标志与0x100或

004190B8  |.  E9 0C010000     jmp     004191C9

首先取得内存断点所在的首内存页的内存属性:

004190BD  |>  6A 1C           /push    1C

004190BF  |.  8D8424 04020000 |lea     eax, dword ptr [esp+204]

004190C6  |.  50              |push    eax

004190C7  |.  53              |push    ebx

004190C8  |.  8B15 685A4D00   |mov     edx, dword ptr [4D5A68]

004190CE  |.  52              |push    edx

004190CF  |.  FF15 145A4D00   |call    dword ptr [4D5A14]        ;  kernel32.VirtualQueryEx

加上内存页最小单位(1000h),检查是否已经包含了内存断点的范围:

004190D5  |.  8B9424 0C020000 |mov     edx, dword ptr [esp+20C]

004190DC  |.  8BCA            |mov     ecx, edx

004190DE  |.  03CB            |add     ecx, ebx    ; ecx :BP_Begin_Page + 1000

004190E0  |.  A1 48814D00     |mov     eax, dword ptr [4D8148]  ; eax :BreakPoint_End_Page

004190E5  |.  3BC8            |cmp     ecx, eax    ; 检查是否包含内存断点的范围

004190E7  |.  73 04           |jnb     short 004190ED  ; 不包含则跳到下面处理代码

004190E9  |.  8BF2            |mov     esi, edx    ; esi :内存对齐最小单位

004190EB  |.  EB 04           |jmp     short 004190F1 ; 跳过处理代码

若没有完全包含,则得到其内存断点的范围:

004190ED  |>  8BF0            |mov     esi, eax

004190EF  |.  2BF3            |sub     esi, ebx

下面是一些标志位的比较以及设置:

004190F1  |>  833D 38814D00 0>|cmp     dword ptr [4D8138], 0

004190F8  |.  74 1B           |je      short 00419115

004190FA  |.  3B1D 50814D00   |cmp     ebx, dword ptr [4D8150]

00419100  |.  73 13           |jnb     short 00419115

00419102  |.  8D041E          |lea     eax, dword ptr [esi+ebx]

00419105  |.  3B05 50814D00   |cmp     eax, dword ptr [4D8150]

0041910B  |.  76 08           |jbe     short 00419115

0041910D  |.  8B35 50814D00   |mov     esi, dword ptr [4D8150]

00419113  |.  2BF3            |sub     esi, ebx

00419115  |>  833D 38814D00 0>|cmp     dword ptr [4D8138], 0

0041911C  |.  74 1B           |je      short 00419139

0041911E  |.  3B1D 54814D00   |cmp     ebx, dword ptr [4D8154]

00419124  |.  73 13           |jnb     short 00419139

00419126  |.  8D041E          |lea     eax, dword ptr [esi+ebx]

00419129  |.  3B05 54814D00   |cmp     eax, dword ptr [4D8154]

0041912F  |.  76 08           |jbe     short 00419139

00419131  |.  8B35 54814D00   |mov     esi, dword ptr [4D8154]

00419137  |.  2BF3            |sub     esi, ebx

00419139  |>  833D 38814D00 0>|cmp     dword ptr [4D8138], 0

00419140  |.  74 2A           |je      short 0041916C

00419142  |.  3B1D 50814D00   |cmp     ebx, dword ptr [4D8150]

00419148  |.  75 22           |jnz     short 0041916C

0041914A  |.  BE 00100000     |mov     esi, 1000

0041914F  |.  8B55 00         |mov     edx, dword ptr [ebp]

00419152  |.  8B8424 14020000 |mov     eax, dword ptr [esp+214]

00419159  |.  890495 58814D00 |mov     dword ptr [edx*4+4D8158],>

00419160  |.  8B4D 00         |mov     ecx, dword ptr [ebp]

00419163  |.  89048D 58854D00 |mov     dword ptr [ecx*4+4D8558],>

0041916A  |.  EB 4E           |jmp     short 004191BA

0041916C  |>  833D 38814D00 0>|cmp     dword ptr [4D8138], 0

00419173  |.  74 14           |je      short 00419189

00419175  |.  3B1D 54814D00   |cmp     ebx, dword ptr [4D8154]

0041917B  |.  75 0C           |jnz     short 00419189

0041917D  |.  BE 00100000     |mov     esi, 1000

00419182  |.  BF 02000000     |mov     edi, 2

00419187  |.  EB 06           |jmp     short 0041918F

根据内存断点表设置内存页属性,并检查是否设置成功:

00419189  |>  8B3D 4C814D00   |mov     edi, dword ptr [4D814C]

0041918F  |>  8B45 00         |mov     eax, dword ptr [ebp]

00419192  |.  8B15 685A4D00   |mov     edx, dword ptr [4D5A68]

00419198  |.  C1E0 02         |shl     eax, 2

0041919B  |.  81C0 58814D00   |add     eax, 004D8158

004191A1  |.  50              |push    eax

004191A2  |.  57              |push    edi

004191A3  |.  56              |push    esi

004191A4  |.  53              |push    ebx

004191A5  |.  52              |push    edx

004191A6  |.  FF15 185A4D00   |call    dword ptr [4D5A18]        ;  kernel32.VirtualProtectEx

004191AC  |.  85C0            |test    eax, eax    ;检查是否设置成功

004191AE  |.  74 2E           |je      short 004191DE  ;设置失败跳到错误处理处

将内存页原属性放到全局变量数组中去,并将计数器加一:

004191B0  |.  8B4D 00         |mov     ecx, dword ptr [ebp]

004191B3  |.  893C8D 58854D00 |mov     dword ptr [ecx*4+4D8558],>

004191BA  |>  8B45 00         |mov     eax, dword ptr [ebp]

004191BD  |.  893485 58894D00 |mov     dword ptr [eax*4+4D8958],>

004191C4  |.  03DE            |add     ebx, esi

004191C6  |.  FF45 00         |inc     dword ptr [ebp]

循环体条件检查部分,设定了内存断点的最大范围是1000h*100h,若超过了则不再设置内存断点;另外检查是否已经设置完内存断点范围内的所有内存页,若没有设置完继续设置:

004191C9  |>  817D 00 0001000> cmp     dword ptr [ebp], 100  ;检查内存断点是否超过最大范围

004191D0  |.  7D 0C           |jge     short 004191DE

004191D2  |.  3B1D 48814D00   |cmp     ebx, dword ptr [4D8148] ; 检查是否设置完内存属性

004191D8  |.^ 0F82 DFFEFFFF   \jb      004190BD    ; 若没有设置完则继续

检查设置内存页属性结构体的循环体结束后,其地址是否等于内存断点范围的首内存页地址,若不等于则跳过下面的错误处理:

004191DE  |>  3B1D 44814D00   cmp     ebx, dword ptr [4D8144]    ; 

004191E4  |.  75 64           jnz     short 0041924A

这里为设置内存断点失败的处理处,得到内存无法设置的范围,并给出错误提示和弹出窗口:

004191E6  |.  8D9424 00010000 lea     edx, dword ptr [esp+100]

004191ED  |.  52              push    edx                        ; /Arg3

004191EE  |.  8B0D 40814D00   mov     ecx, dword ptr [4D8140]    ; |

004191F4  |.  51              push    ecx                        ; |Arg2 => 00000002

004191F5  |.  A1 3C814D00     mov     eax, dword ptr [4D813C]    ; |

004191FA  |.  50              push    eax                        ; |Arg1 => 00400533

004191FB  |.  E8 E04D0400     call    _Decoderange               ; \_Decoderange

00419200  |.  83C4 0C         add     esp, 0C

00419203  |.  8D9424 00010000 lea     edx, dword ptr [esp+100]

0041920A  |.  52              push    edx                        ; /Arg3

0041920B  |.  68 FA204B00     push    004B20FA       ; |ollydbg 在地址范围 %s 中无法激活内存断点。断点已经被完全删除。

00419210  |.  8D4C24 08       lea     ecx, dword ptr [esp+8]     ; |

00419214  |.  51              push    ecx                        ; |Arg1

00419215  |.  E8 12DA0800     call    004A6C2C                   ; \_sprintf

0041921A  |.  83C4 0C         add     esp, 0C

0041921D  |.  6A 10           push    10                         ; /Style = MB_OK

0041921F  |.  68 61214B00     push    004B2161                 ; |无法激活内存中的断点

00419224  |.  8D4424 08       lea     eax, dword ptr [esp+8]     ; |

00419228  |.  50              push    eax                        ; |Text

00419229  |.  8B15 7C3B4D00   mov     edx, dword ptr [4D3B7C]    ; |

0041922F  |.  52              push    edx                        ; |hOwner

00419230  |.  E8 E1620900     call    <jmp.&USER32.MessageBoxA>  ; \MessageBoxA

将内存页属性还原回来,将内存断点长度设置为0,返回-1并退出:

00419235  |.  E8 EAFBFFFF     call    00418E24

0041923A  |.  33C9            xor     ecx, ecx

0041923C  |.  83C8 FF         or      eax, FFFFFFFF

0041923F  |.  890D 40814D00   mov     dword ptr [4D8140], ecx

00419245  |.  E9 81000000     jmp     004192CB

检查设置内存页属性结构体的循环体结束后,其地址是否大于等于内存断点范围的尾内存页地址,若大于则跳过下面的错误处理:

0041924A  |>  3B1D 48814D00   cmp     ebx, dword ptr [4D8148]    ;  Ollydbg.<模块入口点>

00419250  |.  73 6D           jnb     short 004192BF

这里为设置内存断点范围尾部设置失败的错误处理处,设置相应的错误提示和弹出窗口:

00419252  |.  8D9424 00010000 lea     edx, dword ptr [esp+100]

00419259  |.  52              push    edx                        ; /Arg3

0041925A  |.  8B0D 40814D00   mov     ecx, dword ptr [4D8140]    ; |

00419260  |.  51              push    ecx                        ; |Arg2 => 00000002

00419261  |.  A1 3C814D00     mov     eax, dword ptr [4D813C]    ; |

00419266  |.  50              push    eax                        ; |Arg1 => 00400533

00419267  |.  E8 744D0400     call    _Decoderange               ; \_Decoderange

0041926C  |.  83C4 0C         add     esp, 0C

0041926F  |.  8BD3            mov     edx, ebx

00419271  |.  4A              dec     edx

00419272  |.  52              push    edx                        ; /Arg5

00419273  |.  8B0D 3C814D00   mov     ecx, dword ptr [4D813C]    ; |Ollydbg.00400533

00419279  |.  51              push    ecx                        ; |Arg4 => 00400533

0041927A  |.  8D8424 08010000 lea     eax, dword ptr [esp+108]   ; |

00419281  |.  50              push    eax                        ; |Arg3

00419282  |.  68 86214B00     push    004B2186                   ; |ollydbg 在全部指定的地址范围(%s)中无法激活内存断点。断点已经减少范围为 %08lx..%08lx.

00419287  |.  8D5424 10       lea     edx, dword ptr [esp+10]    ; |

0041928B  |.  52              push    edx                        ; |Arg1

0041928C  |.  E8 9BD90800     call    004A6C2C                   ; \_sprintf

00419291  |.  83C4 14         add     esp, 14

00419294  |.  6A 10           push    10                      ; /Style = MB_OK

00419296  |.  68 0E224B00     push    004B220E                 ; |内存断点的范围被减少

0041929B  |.  8D4C24 08       lea     ecx, dword ptr [esp+8]     ; |

0041929F  |.  51              push    ecx                        ; |Text

004192A0  |.  A1 7C3B4D00     mov     eax, dword ptr [4D3B7C]    ; |

004192A5  |.  50              push    eax                        ; |hOwner

004192A6  |.  E8 6B620900     call    <jmp.&USER32.MessageBoxA>  ; \MessageBoxA

将内存断点的范围缩小为设置失败前已经成功设置的内存页范围:

004192AB  |.  8BD3            mov     edx, ebx

004192AD  |.  2B15 3C814D00   sub     edx, dword ptr [4D813C]    ; Ollydbg.00400533

004192B3  |.  8915 40814D00   mov     dword ptr [4D8140], edx

004192B9  |.  891D 48814D00   mov     dword ptr [4D8148], ebx

设置检查标识为1,标识已经检查完毕,然后返回0并退出:

004192BF  |>  C705 34814D00 0>mov     dword ptr [4D8134], 1

004192C9  |.  33C0            xor     eax, eax

004192CB  |>  81C4 1C020000   add     esp, 21C

004192D1  |.  5D              pop     ebp

004192D2  |.  5F              pop     edi

004192D3  |.  5E              pop     esi

004192D4  |.  5B              pop     ebx

004192D5  \.  C3              retn

  评论这张
 
阅读(612)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017