且行且远 » Blog Archive » 围棋助手8.76去除自校验+Nag窗口
且行且远
分类: 逆向手札 由 ssfighter 于 2006年8月11日 发表

终于搞定了围棋助手的自校验和全部Nag窗口,呼呼,真是难弄啊。想起来我第一次调试围棋助手这个软件的时候还是刚开始学破解,连什么是自校验都不知道呢,那个时候发现围棋助手是UPX-Scrambler加的壳,还跑到网上去找这个壳的专业脱壳工具,想起来真是有点可笑啊,不过那个时候把壳脱掉之后就发现程序不能启动,而且CPU一下子就到100%了,内存也瞬间就不够用了,当时还以为是脱壳脱的不好呢,因为以前围棋助手是用Armadillo加的壳,还傻傻地以为是脱Arm的壳脱的问题呢,hoho。后来知道了有自校验这回事,但是根本不知道怎么去除自校验,前段时间终于又下狠心研究一下,忽然发现还是很容易的啦。这个程序的自校验多的不可胜数,看来作者也是在防破解这方面下了很大的工夫的,不过就有一点不是很好,我以前购买过正版,但是好像每次新版本的正版验证程序都不一样,弄得我以前的正版Key都不好用,也懒得去再发邮件给作者换Key,就破解了先用着吧。

脱壳去自校验已经过了好几天了,估计都忘的差不多了,所以就简单说明一下吧。这个程序目前最近版本是8.76,保护方式还是UPX-Scrambler RC1.x -> ㎡nT畂L,脱壳不是很难,手脱和用工具都差不多。脱掉之后不能急着运行,否则电脑肯定崩溃。用OD载入,可以发现CPU一下子就到100%了,不要着急,马上点暂停键,这也是对付消耗系统资源类的自校验的一般方法。停下来之后按若干次Ctrl+F9,可以回到程序领空,来到第一处自校验点:


0041A886    84DB            test    bl, bl
0041A888    8BF8            mov     edi, eax
0041A88A    75 0F           jnz     short 0041A89B
0041A88C    68 401F0000     push    1F40
0041A891    E8 601C0700     call    <jmp.&MFC42.#823_operator new>
0041A896    83C4 04         add     esp, 4
0041A899  ^ EB F1           jmp     short 0041A88C
0041A89B    8BCE            mov     ecx, esi

从这里,我们知道消耗系统资源的办法就是不断调用new函数,做成一个死循环,那么很好办,把前面的jnz改成jmp强制跳转即可。同时记住这种消耗系统资源的关键代码:83 C4 04 EB F1,于是,我们可以在程序的整个空间搜索这样的关键代码,找到的都是这种自校验点,把前面的跳转都改成强制跳转即可消除这种自校验,而不是遇到了一个自校验点分析一个校验点,那样比较慢而且也找不全,如果我没记错的话,这种自校验消耗系统资源的方法程序中用了五次,具体在哪里用的我也不知道,以上称为自校验一。

第二种自校验,也是以消耗系统资源为目的的,我们搜索ASCII码”500″,来到这里:


0042C16E    3C 08           cmp     al, 8
0042C170    74 59           je      short 0042C1CB
0042C172    3C 5D           cmp     al, 5D
0042C174    74 55           je      short 0042C1CB
0042C176    3C ED           cmp     al, 0ED
0042C178    74 51           je      short 0042C1CB
0042C17A    C646 44 01      mov     byte ptr [esi+44], 1
0042C17E    C686 72DC0200 0>mov     byte ptr [esi+2DC72], 1
0042C185    E8 80040600     call    <jmp.&MFC42.#1168_AfxGetModuleSt>
0042C18A    8B40 04         mov     eax, [eax+4]
0042C18D    B3 0D           mov     bl, 0D
0042C18F    C680 C4000000 0>mov     byte ptr [eax+C4], 1
0042C196    68 A09A4B00     push    004B9AA0                         ; 500
0042C19B    8D4C24 24       lea     ecx, [esp+24]
0042C19F    E8 82030600     call    <jmp.&MFC42.#537_CString::CStrin>
0042C1A4    68 A00F0000     push    0FA0
0042C1A9    889C24 00010000 mov     [esp+100], bl
0042C1B0    E8 41030600     call    <jmp.&MFC42.#823_operator new>
0042C1B5    83C4 04         add     esp, 4
0042C1B8    8D4C24 20       lea     ecx, [esp+20]
0042C1BC    C68424 FC000000>mov     byte ptr [esp+FC], 0C
0042C1C4    E8 4B030600     call    <jmp.&MFC42.#800_CString::~CStri>
0042C1C9  ^ EB CB           jmp     short 0042C196
0042C1CB    8D4C24 30       lea     ecx, [esp+30]

