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

古城风~~~

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

 
 
 

日志

 
 

OllyDBG分析报告系列(2)---内存断点(下追加)  

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

  下载LOFTER 我的照片书  |

最后是内存断点的处理,该部分用WaitForDebugEvent函数捕获了内存断点异常,然后对内存断点进行检查以及OD界面进行相关设置,由于之后没有用ContinueDebugEvent函数,被调试程序被断在了该异常处:
1.  得到线程信息结构体,将结构体指针赋值给局部变量;
2.  根据异常信息结构体中的异常事件标识,跳转到相应的异常的处理分支处;
3.  给异常地址变量赋值,若得到线程信息,则根据线程信息的eip赋值,否则根据异常地址赋值,并且将异常地址赋值给几个全局变量;
4.  得到异常所在的模块信息,提取异常所在处的汇编代码,并检查模块信息是否正确,汇编代码有没有获得,根据情况做相应的错误处理;
5.  若是模块为自解压(SFX)模式,则进行相应的检查以及错误处理;
6.  检查内存断点是否在kernel32.dll中,弹出提示窗口,并将断点去除;
7.  最后调整优先级并退出


这里是所有异常的处理函数,除了内存断点相关的代码,其他都会被省略:
首先保存环境,拉伸栈空间:
0042EBD0  /$  55         push    ebp
0042EBD1  |.  8BEC       mov     ebp, esp
0042EBD3  |.  81C4 04F0F>add     esp, -0FFC
0042EBD9  |.  50         push    eax
0042EBDA  |.  81C4 00F5F>add     esp, -0B00
得到调试线程的线程信息结构体,该函数在《OD获得当前cpu工作状态的方法》中已详细分析:
0042EBE0  |.  53         push    ebx
0042EBE1  |.  56         push    esi
0042EBE2  |.  57         push    edi
0042EBE3  |.  8B35 1C574>mov     esi, dword ptr [4D571C]  ; DebugEvent.dwThreadId
0042EBE9  |.  56         push    esi
0042EBEA  |.  E8 5DF8FFF>call    0042E44C      ; GetThreadInfo
将得到的寄存器结构体指针赋值给参数:
0042EBEF  |.  8BF8       mov     edi, eax
0042EBF1  |.  8B45 08    mov     eax, dword ptr [ebp+8]
0042EBF4  |.  59         pop     ecx
0042EBF5  |.  8938       mov     dword ptr [eax], edi  ; [ebp+8] = pReg
根据异常事件标识标识跳转到相应的处理函数:
0042EBF7  |.  8B15 14574>mov     edx, dword ptr [4D5714] ; DebugEvent.dwDebugEventCode
0042EBFD  |.  83FA 09    cmp     edx, 9                     ;  Switch (cases 1..9)
0042EC00  |.  0F87 EE270>ja      004313F4
0042EC06  |.  FF2495 0DE>jmp     dword ptr [edx*4+42EC0D]
调试异常的跳表:
0042EC0D  |.  F4134300   dd      Ollydbg.004313F4    ; Default
0042EC11  |.  35EC4200   dd      Ollydbg.0042EC35    ; EXCEPTION_DEBUG_EVENT
0042EC15  |.  FF0C4300   dd      Ollydbg.00430CFF    ; CREATE_THREAD_DEBUG_EVENT
0042EC19  |.  D70D4300   dd      Ollydbg.00430DD7  ; CREATE_PROCESS_DEBUG_EVENT
0042EC1D  |.  3F0F4300   dd      Ollydbg.00430F3F    ; EXIT_THREAD_DEBUG_EVENT
0042EC21  |.  37104300   dd      Ollydbg.00431037    ; EXIT_PROCESS_DEBUG_EVENT
0042EC25  |.  2D114300   dd      Ollydbg.0043112D   ; LOAD_DLL_DEBUG_EVENT
0042EC29  |.  B7114300   dd      Ollydbg.004311B7    ; UNLOAD_DLL_DEBUG_EVENT
0042EC2D  |.  76124300   dd      Ollydbg.00431276    ; OUTPUT_DEBUG_STRING_EVENT
0042EC31  |.  C7134300   dd      Ollydbg.004313C7    ; RIP_EVENT
这里为调试异常处理处,给异常标识赋值,并将异常结构体指针赋值给局部变量:
0042EC35  |>  8B0D 0C364>mov     ecx, dword ptr [4E360C] ; 
0042EC3B  |.  33C0       xor     eax, eax
0042EC3D  |.  894D EC    mov     dword ptr [ebp-14], ecx
0042EC40  |.  A3 0C364E0>mov     dword ptr [4E360C], eax
0042EC45  |.  C745 A4 20>mov     dword ptr [ebp-5C], 004D5720  ; DebugEvent.u
检查异常信息结构体中寄存器结构体是否得到,若得到则跳过下面取寄存器信息:
0042EC4C  |.  85FF       test    edi, edi
0042EC4E  |.  75 0D      jnz     short 0042EC5D
若没有得到了寄存器信息,则将异常信息中异常地址赋值给参数:
0042EC50  |.  8B55 A4    mov     edx, dword ptr [ebp-5C]  
0042EC53  |.  33DB       xor     ebx, ebx
0042EC55  |.  8B4A 0C    mov     ecx, dword ptr [edx+C]
0042EC58  |.  894D D8    mov     dword ptr [ebp-28], ecx  ; 参数赋值为ExceptionAddress
0042EC5B  |.  EB 22      jmp     short 0042EC7F
若得到了寄存器信息,则将寄存器中的EIP地址赋值给参数,检查异常标识,若不为0则修改寄存器里面的标识,并设置寄存器已被修改:
0042EC5D  |>  8B47 2C    mov     eax, dword ptr [edi+2C]
0042EC60  |.  8945 D8    mov     dword ptr [ebp-28], eax  ; 参数赋值为t_reg.r_eip
0042EC63  |.  837D EC 00 cmp     dword ptr [ebp-14], 0    ; 检查异常标识
0042EC67  |.  8B5F 10    mov     ebx, dword ptr [edi+10]    ; ebx : t_reg.r_ecx
0042EC6A  |.  74 13      je      short 0042EC7F      ; 若标识为0则跳过下面的操作
0042EC6C  |.  F647 31 01 test    byte ptr [edi+31], 1
0042EC70  |.  74 0D      je      short 0042EC7F
0042EC72  |.  8167 30 FF>and     dword ptr [edi+30], FFFFFE>  ; 修改标识
0042EC79  |.  C707 01000>mov     dword ptr [edi], 1    ; 设置寄存器修改标识
检查是否是单步异常,若是则跳过下面的代码,若不是则跳转到下面继续判断是什么异常:
0042EC7F  |>  8B45 A4    mov     eax, dword ptr [ebp-5C]
0042EC82  |.  8138 03000>cmp     dword ptr [eax], 80000003
0042EC88  |.  74 07      je      short 0042EC91
0042EC8A  |.  33D2       xor     edx, edx
0042EC8C  |.  8955 DC    mov     dword ptr [ebp-24], edx
0042EC8F  |.  EB 79      jmp     short 0042ED0A
跳过对单步的分析,不是重点。。。:
0042EC91  |>  6A 02      push    2                          ; /Arg4 = 00000002
0042EC93  |.  6A 01      push    1                          ; |Arg3 = 00000001
0042EC95  |.  8B4D D8    mov     ecx, dword ptr [ebp-28]    ; |
0042EC98  |.  49         dec     ecx                        ; |
0042EC99  |.  51         push    ecx                        ; |Arg2
0042EC9A  |.  8D45 BB    lea     eax, dword ptr [ebp-45]    ; |
0042EC9D  |.  50         push    eax                        ; |Arg1
0042EC9E  |.  E8 6926030>call    _Readmemory                ; \_Readmemory
0042ECA3  |.  83C4 10    add     esp, 10
0042ECA6  |.  83F8 01    cmp     eax, 1
0042ECA9  |.  74 07      je      short 0042ECB2
0042ECAB  |.  33D2       xor     edx, edx
0042ECAD  |.  8955 DC    mov     dword ptr [ebp-24], edx
0042ECB0  |.  EB 58      jmp     short 0042ED0A
0042ECB2  |>  33C0       xor     eax, eax
0042ECB4  |.  8A45 BB    mov     al, byte ptr [ebp-45]
0042ECB7  |.  3D CC00000>cmp     eax, 0CC
0042ECBC  |.  75 09      jnz     short 0042ECC7
0042ECBE  |.  C745 DC 01>mov     dword ptr [ebp-24], 1
0042ECC5  |.  EB 43      jmp     short 0042ED0A
0042ECC7  |>  83F8 03    cmp     eax, 3
0042ECCA  |.  74 07      je      short 0042ECD3
0042ECCC  |.  33D2       xor     edx, edx
0042ECCE  |.  8955 DC    mov     dword ptr [ebp-24], edx
0042ECD1  |.  EB 37      jmp     short 0042ED0A
0042ECD3  |>  6A 02      push    2                          ; /Arg4 = 00000002
0042ECD5  |.  6A 01      push    1                          ; |Arg3 = 00000001
0042ECD7  |.  8B4D D8    mov     ecx, dword ptr [ebp-28]    ; |
0042ECDA  |.  83E9 02    sub     ecx, 2                     ; |
0042ECDD  |.  51         push    ecx                        ; |Arg2
0042ECDE  |.  8D45 BB    lea     eax, dword ptr [ebp-45]    ; |
0042ECE1  |.  50         push    eax                        ; |Arg1
0042ECE2  |.  E8 2526030>call    _Readmemory                ; \_Readmemory
0042ECE7  |.  83C4 10    add     esp, 10
0042ECEA  |.  83F8 01    cmp     eax, 1
0042ECED  |.  75 0D      jnz     short 0042ECFC
0042ECEF  |.  33D2       xor     edx, edx
0042ECF1  |.  8A55 BB    mov     dl, byte ptr [ebp-45]
0042ECF4  |.  81FA CD000>cmp     edx, 0CD
0042ECFA  |.  74 07      je      short 0042ED03
0042ECFC  |>  33C9       xor     ecx, ecx
0042ECFE  |.  894D DC    mov     dword ptr [ebp-24], ecx
0042ED01  |.  EB 07      jmp     short 0042ED0A
0042ED03  |>  C745 DC 02>mov     dword ptr [ebp-24], 2
检查参数中的值是eip还是exceptionaddr,若是eip则跳过对几个全局变量的赋值:
0042ED0A  |>  8B45 DC    mov     eax, dword ptr [ebp-24]
0042ED0D  |.  2945 D8    sub     dword ptr [ebp-28], eax
0042ED10  |.  8B15 08574>mov     edx, dword ptr [4D5708]    ; edx = reg_eip
0042ED16  |.  3B55 D8    cmp     edx, dword ptr [ebp-28]
0042ED19  |.  75 08      jnz     short 0042ED23      ; 参数为exceptionaddr时跳转
0042ED1B  |.  3B1D 0C574>cmp     ebx, dword ptr [4D570C]  ; 检查ecx = reg_ecx?
0042ED21  |.  74 16      je      short 0042ED39    ; 参数为eip时跳转
对全局变量赋值:
0042ED23  |>  33C9       xor     ecx, ecx
0042ED25  |.  8B45 D8    mov     eax, dword ptr [ebp-28]
0042ED28  |.  890D 10574>mov     dword ptr [4D5710], ecx
0042ED2E  |.  A3 08574D0>mov     dword ptr [4D5708], eax  ; reg_eip
0042ED33  |.  891D 0C574>mov     dword ptr [4D570C], ebx  ; reg_ecx
检查到底是什么异常,并做相应的跳转,我们主要处理的是内存断点,其他略过,即是这里的访问异常EXCEPTION_ACCESS_VIOLATION:
0042ED39  |>  8B55 A4    mov     edx, dword ptr [ebp-5C]
0042ED3C  |.  8B0A       mov     ecx, dword ptr [edx]
0042ED3E  |.  81F9 8F000>cmp     ecx, C000008F          ; EXCEPTION_FLT_INEXACT_RESULT
0042ED44  |.  7F 69      jg      short 0042EDAF
0042ED46  |.  0F84 3F1A0>je      0043078B
0042ED4C  |.  81F9 1D000>cmp     ecx, C000001D    ; EXCEPTION_ILLEGAL_INSTRUCTION
0042ED52  |.  7F 33      jg      short 0042ED87
0042ED54  |.  0F84 D01D0>je      00430B2A
0042ED5A  |.  81E9 01000>sub     ecx, 80000001  ; EXCEPTION_GUARD_PAGE
0042ED60  |.  0F84 1A180>je      00430580
0042ED66  |.  83E9 02    sub     ecx, 2      ; EXCEPTION_BREAKPOINT
0042ED69  |.  0F84 95000>je      0042EE04
0042ED6F  |.  49         dec     ecx        ; EXCEPTION_SINGLE_STEP
0042ED70  |.  0F84 F70E0>je      0042FC6D
0042ED76  |.  81E9 01000>sub     ecx, 40000001    ; EXCEPTION_ACCESS_VIOLATION
0042ED7C  |.  0F84 12120>je      0042FF94
0042ED82  |.  E9 CD1E000>jmp     00430C54
下面有对上面提到的几个异常的处理,这里先略过。。。:
……
……
查找异常所在的模块,并得到其模块信息:
0042FF94  |>  8B45 D8    mov     eax, dword ptr [ebp-28]
0042FF97  |.  50         push    eax                        ; /Arg1
0042FF98  |.  E8 7BDE020>call    _Findmodule                ; \_Findmodule
0042FF9D  |.  59         pop     ecx
0042FF9E  |.  8945 AC    mov     dword ptr [ebp-54], eax     ; 模块首地址赋值给一个局部变量
通过比较模块中的各种信息判断内存断点是否正常,若不正常跳转到错误处理处:
0042FFA1  |.  8B45 A4    mov     eax, dword ptr [ebp-5C]
0042FFA4  |.  8B55 A4    mov     edx, dword ptr [ebp-5C]
0042FFA7  |.  8378 10 02 cmp     dword ptr [eax+10], 2    ; ExceptionFlags > 2 ?
0042FFAB  |.  8B7A 18    mov     edi, dword ptr [edx+18]
0042FFAE  |.  0F82 65040>jb      00430419
0042FFB4  |.  833D 40814>cmp   dword ptr [4D8140], 0  ; 内存断点的长度是否为0
0042FFBB  |.  0F84 58040>je      00430419
0042FFC1  |.  833D 00574>cmp     dword ptr [4D5700], 0
0042FFC8  |.  0F84 4B040>je      00430419
0042FFCE  |.  3B3D 44814>cmp     edi, dword ptr [4D8144]  ;异常地址 < 断点内存页首地址?
0042FFD4  |.  0F82 3F040>jb      00430419
0042FFDA  |.  3B3D 48814>cmp     edi, dword ptr [4D8148]  ;异常地址 > 断点内存页尾地址?
0042FFE0  |.  0F83 33040>jnb     00430419
读取异常部分的机器码10h字节,由于OpCode不会超过16个字节,所以一定够用了:
0042FFE6  |.  830D 74574>or      dword ptr [4D5774], 20
0042FFED  |.  8D95 98FDF>lea     edx, dword ptr [ebp-268]
0042FFF3  |.  52         push    edx                        ; /Arg2
0042FFF4  |.  830D 10574>or      dword ptr [4D5710], 2         ; |
0042FFFB  |.  8B4D D8    mov     ecx, dword ptr [ebp-28]       ; |
0042FFFE  |.  51         push    ecx                        ; |Arg1
0042FFFF  |.  E8 8016030>call    _Readcommand               ; \_Readcommand
00430004  |.  83C4 08    add     esp, 8
检查读取的机器码长度,若为小于等于0则跳转到错误处理:
00430007  |.  8945 C8    mov     dword ptr [ebp-38], eax
0043000A  |.  837D C8 00 cmp     dword ptr [ebp-38], 0
0043000E  |.  76 28      jbe     short 00430038
将内存异常的机器码反汇编,并将汇编代码的机器码长度给一个局部变量:
00430010  |.  56         push    esi                        ; /Arg7 threadid
00430011  |.  6A 05      push    5                         ; |Arg6 = 00000005 DISASM_ALL
00430013  |.  8D85 80E5F>lea     eax, dword ptr [ebp-1A80]      ; |
00430019  |.  50         push    eax                        ; |Arg5 pt_Disasm结构体
0043001A  |.  6A 00      push    0                          ; |Arg4 = 00000000
0043001C  |.  8B55 D8    mov     edx, dword ptr [ebp-28]       ; |
0043001F  |.  52         push    edx                        ; |Arg3 addr of command
00430020  |.  8B4D C8    mov     ecx, dword ptr [ebp-38]       ; |
00430023  |.  51         push    ecx                        ; |Arg2
00430024  |.  8D85 98FDF>lea     eax, dword ptr [ebp-268]       ; |
0043002A  |.  50         push    eax                        ; |Arg1
0043002B  |.  E8 185FFEF>call    _Disasm                      ; \_Disasm
00430030  |.  83C4 1C    add     esp, 1C
00430033  |.  8945 F4    mov     dword ptr [ebp-C], eax  ; 将长度给局部变量
00430036  |.  EB 05      jmp     short 0043003D  ;跳过错误处理
读取机器码失败的错误处理,设置读取长度为0:
00430038  |>  33D2       xor     edx, edx
0043003A  |.  8955 F4    mov     dword ptr [ebp-C], edx
检查读取长度,若小于等于0,则跳转到错误处理:
0043003D  |>  837D F4 00 cmp     dword ptr [ebp-C], 0
00430041  |.  0F8E 9A010>jle     004301E1
将异常地址加上其汇编代码长度,比较其地址是否低于等于异常地址,若是则跳到异常处理:
00430047  |.  8B4D D8    mov     ecx, dword ptr [ebp-28]
0043004A  |.  034D F4    add     ecx, dword ptr [ebp-C]
0043004D  |.  3B0D 3C814>cmp     ecx, dword ptr [4D813C]    ;  Ollydbg.0040100C
00430053  |.  0F86 88010>jbe     004301E1
将内存断点地址加断点范围,比较其地址是否小于等于异常地址,若是则跳到异常处理:
00430059  |.  A1 3C814D0>mov     eax, dword ptr [4D813C]
0043005E  |.  0305 40814>add     eax, dword ptr [4D8140]
00430064  |.  3B45 D8    cmp     eax, dword ptr [ebp-28]
00430067  |.  0F86 74010>jbe     004301E1
继续检查标志,并跳转到相应的处理函数处:
0043006D  |.  833D 38814>cmp     dword ptr [4D8138], 0
00430074  |.  0F84 43010>je      004301BD
0043007A  |.  833D 688D4>cmp     dword ptr [4D8D68], 0
00430081  |.  74 78      je      short 004300FB
检查模块信息是否存在,并检查模块信息中的值是否正确,若入口在代码段的外面则要求:
00430083  |.  837D AC 00 cmp     dword ptr [ebp-54], 0    ; 检查模块信息是否存在
00430087  |.  74 72      je      short 004300FB
00430089  |.  8B55 AC    mov     edx, dword ptr [ebp-54]  ; [ebp-54]为模块信息结构体首地址
0043008C  |.  8B45 AC    mov     eax, dword ptr [ebp-54]
0043008F  |.  8B8A E1030>mov     ecx, dword ptr [edx+3E1]
00430095  |.  3B48 0C    cmp     ecx, dword ptr [eax+C]  ; 入口点是否在代码段前面
00430098  |.  72 61      jb      short 004300FB
0043009A  |.  8B55 AC    mov     edx, dword ptr [ebp-54]
0043009D  |.  8B45 AC    mov     eax, dword ptr [ebp-54]
004300A0  |.  8B4A 0C    mov     ecx, dword ptr [edx+C]
004300A3  |.  8B55 AC    mov     edx, dword ptr [ebp-54]
004300A6  |.  0388 E9030>add     ecx, dword ptr [eax+3E9]
004300AC  |.  3B8A E1030>cmp     ecx, dword ptr [edx+3E1] ; 入口点是否在代码段后面
004300B2  |.  76 47      jbe     short 004300FB
004300B4  |.  8B4D AC    mov     ecx, dword ptr [ebp-54]
004300B7  |.  8B81 E1030>mov     eax, dword ptr [ecx+3E1]
004300BD  |.  3B45 D8    cmp     eax, dword ptr [ebp-28]  ;入口点与内存断点地址是否相同
004300C0  |.  74 0A      je      short 004300CC
004300C2  |.  B8 0200000>mov     eax, 2      ; 返回2
004300C7  |.  E9 5913000>jmp     00431425    ; 跳转到结束处
设置OD的CPU显示信息,以及相关的提示信息,跳过错误处理:
004300CC  |>  68 0D80000>push    800D                       ; /Arg5 = 0000800D
004300D1  |.  6A 00      push    0                          ; |Arg4 = 00000000
004300D3  |.  6A 00      push    0                          ; |Arg3 = 00000000
004300D5  |.  8B55 D8    mov     edx, dword ptr [ebp-28]       ; |
004300D8  |.  52         push    edx                        ; |Arg2
004300D9  |.  6A 00      push    0                          ; |Arg1 = 00000000
004300DB  |.  E8 38D5FFF>call    _Setcpu                      ; \_Setcpu
004300E0  |.  83C4 14    add     esp, 14
004300E3  |.  E8 E4E4FEF>call    _Redrawdisassembler
004300E8  |.  68 F7614B0>push    004B61F7             ; /自解压(sfx)代码理论上的入口点
004300ED  |.  8B4D D8    mov     ecx, dword ptr [ebp-28]    ; |
004300F0  |.  51         push    ecx                        ; |Arg1
004300F1  |.  E8 0AE0FFF>call    0042E100                   ; \SetInfoMsg
004300F6  |.  83C4 08    add     esp, 8
004300F9  |.  EB 34      jmp     short 0043012F
错误处理,检查一些参数,返回2并退出:
004300FB  |>  8B9D 84EBF>mov     ebx, dword ptr [ebp-147C]
00430101  |.  81E3 F0000>and     ebx, 0F0
00430107  |.  81FB 80000>cmp     ebx, 80
0043010D  |.  74 05      je      short 00430114
0043010F  |.  83FB 50    cmp     ebx, 50
00430112  |.  75 0A      jnz     short 0043011E
00430114  |>  B8 0200000>mov     eax, 2    ; 返回2
00430119  |.  E9 0713000>jmp     00431425  ; 跳转到结束处
设置提示信息,并根据清除内存断点表的信息,最后检查是否清除成功,否则跳转到错误处理:
0043011E  |>  68 17624B0>push    004B6217              ; /自解压(sfx)代码可能的入口点
00430123  |.  8B55 D8    mov     edx, dword ptr [ebp-28]    ; |
00430126  |.  52         push    edx                        ; |Arg1
00430127  |.  E8 D4DFFFF>call    0042E100                   ; \ SetInfoMsg
0043012C  |.  83C4 08    add     esp, 8
0043012F  |>  6A 00      push    0                          ; /Arg3 = 00000000
00430131  |.  6A 00      push    0                          ; |Arg2 = 00000000
00430133  |.  6A 00      push    0                          ; |Arg1 = 00000000
00430135  |.  E8 9E91FEF>call    _Setmembreakpoint          ; \_Setmembreakpoint
0043013A  |.  83C4 0C    add     esp, 0C
0043013D  |.  837D AC 00 cmp     dword ptr [ebp-54], 0
00430141  |.  74 71      je      short 004301B4
写UDD文件,判断模块信息结构体中的SFX代码的入口点是否存在,若不存在则将内存断点的首地址赋值给他:
00430143  |.  8B4D AC    mov     ecx, dword ptr [ebp-54]
00430146  |.  8B01       mov     eax, dword ptr [ecx]
00430148  |.  3B05 64734>cmp     eax, dword ptr [4D7364]
0043014E  |.  75 64      jnz     short 004301B4
00430150  |.  6A 00      push    0                          ; /Arg4 = 00000000
00430152  |.  6A 00      push    0                          ; |Arg3 = 00000000
00430154  |.  6A 00      push    0                          ; |Arg2 = 00000000
00430156  |.  8B55 AC    mov     edx, dword ptr [ebp-54]       ; |
00430159  |.  52         push    edx                        ; |Arg1
0043015A  |.  E8 91DF020>call    0045E0F0                   ; \ write_udd
0043015F  |.  83C4 10    add     esp, 10
00430162  |.  8B4D AC    mov     ecx, dword ptr [ebp-54]
00430165  |.  83B9 E1030>cmp     dword ptr [ecx+3E1], 0
0043016C  |.  74 09      je      short 00430177
0043016E  |.  833D 688D4>cmp     dword ptr [4D8D68], 0
00430175  |.  75 0C      jnz     short 00430183
00430177  |>  8B45 AC    mov     eax, dword ptr [ebp-54]
0043017A  |.  8B55 D8    mov     edx, dword ptr [ebp-28]
0043017D  |.  8990 E1030>mov     dword ptr [eax+3E1], edx
检查模块的类型以及基地址,若错误则重新得到其模块信息,检查有没有得到模块信息,若没有得到则分析模块得到其信息:
00430183  |>  833D 0C924>cmp     dword ptr [4D920C], 0
0043018A  |.  74 28      je      short 004301B4
0043018C  |.  8B4D AC    mov     ecx, dword ptr [ebp-54]
0043018F  |.  F641 08 04 test    byte ptr [ecx+8], 4
00430193  |.  74 1F      je      short 004301B4
00430195  |.  6A 00      push    0                          ; /Arg2 = 00000000
00430197  |.  8B45 AC    mov     eax, dword ptr [ebp-54]    ; |
0043019A  |.  8B50 0C    mov     edx, dword ptr [eax+C]     ; |
0043019D  |.  52         push    edx                        ; |Arg1
0043019E  |.  E8 5DDD020>call    _Finddecode                ; \_Finddecode
004301A3  |.  83C4 08    add     esp, 8
004301A6  |.  85C0       test    eax, eax
004301A8  |.  75 0A      jnz     short 004301B4
004301AA  |.  8B4D AC    mov     ecx, dword ptr [ebp-54]
004301AD  |.  51         push    ecx
004301AE  |.  E8 D1F0040>call    _Analysecode
004301B3  |.  59         pop     ecx
设置断点表的第一个变量为0,并跳转到下面调整优先级:
004301B4  |>  33C0       xor     eax, eax
004301B6  |.  A3 38814D0>mov     dword ptr [4D8138], eax
004301BB  |.  EB 15      jmp     short 004301D2
设置断点相关的信息,并调整优先级,最后返回0退出:
004301BD  |>  8B55 D8    mov     edx, dword ptr [ebp-28]
004301C0  |.  52         push    edx                        ; /Arg3
004301C1  |.  68 38624B0>push    004B6238              ; |执行 [%08lx] 时设置内存断点
004301C6  |.  8B4D D8    mov     ecx, dword ptr [ebp-28]    ; |
004301C9  |.  51         push    ecx                        ; |Arg1
004301CA  |.  E8 31DFFFF>call    0042E100                   ; \Ollydbg.0042E100
004301CF  |.  83C4 0C    add     esp, 0C
004301D2  |>  6A 00      push    0                          ; /Arg1 = 00000000
004301D4  |.  E8 FF18000>call    _Animate                   ; \_Animate
004301D9  |.  59         pop     ecx
004301DA  |.  33C0       xor     eax, eax      ; 返回0
004301DC  |.  E9 4412000>jmp     00431425    ; 跳转到结束处
这里为读取机器码失败之后的判断部分,为一个循环体,初始化ebx值为0,跳转到下面的循环体判断处:
004301E1  |>  33DB       xor     ebx, ebx
004301E3  |.  8D85 CCEBF>lea     eax, dword ptr [ebp-1434]
004301E9  |.  E9 0C02000>jmp     004303FA
检查异常事件的信息是否正确:
004301EE  |>  8338 00    /cmp     dword ptr [eax], 0  eax : pDebugEvent
004301F1  |.  0F84 FF010>|je      004303F6  ; 跳转到循环体判断处
004301F7  |.  F640 F4 20 |test    byte ptr [eax-C], 20    ; 检查是否是内存断点异常
004301FB  |.  0F85 F5010>|jnz     004303F6  ; 跳转到循环体判断处
00430201  |.  8B50 18    |mov     edx, dword ptr [eax+18] ; 检查异常地址是否正确
00430204  |.  8B0D 3C814>|mov     ecx, dword ptr [4D813C]
0043020A  |.  030D 40814>|add     ecx, dword ptr [4D8140]
00430210  |.  3BD1       |cmp     edx, ecx
00430212  |.  0F83 DE010>|jnb     004303F6  ; 跳转到循环体判断处
00430218  |.  0310       |add     edx, dword ptr [eax]
0043021A  |.  3B15 3C814>|cmp     edx, dword ptr [4D813C]   ;  Ollydbg.0040100C
00430220  |.  0F86 D0010>|jbe     004303F6  ; 跳转到循环体判断处
00430226  |.  833D 38814>|cmp     dword ptr [4D8138], 0
0043022D  |.  0F84 85010>|je      004303B8
00430233  |.  833D 50814>|cmp     dword ptr [4D8150], 0   ; exception_addr_begin_page
0043023A  |.  74 15      |je      short 00430251
0043023C  |.  8B50 18    |mov     edx, dword ptr [eax+18] ; ExceptionAddress
0043023F  |.  81E2 00F0F>|and     edx, FFFFF000
00430245  |.  3B15 50814>|cmp     edx, dword ptr [4D8150] ; 检查异常地址首内存页
0043024B  |.  0F84 A5010>|je      004303F6
检查异常调试信息结构体以及异常地址是否正确:
00430251  |>  833D 54814>|cmp     dword ptr [4D8154], 0  ; exception_addr_begin_page
00430258  |.  74 1E      |je      short 00430278
0043025A  |.  8B4D A4    |mov     ecx, dword ptr [ebp-5C]  ; ExceptionInformation
0043025D  |.  8379 14 00 |cmp     dword ptr [ecx+14], 0
00430261  |.  75 15      |jnz     short 00430278
00430263  |.  8B50 18    |mov     edx, dword ptr [eax+18]  ; ExceptionAddress
00430266  |.  81E2 00F0F>|and     edx, FFFFF000
0043026C  |.  3B15 54814>|cmp     edx, dword ptr [4D8154]  ; exception_addr_begin_page
00430272  |.  0F84 7E010>|je      004303F6
00430278  |>  8B4D A4    |mov     ecx, dword ptr [ebp-5C]
0043027B  |.  8379 14 00 |cmp     dword ptr [ecx+14], 0    ; ExceptionInformation
0043027F  |.  75 14      |jnz     short 00430295
将异常地址的内存页首地址赋值给两个全局变量:
00430281  |.  8B40 18    |mov     eax, dword ptr [eax+18]  ; ExceptionAddress
00430284  |.  25 00F0FFF>|and     eax, FFFFF000
00430289  |.  A3 403B4E0>|mov     dword ptr [4E3B40], eax
0043028E  |.  A3 54814D0>|mov     dword ptr [4D8154], eax
00430293  |.  EB 15      |jmp     short 004302AA
00430295  |>  8B50 18    |mov     edx, dword ptr [eax+18]
00430298  |.  81E2 00F0F>|and     edx, FFFFF000
0043029E  |.  8915 443B4>|mov     dword ptr [4E3B44], edx
004302A4  |.  8915 50814>|mov     dword ptr [4D8150], edx
比较几个全局变量中代表的异常内存页首地址是否一样,若不一样跳转到下面比较:
004302AA  |>  A1 403B4E0>|mov     eax, dword ptr [4E3B40]
004302AF  |.  3B05 483B4>|cmp     eax, dword ptr [4E3B48]
004302B5  |.  75 12      |jnz     short 004302C9
004302B7  |.  8B0D 443B4>|mov     ecx, dword ptr [4E3B44]
004302BD  |.  3B0D 4C3B4>|cmp     ecx, dword ptr [4E3B4C]
004302C3  |.  0F84 8A000>|je      00430353
设置提示信息:
004302C9  |>  68 61624B0>|push    004B6261                  ; /跟踪 sfx:
004302CE  |.  8D85 98FDF>|lea     eax, dword ptr [ebp-268]  ; |
004302D4  |.  50         |push    eax                       ; |Arg1
004302D5  |.  E8 5269070>|call    004A6C2C                  ; \_sprintf
004302DA  |.  83C4 08    |add     esp, 8
004302DD  |.  8945 F4    |mov     dword ptr [ebp-C], eax
004302E0  |.  833D 54814>|cmp     dword ptr [4D8154], 0
004302E7  |.  74 21      |je      short 0043030A
004302E9  |.  8B15 403B4>|mov     edx, dword ptr [4E3B40]
004302EF  |.  8D8D 98FDF>|lea     ecx, dword ptr [ebp-268]
004302F5  |.  52         |push    edx                       ; /Arg3 => 00000000
004302F6  |.  68 6E624B0>|push    004B626E                  ; | read=%08x
004302FB  |.  034D F4    |add     ecx, dword ptr [ebp-C]    ; |
004302FE  |.  51         |push    ecx                       ; |Arg1
004302FF  |.  E8 2869070>|call    004A6C2C                  ; \_sprintf
00430304  |.  83C4 0C    |add     esp, 0C
00430307  |.  0145 F4    |add     dword ptr [ebp-C], eax
0043030A  |>  833D 50814>|cmp     dword ptr [4D8150], 0
00430311  |.  74 1D      |je      short 00430330
00430313  |.  A1 443B4E0>|mov     eax, dword ptr [4E3B44]
00430318  |.  8D95 98FDF>|lea     edx, dword ptr [ebp-268]
0043031E  |.  50         |push    eax                       ; /Arg3 => 00000000
0043031F  |.  68 79624B0>|push    004B6279                  ; | write=%08x
00430324  |.  0355 F4    |add     edx, dword ptr [ebp-C]    ; |
00430327  |.  52         |push    edx                       ; |Arg1
00430328  |.  E8 FF68070>|call    004A6C2C                  ; \_sprintf
0043032D  |.  83C4 0C    |add     esp, 0C
00430330  |>  8D8D 98FDF>|lea     ecx, dword ptr [ebp-268]
00430336  |.  51         |push    ecx                       ; /Arg1
00430337  |.  E8 2C14000>|call    _Infoline                 ; \_Infoline
0043033C  |.  59         |pop     ecx
0043033D  |.  A1 403B4E0>|mov     eax, dword ptr [4E3B40]
00430342  |.  A3 483B4E0>|mov     dword ptr [4E3B48], eax
00430347  |.  8B15 443B4>|mov     edx, dword ptr [4E3B44]
0043034D  |.  8915 4C3B4>|mov     dword ptr [4E3B4C], edx
检查模块信息结构体是否正确:
00430353  |>  833D 648D4>|cmp     dword ptr [4D8D64], 2
0043035A  |.  74 43      |je      short 0043039F
0043035C  |.  833D 648D4>|cmp     dword ptr [4D8D64], 1
00430363  |.  75 49      |jnz     short 004303AE
00430365  |.  833D 688D4>|cmp     dword ptr [4D8D68], 0
0043036C  |.  74 40      |je      short 004303AE
0043036E  |.  837D AC 00 |cmp     dword ptr [ebp-54], 0
00430372  |.  74 3A      |je      short 004303AE
00430374  |.  8B4D AC    |mov     ecx, dword ptr [ebp-54]
00430377  |.  8B55 AC    |mov     edx, dword ptr [ebp-54]
0043037A  |.  8B81 E1030>|mov     eax, dword ptr [ecx+3E1]
00430380  |.  3B42 0C    |cmp     eax, dword ptr [edx+C]  ; 检查入口点是否在模块首前面
00430383  |.  72 29      |jb      short 004303AE
00430385  |.  8B4D AC    |mov     ecx, dword ptr [ebp-54]
00430388  |.  8B55 AC    |mov     edx, dword ptr [ebp-54]
0043038B  |.  8B41 0C    |mov     eax, dword ptr [ecx+C]
0043038E  |.  8B4D AC    |mov     ecx, dword ptr [ebp-54]
00430391  |.  0382 E9030>|add     eax, dword ptr [edx+3E9] 
00430397  |.  3B81 E1030>|cmp     eax, dword ptr [ecx+3E1] ; 检查入口点是否在模块尾的后面
0043039D  |.  76 0F      |jbe     short 004303AE

  评论这张
 
阅读(434)| 评论(2)
推荐 转载

历史上的今天

评论

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

页脚

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