讨论
倒.这个我了解
老大花指令没有去干净...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,该寄存器起控制作用,不让你的断点有作用