这里在42C196~42C1C9之间也是一个死循环,只要把前面的三个跳转中任何一个改成强制跳转即可跳过这个自校验,程序中一共可以找到两处这种校验方式,以上称为自校验二。

第三种自校验,是以直接退出程序为目的的,当选择保存棋谱的时候会出现被调试的程序无法处理异常的问题而直接退出,我们下CreateFileA断点,当点击保存的时候程序断下,两次Ctrl+F9返回程序领空,来到这里:


0043E8CF    E8 8EDC0400     call    <jmp.&MFC42.#3318_CFile::GetLength>
0043E8D4    3D 007E0500     cmp     eax, 57E00
0043E8D9    74 22           je      short 0043E8FD
0043E8DB    E8 2ADD0400     call    <jmp.&MFC42.#1168_AfxGetModuleState>
0043E8E0    8B48 04         mov     ecx, [eax+4]
0043E8E3    6A 00           push    0
0043E8E5    C681 C4000000 0>mov     byte ptr [ecx+C4], 1
0043E8EC    C646 44 01      mov     byte ptr [esi+44], 1
0043E8F0    C686 72DC0200 0>mov     byte ptr [esi+2DC72], 1
0043E8F7    FF15 38EB4900   call    [<&msvcrt.exit>]              ; MSVCRT.exit
0043E8FD    8D4C24 1C       lea     ecx, [esp+1C]

这里又验证了一下程序的长度,不等于57E00就退出程序,因此把43E8D9这里的跳转也改成强制跳转即可,同时记住这个自校验的关键代码:3D 00 7E 05 00 74 22,在程序中找这样的关键代码,一共有三处,修改其前面的跳转即可,以上称为自校验三。

经过我的使用来看,程序好像一共就这三种自校验,一共有10处,可见作者在防破解这方面倒是颇下了一番工夫的。下面我们来去掉恼人的Nag窗口。Nag窗口一共有两处,一处是退出的时候会有提示问你是否要注册,一处是程序运行一段时间之后弹出窗口,要求注册,而且这种弹出窗口在刚运行的时候不会出现,当有弹出之后就会经常性弹出,在我最开始没注册的时候只好每次先退出程序再进入,后来给我逼的没办法了我就去注册了一份:P

先看第一处,这个比较容易,下MessageBoxA断点,关闭程序之后断下,几次Ctrl+F9之后回到这里:


004677FF    84C0            test    al, al
00467801    75 4A           jnz     short 0046784D
00467803    8D4C24 08       lea     ecx, [esp+8]
00467807    E8 144D0200     call    <jmp.&MFC42.#540_CString::CString>
0046780C    68 E0F80000     push    0F8E0
00467811    8D4C24 0C       lea     ecx, [esp+C]
00467815    C68424 50030000>mov     byte ptr [esp+350], 1
0046781D    E8 164D0200     call    <jmp.&MFC42.#4160_CString::LoadStringA>
00467822    8B5424 08       mov     edx, [esp+8]
00467826    6A 00           push    0
00467828    6A 04           push    4
0046782A    52              push    edx
0046782B    E8 624D0200     call    <jmp.&MFC42.#1200_AfxMessageBox>

