破解过程 (2千字)
其实不好意思写出整个的破解过程,因为与blowfish相比,这种方法实在是比较可笑。不过既然1212兄想看,就不怕1212兄笑话,写出来献丑了。拿来软件,首先用Dasm反汇编了一下,查看deadlist,发现有个地方比较奇怪,就是有个串叫作"regvalida",想当然地认为这里应该是检测注册码的地方。于是动用trw2000,既然用hmemcpy拦不住,就干脆利用dasm里的地址拦截,可是跟进402D25这个call去后发现它不过是将自己输入的注册码前面加上"regvalida",然后自己和"regvalida"进行比较,没什么意思,但是追进下面的Call里去时便进入了mbed.dll去了,然后就可以看见诸如$result=ok,not-ok,endif等等东东,非常象拿script写的,有点看vbscript的感觉。猜了几个地方跳转都是错的。无奈,只得重头再来。
这次想到启动后主画面中右上角有not registered字样,在Deep Finesse.exe里面找了一下,发现果然有,不是图片贴上去的。看看它的周围,净是些<>这样的符号,看起来象xml文件似的,一开始没太注意,当用resource explorer打开Deep Finesse.exe时发现rcdata里面有很多.mbd文件,每个文件的结构都很像xml,于是export了这几个文件,文本编辑器里赫然显示程序的流程,联想到刚才的追踪和认为象script的感觉,看来程序只是调用这些mbd文件里的function名称,而每个function的具体代码可能放在mbed.dll里面。
Search "not registered",发现在main.mbd里面,找到位置后,想想判断是否注册的过程应该在上面一些的地方,果然如此,<check><unlock>这些字样在用trw2000追踪的时候看到过。这里的代码应该很透明了,
<check>
handler set dodemo=$param
logo hide
serialNo hide
serialNoBox hide
serialNoTxt hide
mbedlet call getserial
handler if ($result = ok)
mbedlet set registered=yes <---- registered应该是全局变量,
check通过就设为yes
mbedlet doDeal "Last Hand.txt 1"
handler else
handler if ($dodemo = yes)
mbedlet doDeal Demo1
handler else
mbedlet hideBigLogo
register.child.serialNo set value=$result
mbedlet cleanup
mbedlet buttons hide
mbedlet statusHide
pipe hide
me above
me show
handler endif
handler endif
</check>
<unlock>
mbedlet call regvalida#$register.child.unlockCode.value
handler if ($result = ok)
register approved
handler else
register.child.errorText show
handler endif
</unlock>
<approved>
mbedlet set cursor=arrow
mbedlet set registered=yes <------ 这里也是。
thankYouScore play
</approved>
加上有些编程知识,把代码换了位置,反正保证文件长度不变就可以了。利用winhex或者ultraedit这类二进制东东,找到原来main.mbd这些代码在exe文件里的位置,将修改过的main.mbd内容覆盖进去。然后运行Deep Finesse.exe,看来像是注册了。
象Deep Finesse这种用类似于script的东东(或许C++的高手们知道此类方法的准确名称)的软件,我还是头一次看见,真是大长见识。
破解完后,感觉有点怪怪的,有一种能够气死谁的感觉。J
