欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

讨论

讨论

倒.这个我了解
老大花指令没有去干净...Look:
第一部分:分析INT3中断以及系统0层的跳入 
    程序首先修改中断门INT3,这样,你根本就无法设置BPX断点,不过此时还可以设置BPM断电和单步调试断点;具体看看这段代码: 
004F671D  0F010E            SIDT FWORD PTR DS:[ESI]//--取出中断描述符表寄存器(IDTR) 保存到[ESI] 
004F674D  8B76 02           MOV ESI,DWORD PTR DS:[ESI+2]//--取出IDT的基地址 
004F6767  66:8B46 18        MOV AX,WORD PTR DS:[ESI+18]====//--读取中断门 
004F6798  66:8B5E 1E        MOV BX,WORD PTR DS:[ESI+1E]====//--读取中断门 
004F67A1  66:8985 C3164600  MOV WORD PTR SS:[EBP+4616C3],AX//--保存中断门 
004F67AD  66:899D C5164600  MOV WORD PTR SS:[EBP+4616C5],BX//--保存中断门 
004F67B9  B8 77244600       MOV EAX,4F69F6-.00462477//--新中断门地址相关 
004F67EB  03C5              ADD EAX,EBP//--新的INT3中断的地址=0x0054F1CC 
004F67F2  66:8946 18        MOV WORD PTR DS:[ESI+18],AX//--新的INT3中断的地址,从现在开始,不能使用bpx 中断 
                                                       //--0x18==24=8*3 
                                                       //--每一个中断门8个字节 
                                                       //--xx xx ?? ?? 
                                                       //--?? ?? xx xx 
004F6823  C1E8 10           SHR EAX,10=//--新的INT3中断的地址 
004F682B  66:8946 1E        MOV WORD PTR DS:[ESI+1E],AX//--新的INT3中断的地址 
                                                       //--至此,新的中断门设立完成 
                                                       //--该进程可以调用INT3中断 
                                                       //--不再产生例外 
                                                       //--实际也就是一个子过程 
好了中断门设置好了,你可不能用BPX来设置断点了,接下来是一地段解码程序。再接着是一段加查程序代码和是否正确。 
.... 
这些完成后,就是INT3指令,这就转到了作者所设计的INT3过程0x0054F1CC 
004F69F6  CC                INT3===>在这儿,程序自动掌握INT3中断 
                                                       =>也就是上面的0x0054F1CC 
第二部分,分析INT3子过程 
它首先是修改INT1中断门,然后 
0054F2A6  0F010E            SIDT FWORD PTR DS:[ESI]//--存储IDT表 
0054F2AE  8B76 02           MOV ESI,DWORD PTR DS:[ESI+2]//--得到IDT基址 
0054F2B6  BB 7C274600       MOV EBX,4F69F6.0046277C 
0054F2C0  03DD              ADD EBX,EBP 
0054F2D9  66:8B46 08        MOV AX,WORD PTR DS:[ESI+8]//-- 
0054F2F4  66:3BD8           CMP BX,AX 
0054F2FE  66:8B46 08        MOV AX,WORD PTR DS:[ESI+8]//-- 
0054F307  66:8B5E 0E        MOV BX,WORD PTR DS:[ESI+E]//-- 
0054F310  66:8985 C7164600  MOV WORD PTR SS:[EBP+4616C7],AX//-- 
0054F32E  66:899D C9164600  MOV WORD PTR SS:[EBP+4616C9],BX//-- 
0054F351  B8 7C274600       MOV EAX,4F69F6.0046277C 
0054F36D  03C5              ADD EAX,EBP//--新的INT1中断门,0x0054F4D1 
0054F374  66:8946 08        MOV WORD PTR DS:[ESI+8],AX//--修改INT1中断门 
                                                      //--现在开始不能使用INT1中断 
0054F38F  C1E8 10           SHR EAX,10//--新的INT1中断门 
0054F3BF  66:8946 0E        MOV WORD PTR DS:[ESI+E],AX//--修改INT1中断门 
至此,INT1中断门修改完毕, 
然后就执行到这儿,调用INT1中断0x0054F4D1 
0054F3FE  CD 01            INT 1==>在这儿,程序自动掌握INT1中断 
接下来就是,清除你使用调试寄存器DR0-DR3,DR7所设置的断点,具体看下面的分析: 
0054F44F  33C0              XOR EAX,EAX===>清0 
0054F456  0F23C0            MOV DR0,EAX===>断点寄存器DR0清0,达到反调试寄存器跟踪 
0054F45E  0F23C8            MOV DR1,EAX===>断点寄存器DR1清0,达到反调试寄存器跟踪 
0054F478  0F23D0            MOV DR2,EAX===>断点寄存器DR2清0,达到反调试寄存器跟踪 
0054F480  0F23D8            MOV DR3,EAX===>断点寄存器DR3清0,达到反调试寄存器跟踪 
0054F49A  B8 55010000       MOV EAX,155
0054F4A4  0F23F8            MOV DR7,EAX===>断点寄存器DR7,该寄存器起控制作用,不让你的断点有作用


注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功