非常简单,把467801处的jnz修改为jmp即可,这样就可以去除退出程序时候的断点了。

第二处,程序运行时弹出的Nag窗口,找ASCII字符串参考”4444444″,找到来到这里:


0042E123    E8 6AE70500     call    <jmp.&MFC42.#2514_CDialog::DoModal>     ; 这个就是弹出窗口
0042E128    8BD8            mov     ebx, eax
0042E12A    83FB 01         cmp     ebx, 1
0042E12D    75 11           jnz     short 0042E140
0042E12F    8A86 A8DD0200   mov     al, [esi+2DDA8]
0042E135    84C0            test    al, al
0042E137    75 07           jnz     short 0042E140
0042E139    8BCE            mov     ecx, esi
0042E13B    E8 5090FFFF     call    00427190
0042E140    68 189A4B00     push    004B9A18                                ; 4444444

往上翻,可以看到这里:


0042E059    84C0            test    al, al
0042E05B    0F85 67010000   jnz     0042E1C8
0042E061    8A86 F6CC0200   mov     al, [esi+2CCF6]
0042E067    84C0            test    al, al
0042E069    75 0E           jnz     short 0042E079
0042E06B    8A86 F5CC0200   mov     al, [esi+2CCF5]
0042E071    84C0            test    al, al
0042E073    0F84 4F010000   je      0042E1C8

修改42E05B处的跳转为jmp强制跳转即可,42E073处修不修改都可以了。

程序中还有一处”4444444″的字符串参考,找到后继续往上翻,来到这里:


0043D669    84C0            test    al, al
0043D66B    74 0E           je      short 0043D67B
0043D66D    8A86 AADD0200   mov     al, [esi+2DDAA]
0043D673    84C0            test    al, al
0043D675    0F85 72010000   jnz     0043D7ED
0043D67B    8A86 F6CC0200   mov     al, [esi+2CCF6]
0043D681    84C0            test    al, al
0043D683    75 0E           jnz     short 0043D693
0043D685    8A86 F5CC0200   mov     al, [esi+2CCF5]
0043D68B    84C0            test    al, al
0043D68D    0F84 5A010000   je      0043D7ED
0043D693    8A46 5D         mov     al, [esi+5D]
0043D696    84C0            test    al, al
0043D698    0F85 4F010000   jnz     0043D7ED

把43D675、43D68D和43D698处的跳转都改成强制跳转就可以了,这样就可以去除程序运行之中的恼人的Nag窗口了。

至此,程序的自校验和Nag窗口已经全部去除,当初破解的时候也没想详细分析注册算法,所以就用了这样的方式破解了,不过自己越来越不喜欢用爆破的版本了,哪怕是自己爆破的也觉得不爽,看来还是要找作者要一份新的Key啊,hoho。



人到中年
2007年10月5日 10:02:45

兄弟,你是网络高手,我就没那本事了,你能把破解了的版本给我发一个吗?我让试试是真的还是假的?

ssfighter
2007年10月5日 10:35:44

呵呵,这和网络没啥关系,我连网络菜鸟都算不上。不过你要求破解就直说,何必拐弯抹角,欲盖弥彰?

开心的小胖
2007年10月13日 09:06:54

老大真了不起 可以给我发一个破解的吗

complexstarry
2007年10月18日 18:43:37

呵呵,非常感谢。第一处自校验应该是六处。
我想请教一下,脱壳这个程序重建输入表时,ImportREC无法判断IAT的地址与大小,手动填上后,怎么无效指针那么多,应该那里出了问题。以前也没有破解过什么,从网上下了个教程就开始动手,现在还是一头雾水。
我填的IAT的地址是DFFC,大小是186C8,怎么好像太大了。

ssfighter
2007年10月18日 19:02:07

我修改的这个版本应该和你所修改的版本不太一样,尽管都是8.76,因为我前两天又重新试验过一次,和之前的很多地址都不一样了。所以自校验有几处我也说不清。
另外,这个壳就是UPX变形壳啊,用工具都能脱,我怀疑你是找错了OEP。

