精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 计算机安全>>◇网络安全◇>>小技巧>>Crack技巧(8)---DOS4GW程序

主题:Crack技巧(8)---DOS4GW程序
发信人: mangludeyingfeng(忙碌的影风)
整理人: starseacn(2001-11-15 17:19:05), 站内信件
如何破解DOS4GW的程序

?CheMing?      

想必大家一定见过DOS4GW吧,这是一个流行很广的DOSExtender,通常用WATCOMC/C++编的保护模式的程序都带这个.那么大家解没解过这种程序呢?

我想大多数人会遇到麻烦,在一般教学的文章中介绍的方法都不好使了:(

主要问题有:

0.DLDR载入无法单步运行

1.BPX断点失效

2.BPINT断点失效

这跟保护模式程序运行时的特殊性有关.首先,保护模式的程序通常都由STUB,DOSEXTENDER,OVERLAY三部分组成,有些将STUB+OVERLAY做在一起,DOSEXTENDER单独为一个文件,比如DOS4GW;有些将三者做在一起,如PMODE/W;更有干脆的将DOSEXTENDER做成OBJ文件最后直接连入程序,如EOS.不过不管形式如何,运行时步骤都差不多,我们以DOS4GW为例:

首先执行STUB,这部分是一个V86程序,由这个STUB载入DOSEXTENDER,由它启动保护模式,最后由DOSEXTERDER装载OVERLAY-这才是真正的程序所在-至内存运行,此时已是PROT32方式了.

那么我们用DLDR将一个DOS4GW的程序装载进来,单步运行的是哪一部分呢?

回答是STUB,就是开始的那段16位程序.我们运行运行,一定会到一个函数,然后P命令,就会直接载入DOS4GW,接着启动PROT32部分的代码了,根本跟不进去:(

另外,如果你在程序运行时按热键激活了SoftICE/W并且有幸停在PROT32代码段,进程名也是你要跟踪的程序名,那么恭喜你,你已经在真正的程序代码段里了:)那么我们都会想到,在这里用BPX设一个断点,下回运行不就停在这了吗?好,你兴高采烈地设上了一个断点,结果呢?下回重新运行断点根本不起作用:(

如果你在刚才没有退出来,而是使用了一个BPINT21来截取程序发出的DOS中断请求,你也会惊奇的发现,没用!:(

这一切都怎么了?

首先,保护模式的程序的地址不再使用SEGMENT:OFFSET的形式,而是SELECTOR:OFFSET,即选择器:偏移量形式;

第二,在Win95里DOS程序是在一个虚拟机运行的,其地址是非全局的,进入保护模式时,SELECTOR中的地址是临时分配的.当程序退回实模式时,我们在PROT32里设的断点已经失效了.不信你可以激活SoftICE/W,用U命令反汇编你刚才设的断点,(用BL观察一下断点,你可以发现地址前有个"#",这说明这是一个SELECTOR:OFFSET形式的地址),SoftICE/W会告诉你"非法的无效地址"!怎么让这个地址或者说断点起作用呢?只要我们在PROT32里再激活一次SoftICE/W,这个地址里的SELECTOR就会正确,这个地址就会有效,断点也自然会起作用.这也说明了SoftICE/W中的断点地址跟地址上下文(AddressContent)有关,不光断点,S(查找)命令等很多SoftICE/W命令都跟地址上下文有密切关系,用不好,就会发生非期望的结果,比如查找失败.

BPINT命令之所以失败,跟保护模式的程序使用中断的方式有关.在实模式中,程序调用中断是使用IVT(中断向量表),而在保护模式,则使用IDT(中断描述表),换句话说,同样是INT21,在实模式下,其地址为0000:21*4所给出的DWORD地址;而在保护模式,则在IDT21处了.BPINTn命令只是在0000:n*4所给出的地址处设置了一个BPX断点,所以对保护模式的程序来说,是不起作用的!假设我们现在已经在PROT32代码段了,如何截取INT21呢?很简单,先用SoftICE/W的IDT命令查一下INT21的地址:IDT21.SoftICE/W会给出一个SELECTOR:OFFSET形式的地址,这就是当前PROT32代码的INT21的地址,我们就可以手工模拟BPINT命令了,比如你要跟INT21AH=2A,就可以输BPXSELECTOR:OFFSETIFAH==2A(其中的SELECTOR:OFFSET是刚才用IDT21查出来的).注意,这个断点同样会在退出保护模式时消失:(

讲来讲去,现在关键的问题出来了:如何才能直接进入PROT32代码段,使以前的断点生效呢?(对Win95程序不存在这个问题,因为这些程序的地址是全局的,断点总是有效)

问题就在于这个STUB,我们用DLDR载入时总载入的是它,而它又启动DOSEXTERDER使CPU进入保护模式,最后由DOSEXTERDER(这里就是DOS4GW)装载真正的PROT32代码.

其实,你如果用过WATCOMC/C++里的调试器WD就知道,WD总会自动完成STUB的工作,而将起点停在PROT32的第一条语句上!!对DOS4GW1.97来说,这条语句通常都是EB76(JMPXXXXXXXX)!!!!

如何让SoftICE/W也停在这条语句上呢?SoftICE/W的老用户也许想到了,对,用INT3.在SoftICE/W中,有一条命令I3HERE,这是一个开关语句,意在告诉SoftICE/W是否视INT3为一个断点.当I3HEREON时,每当遇到INT3时,都会产生断点中断,使SoftICE/W激活.那么现在就请你在SoftICE/W里执行I3HEREON(调试完别忘了关掉,否则运行一些加过壳的程序你会遇到麻烦:-)现在问题在于我们怎么在文件中找到这个EB76,直接找?不行!太多的EB76了:(其实这个EB76(就是JMP)跳过了些什么?哦!原来是一段版权信息,这是WATCOM;给我们留的后门:-)."WATCOMC/C++..."所以,直接在文件中找"WATCOMC/C++".很好,只有一处!前面就是EB76,别愣了,赶快改成CD03(就是INT3)

现在运行程序,耶!SoftICE/W弹出来了,就停在INT3的下面,而且现在就是PROT32状态,这意味着我们先前的断点都还起作用!好了,将CD03改回EB76就行了:

EEIP-2EB76

REIP=EIP-2

/*嫌麻烦?OK,在我这,我通常设这么一个宏:

MACROWATCOM="EEIP-2EB76;REIP=EIP-2"

这样,以后你只需敲WATCOM就行了*/

G运行,以前的断点都工作了吧:)

实战:

破解AMU3.1时间限制(AMU32.EXE)这是一个DOS4GW的程序,有时间限制.

0.在SoftICE/W中执行I3HEREON

1.在AMU32.EXE中找"WATCOMC/C++",将前面的EB76改为CD03

2.运行AMU32

3.INT3工作,激活了SoftICE/W,光标停在INT3的下面

4.WATCOM/*恢复原来状态,你要事先建立这个宏*/

5.IDT21/*查看INT21的实际地址*/

6.BPXSELECTOR:OFFSETIFAH==2A/*在IDT21给出的地址处设置断点,

条件是当程序取当前日期*/

7.G/*运行*/

8.断点发生/*此时应该是一个PROT16的代码段*/

9.G@SS:ESP/*返回PROT32代码段,即AMU32的主程序,

也是调用INT21的地方*/

A.略:-)/*后边的工作跟今天讲的内容无关,你自己分析吧*/

改完AMU32.EXE后,别忘了将CD03改回EB76;还有将SoftICE/W里的I3HERE关闭.

下回再遇到DOS4GW的程序可别再一筹莫展了.

摘自黑白道网络安全资讯 


  


[关闭][返回]