• 标 题:Araxis Merge 2001 Professional Evaluation v6.0 时间限制去除 (7千字)
  • 作 者:liangs
  • 时 间:2001-6-6 21:43:55
  • 链 接:http://bbs.pediy.com

Araxis Merge 2001 Professional Evaluation v6.0 时间限制去除
                by liangs

(1)去除Nag和30天限制

根据Nag的标题"Welcome to Araxis Merge"我们在W32Dasm中可以查到那
个窗口的ID是DialogID_0FA8,再查DialogID_0FA8在程序中出现的地方,
可找到如下代码处:

:00469A79 3BF3                    cmp esi, ebx
:00469A7B 8B55F0                  mov edx, dword ptr [ebp-10]
:00469A7E 8B45EC                  mov eax, dword ptr [ebp-14]
:00469A81 8990000E0000            mov dword ptr [eax+00000E00], edx
:00469A87 7C05                    jl 00469A8E //改为EB05
:00469A89 83FE1E                  cmp esi, 0000001E
                                  //判断时间是否大于30天
:00469A8C 7E05                    jle 00469A93
 
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00469A77(U), :00469A87(C)
|
:00469A8E BE1E000000              mov esi, 0000001E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00469A8C(C)
|
:00469A93 395D08                  cmp dword ptr [ebp+08], ebx
:00469A96 747D                    je 00469B15 //改为EB7D
:00469A98 53                      push ebx

* Possible Reference to Dialog: DialogID_0FA8 //Nag过期窗口提示

★★★ 一定要跳过这个Nag,上面的两个修改都是为了要Jump过它

:00469A99 68A80F0000              push 00000FA8
:00469A9E 8D8D04FFFFFF            lea ecx, dword ptr [ebp+FFFFFF04]
:00469AA4 E81D270700              call 004DC1C6
:00469AA9 B91E000000              mov ecx, 0000001E
:00469AAE 2BCE                    sub ecx, esi
:00469AB0 898D60FFFFFF            mov dword ptr [ebp+FFFFFF60], ecx
:00469AB6 8D8D64FFFFFF            lea ecx, dword ptr [ebp+FFFFFF64]
:00469ABC C645FC03                mov [ebp-04], 03
:00469AC0 E8FB5F0000              call 0046FAC0
:00469AC5 A140E95300              mov eax, dword ptr [0053E940]
:00469ACA 8945A0                  mov dword ptr [ebp-60], eax
:00469ACD 8945A4                  mov dword ptr [ebp-5C], eax
:00469AD0 68AC355400              push 005435AC
:00469AD5 8D4DA0                  lea ecx, dword ptr [ebp-60]
:00469AD8 C645FC06                mov [ebp-04], 06
:00469ADC C78504FFFFFF34AD5000    mov dword ptr [ebp+FFFFFF04], 0050AD34
:00469AE6 E80E1E0700              call 004DB8F9
:00469AEB 68AC355400              push 005435AC
:00469AF0 8D4DA4                  lea ecx, dword ptr [ebp-5C]
:00469AF3 E8011E0700              call 004DB8F9
:00469AF8 8D8D04FFFFFF            lea ecx, dword ptr [ebp+FFFFFF04]
:00469AFE C645FC07                mov [ebp-04], 07
:00469B02 E895270700              call 004DC29C
:00469B07 8D8D04FFFFFF            lea ecx, dword ptr [ebp+FFFFFF04]
:00469B0D 885DFC                  mov byte ptr [ebp-04], bl
:00469B10 E89B29FBFF              call 0041C4B0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00469A96(C)
|
:00469B15 83FE1E                  cmp esi, 0000001E
:00469B18 8D4DA8                  lea ecx, dword ptr [ebp-58]
:00469B1B 0F9CC3                  setl bl
:00469B1E C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF
:00469B25 E8E676FAFF              call 00411210
:00469B2A 8B4DF4                  mov ecx, dword ptr [ebp-0C]
:00469B2D 5F                      pop edi
:00469B2E 5E                      pop esi
:00469B2F 8AC3                    mov al, bl
                          ★★★ 这个很重要,一定要使al为1
                                  下面我们将会看到这点
:00469B31 64890D00000000          mov dword ptr fs:[00000000], ecx
:00469B38 5B                      pop ebx
:00469B39 8BE5                    mov esp, ebp
:00469B3B 5D                      pop ebp
:00469B3C C20400                  ret 0004
                                  这里将返回到00412ABC的调用