complexstarry
2007年10月18日 21:22:06

多谢了,我再试试看。

ssfighter
2007年10月21日 01:23:02

我又看了一下8.76E版本,估计就是你说的那个,OEP应该是48D4AC,直接获取输入表就可以了,你可以再试试

围棋爱好者
2007年10月24日 23:57:47

不知道能将破解版的围棋助手发给我一份。留下了电邮。非常感谢您。

正西
2007年11月1日 15:33:50

非常喜欢这个软件,可惜购买后重装系统很不方便。为此研究了2天OD,还是没爆破成功。希望能给发一份修改后的文件,一是为了自己研究围棋,另外可以研究一下自己的OD脱壳错在哪了。
在此先谢谢了!!

溫州流影
2007年11月27日 00:14:36

可以直接~給我破解好的嗎??
拜託囉~

雪卷千堆
2007年11月30日 22:58:38

真心的佩服你是高手,谢谢您说了这么多,可是我们菜鸟看半天还是一头雾水,能不能直接发个注册码或者是注册机,或者破解版给大家,我相信天下所有与我一样的电脑菜鸟—围棋爱好者将感激不尽!!

二泉映月
2007年12月16日 02:55:07

你好,ssfighter,能给我发个破解吗?我看不懂网页里说的,我孩子在学围棋,所以想找些围棋方面的软件,非常感谢!

moke707
2008年01月14日 20:29:13

我也是啊
看不懂 啊 能不能直接发破解的给我啊

笑笑神君
2008年01月16日 15:03:05

哥们我用FPE2001(XP破解版)就破解了他,强吧?
首先运行围棋助手,然后运行FPE2001
用FPE2001分别找到42E05B,43D675、43D68D和43D698处, 将指令74,75或0F85改成:
75>改成EB
74>改成EB
0F85>改成EB00
然后回到围棋助手界面,继续进行读谱这时会出现异常退出.然后退出FPE.再进围棋助手OK.

笑笑神君
2008年01月16日 15:40:56

0F85改成0F84

笑笑神君
2008年01月16日 15:47:11

游戏修改器修改只是修改内存中的程序每次只能同时运行好麻烦最新方法本人开发中

ssfighter
2008年01月17日 12:13:38

你用UltraEdit这样的16进制修改工具直接改exe文件不就得了?

tudi
2008年05月10日 12:47:01

真高手哦。

zpf
2008年06月17日 16:21:00

这里有个破解补丁.我早搞过这个东西.虽然保护很多.但只要不脱壳.就不用管很多检查的地方.
http://www.namipan.com/d/e0db8e82791b9440d3b1f3d5b7962f0f9c4873ca00200100

ssfighter
2008年06月17日 19:02:52

谢谢zpf大哥的指教
这个程序我后来也找到了爆破点,可以实现不脱壳破解,不过后来曾经想研究注册算法,可惜一直没搞定,不知道zpf大哥有没有什么办法?

菜鸟
2008年08月1日 21:32:49

ssfighter,您好,您这篇文章写的非常详细,想按照您文章所写再动手实践一遍,但是遇到一些问题,可能由于水平有限,问题过于菜。
1、使用工具脱完壳,用OD挂上后,显示程序是经过压缩,是否要继续.
2、找到您文章里所说的第一种自校验,修改完汇编代码后,想复制回二进制文件,但是出现错误,说在可执行程序中无法定位数据。
3、想根据机器码找到其他几个自校验的代码,但是无法找到。
问题可能过于简单,麻烦您了,谢谢!

ssfighter
2008年08月2日 14:30:41

@菜鸟:
我给您回邮件了,请注意查收

围棋爱好者
2008年12月28日 12:53:45

ssfighter,您好,能详细说一下是用什么软件脱壳吗?在哪里有下载?谢谢

发表评论

昵称:  (必须)
邮件:  (必须)
网址: 
评论: