125243102 发表于 2009-11-4 12:42:23

时间限制的破解

注:SetTimer( )、KillTimer( )、WM_TIMER的破解 (

X-Win32是个Win95下的X-server程序.
在http://www.starnet.com或tucows的mirror站点可以找到它.

其4.0.1版的演示版只允许你每次运行两个小时,之后必须重新运行它.
这个软件在安装时要输入注册码,不过这时候不一定要你输入正确的注册码.

我的破解方法如下:

1.用SoftIce加载其主程序XWin32.exe
2.用bpx messageboxa设置断点,按F5运行.
3.过一会就会激活SoftIce,按一下F11返回调用MessageBoxA的地方,可以看到:
00421A18:    CALL
                MOV    EAX,
                TESTEAX,EAX
00421A25:    JNZ    00421A63
                MOV    EDX,
                LEA    ECX,
                PUSH00000100
                PUSHECX
                PUSH09
                PUSHEDX
00421A3A:    MOV    DWORD PTR ,00000078;120分钟,即2小时
                CALL
                MOV    ECX,
                PUSH40
                LEA    EAX,
                PUSH004A2D1C
                PUSHEAX
                PUSHECX
                CALL      ;显示"demon version"
00421A63:    ADD    ESP,00000100                ;亮条停在此行
                RET
4. 稍加分析,就可以知道上面的程序段的作用.程序先把DS:中的值
取出来,判断它是否为0,为零则显示对话框,不为零就跳过对话框.我们还可以
看到它在显示对话框之前把DS:赋值为78H,即10进制的120.如果120
表示120分钟的话,那不正好为两小时吗 ? 如果确实是在这个地方设置两小时
限制的话,那么程序在以后肯定会来读写DS:,所以用bpm 004938FC
设置个新断点.
5. 按F5继续执行,过了一会儿又进入了SoftIce !
这次看仔细了:
00421A7F:MOVEAX,
            DECEAX                  ;亮条停在此行
            MOV,EAX
00421A8A:JZ    00421AC9            ;剩下0分钟,中止进程
            CMPEAX,0F            ;剩下15分钟吗 ?
            JNZ00421AE4            ;不是,继续运行
            MOVECX,      ;显示"只剩15分钟"
            .
            .
程序显然是在作递减工作,把那个计数器减到零的时候,也就是到了两小时的
时候,就中止进程.在只剩下15分钟的时候它会显示个对话框,告诉你"只剩
15分钟好用了".
6.我的破解方法是,把CS:00421A25处的JNZ 00421A63改为JMP 00421A63就行了.
    这样不仅跳过了对话框,而且计数器DS:的初值为0,以后程序对它
    进行减一操作的话,它就会变成-1,即FFFFFFFF分钟,这可是个天文数字,所以
    你也根本不用担心程序会中止啦.
    find:      75 3C 8B 15 20
    replace:    EB -- -- -- --
以上只是一种破解方法而已,也可以把减一指令改为NOP.能找到注册码当然最好.

Netguy,1998.9.20


注:GetTickCount( )的破解

X-win Pro 4.3的demon版有31分钟的时间限制.
在运行到第30分钟的时候,弹出一个对话框,告诉你只能再用1分钟.到第31分钟的
时候,又弹出一个对话框,告诉你已经没时间了,要你重新运行它.它已经销毁了它
所启动的所有窗口.
我的破解方法如下:
用softice symbol loader加载xserver.exe,按F5运行.等连上UNIX主机后,
用bpx messageboxa设置断点,然后出去玩半个小时(我是去逛书店了).
等30分钟过后,就发现进入了softice.按F11从MessageBoxA函数返回.
再按几下F10,经过一条ret指令后,就可以看见如下的程序段:
0041228D: CALLCS:   
          MOVECX,
          MOVEBX,EAX
          TESTECX,ECX
          JZ    004122D3
004122A0: CMPEAX,ECX
          JLE004122D3
          MOVEDX,0000EA60            ;60000毫秒=1分钟
          MOVEBX,
          MOVEAX,
          MOV,ESI
          CALL                  ;显示"只剩1分钟了"
          CALLCS:;取时间
          ADDEAX,0000EA60                ;加上1分钟(60000毫秒)
          MOV,EAX            ;保存起来
          JMP004122F8
004122D3: CMPEBX,
          JLE004122F8
          MOVEBX,
          MOVEAX,
          XOREDX,EDX                  ;0分钟
          CALL                  ;显示"剩下0分钟"
          MOVDWORD PTR ,00000001
004122F8: MOVEAX,ESI
          POPESI
          POPEDX
          POPECX
          POPEBX
          RET
通过用softice改变程序执行流程,对上面的程序段进行分析,知道程序是这么
作的:
程序不断用GetTickCount( )得到系统时间(系统启动以来所经过的毫秒数),
和预定的值比较,看有没有到30分钟.到了30分钟的时候,先显示对话框,告诉你
只能再用1分钟了.然后用GetTickCount( )得到系统时间,将其加上60000,
也就是加上1分钟,保存在一个变量中.此后不断将GetTickCount( )返回的数和这
个变量比较,如果大于这个变量,就说明过了31分钟,就弹出个对话框,告诉你剩下
0分钟,然后销毁窗口.
如果让GetTickCount( )返回固定值,不就可以骗过它了吗?由于GetTickCount
返回值在EAX寄存器中,所以只需要把CALLCS:这条
指令改为
            MOV EAX,00000001
            NOP
            NOP
为了保险起见,我把上面的两条CALLCS:都改了.
find:      2E FF 15 4C 71 52 00 8B 0D
replace:    B8 01 00 00 00 90 90 -- --

find:      2E FF 15 4C 71 52 00 05 60 EA
replace:    B8 01 00 00 00 90 90 -- -- --
由于30分钟时间很长,我只检验过一次,不知道还有什么bug.
当然也可以把30分钟改短点儿.

热情特 发表于 2009-11-27 22:52:15

对这些高难技术我不知道从何说起-惭愧阿!
页: [1]
查看完整版本: 时间限制的破解