:00469B3F 90                      nop

-----------------------------------------------------------
为使00469B3C处返回时,al=1我们可以修改上面代码如下:
:00469B2F 8AC3                    mov al, bl //改为 xor eax,eax
          33c0
:00469B31 64890D00000000          mov dword ptr fs:[00000000], ecx
:00469B38 5B                      pop ebx
:00469B39 8BE5                    mov esp, ebp
:00469B3B 5D                      pop ebp
插入语句 40                      inc eax //这里使al=1
:00469B3C C20400                  ret 0004                             
:00469B3F 90                      nop //这个nop将被占用

------------------------------------------------------------
下面代码为上面子程序的返回后的处理,程序会继续处理时间判断:

* Reference To: KERNEL32.GetLocalTime, Ord:011Bh
                                  |
:00412A87 FF151C645000            Call dword ptr [0050641C]
:00412A8D 8B45E0                  mov eax, dword ptr [ebp-20]
:00412A90 663DD007                cmp ax, 07D0
:00412A94 722E                    jb 00412AC4
:00412A96 663DD207                cmp ax, 07D2
:00412A9A 7728                    ja 00412AC4
:00412A9C 7513                    jne 00412AB1
:00412A9E 668B45E2                mov ax, word ptr [ebp-1E]
:00412AA2 663D0300                cmp ax, 0003
:00412AA6 771C                    ja 00412AC4
:00412AA8 7507                    jne 00412AB1
:00412AAA 66837DE61E              cmp word ptr [ebp-1A], 001E
:00412AAF 7713                    ja 00412AC4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00412A9C(C), :00412AA8(C)
|
:00412AB1 53                      push ebx
:00412AB2 B960365400              mov ecx, 00543660
:00412AB7 E8446E0500              call 00469900

:00412ABC 84C0                    test al, al
★★★ 从上面的00469B3C处的RET返回到此,如果al=0,将跳往过期的处理,
几个F12后程序将退出,所以一定要在前面的call 00469900中将al置为1

:00412ABE 0F85A7000000            jne 00412B6B
上面al为1后,这里就会跳往正确的地方                               

(2)去除2002年3月31号的限制
这个程序的作者有点变态,他在程序中调用GetLocalTime有几十次之多,
而且每次调用后都作了判断,判断如果时间过期后都要跳忘不同的过期
处理,比如上面00412A87处开始的一段GetLocalTime的处理要按如下方
法处理:

* Reference To: KERNEL32.GetLocalTime, Ord:011Bh
                                  |
:00412A87 FF151C645000            Call dword ptr [0050641C]
:00412A8D 8B45E0                  mov eax, dword ptr [ebp-20]

:00412A90 663DD007                cmp ax, 07D0 //改为9090
                                  07D0也就是2000年
:00412A94 722E                    jb 00412AC4 //改为9090
                                  如果时间小于2000年则跳往00412AC4

:00412A96 663DD207                cmp ax, 07D2 //改为9090
                                  07D2也就是2002年
:00412A9A 7728                    ja 00412AC4 //改为9090
                                  如果时间大于2002年则跳往00412AC4

:00412A9C 7513                    jne 00412AB1 //改为EB13
                                  //这里一定要跳,下面就要跳往过期处理

:00412A9E 668B45E2                mov ax, word ptr [ebp-1E]
:00412AA2 663D0300                cmp ax, 0003
:00412AA6 771C                    ja 00412AC4 //这里跳往过期处理

:00412AA8 7507                    jne 00412AB1
:00412AAA 66837DE61E              cmp word ptr [ebp-1A], 001E
:00412AAF 7713                    ja 00412AC4

如果不怕麻烦的话,就处理每个GetLocalTime后的代码,共有几十处,
我用的一种投机的方法就简单了这个问题。

我们已经知道07D2也就是2002年,用UltraEdit打开Merge.exe,查找替换
文件中所有的07D2为0BB8(也就是3000年),当然你也可以改为N千年也
是可以的 :-),重新运行程序Nag、30天限制、及2002年3月限制都没有了,
这种方法并没有处理时间小于2000年的问题,当然现在已经2001年了,不
会有人会把机器时间改为2000年以前吧,如果要解决掉这个小于2000年的
问题,须按上面我写的修改每个GetLocelTime返回后的代码的方法就可搞
定,这就需要耐心了。