首页
社区
课程
招聘
[原创]万能五笔2004的修改后续(去除Bug及自校验,打造绿色五笔)
发表于: 2005-2-17 16:53 15724

[原创]万能五笔2004的修改后续(去除Bug及自校验,打造绿色五笔)

2005-2-17 16:53
15724

【原创】万能五笔2004的修改后续(去除Bug及自校验,打造绿色五笔)

                         ――――手把手系列之七

【破解作者】 jackily
【作者主页】 http://estudy.ys168.com
             http://jackily.ys168.com
【使用工具】 ollydbg、 stripper、reshacker
【破解平台】 Win9x/NT/2000/XP
【加壳方式】 ASPack 2.12 -> Alexey Solodovnikov
【破解声明】 本破解纯以学习和交流为目的,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------

软件名称:万能五笔2004:EXE外挂高级6.41版
      
万能五笔2004自实行免费以来,一直BUG不断。从外挂6.1版至2月15日最新发布的6.41版,都存在着强行更改用户主页为265.com的问题,而这个6.4和6.41版更是变本加厉,又出来了个选字搜,每次调用万能五笔,其均自动将“选字搜”selectso.exe加载,而退出时,却将“选字搜”置之不理,非常不便。于是决定再次拿起手术刀,主要目标“选字搜”。

首先,用PEID查壳,发现ASPack 2.12,用stripper去掉外衣。用ollydbg加载,先解决了265.com的问题。(关于主页修改的问题请参见本人拙文《万能五笔2004的修改》,http://bbs.pediy.com/showthread.php?threadid=6168)考虑到每次启动五笔,selectso.exe都会运行,猜想会用到CreateProcessA函数,于是bpx CreateProcessA。果然在004018c3处断下,0040189C处正是“selectso.exe”。代码分析如下:

00401808   /$  55                   push ebp
00401809   |.  8BEC                 mov ebp,esp
0040180B   |.  81EC E0050000        sub esp,5E0
00401811   |.  53                   push ebx
00401812   |.  56                   push esi
00401813   |.  57                   push edi
00401814   |.  33DB                 xor ebx,ebx
00401816   |.  68 0C9C4500          push _wnwb.00459C0C                        ; /MutexName =
"FinallyIMadeItWorkThisIsMutexForWnwb"
0040181B   |.  53                   push ebx                                   ; |InitialOwner => FALSE
0040181C   |.  53                   push ebx                                   ; |pSecurity => NULL
0040181D   |.  FF15 F4014500        call dword ptr ds:[<&KERNEL32.CreateMutexA>; \CreateMutexA
00401823   |.  8BF0                 mov esi,eax
00401825   |.  FF15 F8014500        call dword ptr ds:[<&KERNEL32.GetLastError>; [GetLastError
0040182B   |.  3D B7000000          cmp eax,0B7                                ; 判断wnwb.exe是否已经加载
00401830   |.  75 20                jnz short _wnwb.00401852                   ;否,跳到401852继续
00401832   |.  56                   push esi                                   ; /hObject
00401833   |.  FF15 FC014500        call dword ptr ds:[<&KERNEL32.CloseHandle>>; \CloseHandle
00401839   |.  53                   push ebx                                   ; /Title => NULL
0040183A   |.  68 009C4500          push _wnwb.00459C00                        ; |Class = "WNWB Input"
0040183F   |.  FF15 B8034500        call dword ptr ds:[<&USER32.FindWindowA>]  ; \FindWindowA
00401845   |.  3BC3                 cmp eax,ebx                                
00401847   |.  0F84 6A040000        je _wnwb.00401CB7
0040184D   |.  E9 9D030000          jmp _wnwb.00401BEF
00401852   |>  6A 10                push 10
00401854   |.  33C0                 xor eax,eax
00401856   |.  59                   pop ecx
00401857   |.  8DBD 6CFFFFFF        lea edi,dword ptr ss:[ebp-94]
0040185D   |.  C785 68FFFFFF 440000>mov dword ptr ss:[ebp-98],44
00401867   |.  6A 40                push 40
00401869   |.  F3:AB                rep stos dword ptr es:[edi]
0040186B   |.  A0 DC1C4700          mov al,byte ptr ds:[471CDC]
00401870   |.  59                   pop ecx
00401871   |.  8885 88FCFFFF        mov byte ptr ss:[ebp-378],al
00401877   |.  33C0                 xor eax,eax
00401879   |.  8DBD 89FCFFFF        lea edi,dword ptr ss:[ebp-377]
0040187F   |.  BE 04010000          mov esi,104
00401884   |.  F3:AB                rep stos dword ptr es:[edi]
00401886   |.  66:AB                stos word ptr es:[edi]
00401888   |.  AA                   stos byte ptr es:[edi]
00401889   |.  8D85 88FCFFFF        lea eax,dword ptr ss:[ebp-378]
0040188F   |.  56                   push esi
00401890   |.  50                   push eax
00401891   |.  E8 2B160200          call _wnwb.00422EC1
00401896   |.  8D85 88FCFFFF        lea eax,dword ptr ss:[ebp-378]
0040189C   |.  68 F09B4500          push _wnwb.00459BF0                    ;  ASCII "\selectso.exe"
004018A1   |.  50                   push eax
004018A2   |.  E8 59E90200          call _wnwb.00430200
004018A7   |.  83C4 10              add esp,10
004018AA   |.  8D45 AC              lea eax,dword ptr ss:[ebp-54]
004018AD   |.  50                   push eax                                   ; /pProcessInfo
004018AE   |.  8D85 68FFFFFF        lea eax,dword ptr ss:[ebp-98]              ; |
004018B4   |.  50                   push eax                                   ; |pStartupInfo
004018B5   |.  53                   push ebx                                   ; |CurrentDir
004018B6   |.  53                   push ebx                                   ; |pEnvironment
004018B7   |.  53                   push ebx                                   ; |CreationFlags
004018B8   |.  53                   push ebx                                   ; |InheritHandles
004018B9   |.  53                   push ebx                                   ; |pThreadSecurity
004018BA   |.  53                   push ebx                                   ; |pProcessSecurity
004018BB   |.  8D85 88FCFFFF        lea eax,dword ptr ss:[ebp-378]             ; |
004018C1   |.  53                   push ebx                                   ; |CommandLine
004018C2   |.  50                   push eax                                   ; |ModuleFileName
004018C3   |.  FF15 00024500        call dword ptr ds:[<&KERNEL32.CreateProces>; \CreateProcessA ,加载程序

004018C9   |.  6A 64                push 64                                    ; /Timeout = 100. ms
004018CB   |.  FF75 AC              push dword ptr ss:[ebp-54]                 ; |hObject
004018CE   |.  FF15 04024500        call dword ptr ds:[<&KERNEL32.WaitForSingl>; \WaitForSingleObject
004018D4   |.  FF75 B0              push dword ptr ss:[ebp-50]                 ; /hObject
004018D7   |.  8B3D FC014500        mov edi,dword ptr ds:[<&KERNEL32.CloseHand>; |kernel32.CloseHandle
004018DD   |.  FFD7                 call edi                                   ; \CloseHandle
004018DF   |.  FF75 AC              push dword ptr ss:[ebp-54]                 ; /hObject
004018E2   |.  FFD7                 call edi                                   ; \CloseHandle

以上是加载selectso.exe程序。

....................... 此处代码省略

以下是关键的BUG所在:
00401DC9   |.  FF15 2C024500        call dword ptr ds:[<&KERNEL32.GetSystemTime>] ; \GetSystemTime
00401DCF   |.  E8 2C120200          call _wnwb.00423000                     ;此处为修改265.com主页之调用,有兴趣

可跟入

00401DD4   |.  68 B7324200          push _wnwb.004232B7                           ; /Timerproc = _wnwb.004232B7
00401DD9   |.  68 F4010000          push 1F4                                      ; |Timeout = 500. ms
00401DDE   |.  6A 02                push 2                                        ; |TimerID = 2
00401DE0   |.  FF35 E0FD4600        push dword ptr ds:[46FDE0]                    ; |hWnd = NULL
00401DE6   |.  FF15 C8034500        call dword ptr ds:[<&USER32.SetTimer>]        ; \SetTimer
00401DEC   |.  FF35 E0FD4600        push dword ptr ds:[46FDE0]
00401DF2   |.  E8 B8D40200          call _wnwb.0042F2AF
00401DF7   |.  59                   pop ecx
00401DF8   |.  E8 E9090200          call _wnwb.004227E6
00401DFD   |.  E8 E3180200          call _wnwb.004236E5                           ;此处为自校验,跟入可见代码分析


00401E02   |.  8B35 C4034500        mov esi,dword ptr ds:[<&USER32.PostMessageA>] ;  USER32.PostMessageA

-----------------------------------------------------------------------------------

由00401DFD跟入,自校验之call,也就是判断内存中是否存在selectso.exe,如果是继续,否无条件退出。

004236E5   /$  55                   push ebp
004236E6   |.  8BEC                 mov ebp,esp
004236E8   |.  81EC AC030000        sub esp,3AC
004236EE   |.  53                   push ebx
004236EF   |.  56                   push esi
004236F0   |.  57                   push edi
004236F1   |.  8D85 54FCFFFF        lea eax,dword ptr ss:[ebp-3AC]
004236F7   |.  68 2C010000          push 12C
004236FC   |.  50                   push eax
004236FD   |.  C745 EC 38AA4500     mov dword ptr ss:[ebp-14],_wnwb.0045AA38      ;  ASCII "wnwbio.exe"
00423704   |.  C745 F0 68AB4600     mov dword ptr ss:[ebp-10],_wnwb.0046AB68      ;  ASCII "wnwbio.ime"
0042370B   |.  C745 F4 5CAB4600     mov dword ptr ss:[ebp-C],_wnwb.0046AB5C       ;  ASCII "loadwb.exe"
00423712   |.  C745 F8 C0A94600     mov dword ptr ss:[ebp-8],_wnwb.0046A9C0       ;  ASCII "search.exe"
00423719   |.  E8 A3F7FFFF          call _wnwb.00422EC1
0042371E   |.  8B3D 8C034500        mov edi,dword ptr ds:[<&USER32.PostQuitMessag>;  USER32.PostQuitMessage
00423724   |.  59                   pop ecx
00423725   |.  59                   pop ecx
00423726   |.  8D75 EC              lea esi,dword ptr ss:[ebp-14]
00423729   |.  C745 FC 04000000     mov dword ptr ss:[ebp-4],4
00423730   |.  33DB                 xor ebx,ebx
00423732   |>  8D85 54FCFFFF        /lea eax,dword ptr ss:[ebp-3AC]
00423738   |.  50                   |push eax
00423739   |.  8D85 C0FEFFFF        |lea eax,dword ptr ss:[ebp-140]
0042373F   |.  50                   |push eax
00423740   |.  E8 ABCA0000          |call _wnwb.004301F0
00423745   |.  8D85 C0FEFFFF        |lea eax,dword ptr ss:[ebp-140]
0042374B   |.  68 28994500          |push _wnwb.00459928
00423750   |.  50                   |push eax
00423751   |.  E8 AACA0000          |call _wnwb.00430200
00423756   |.  FF36                 |push dword ptr ds:[esi]
00423758   |.  8D85 C0FEFFFF        |lea eax,dword ptr ss:[ebp-140]
0042375E   |.  50                   |push eax
0042375F   |.  E8 9CCA0000          |call _wnwb.00430200
00423764   |.  83C4 18              |add esp,18
00423767   |.  8D85 C0FEFFFF        |lea eax,dword ptr ss:[ebp-140]
0042376D   |.  50                   |push eax                                     ; /FileName
0042376E   |.  FF15 A0004500        |call dword ptr ds:[<&KERNEL32.GetFileAttribu>; \GetFileAttributesA
00423774   |.  83F8 FF              |cmp eax,-1
00423777   |.  75 03                |jnz short _wnwb.0042377C
00423779   |.  53                   |push ebx
0042377A   |.  FFD7                 |call edi
0042377C   |>  83C6 04              |add esi,4
0042377F   |.  FF4D FC              |dec dword ptr ss:[ebp-4]
00423782   |.^ 75 AE                \jnz short _wnwb.00423732
00423784   |.  8D85 54FCFFFF        lea eax,dword ptr ss:[ebp-3AC]
0042378A   |.  50                   push eax
0042378B   |.  8D85 C0FEFFFF        lea eax,dword ptr ss:[ebp-140]
00423791   |.  50                   push eax
00423792   |.  E8 59CA0000          call _wnwb.004301F0
00423797   |.  8D85 C0FEFFFF        lea eax,dword ptr ss:[ebp-140]
0042379D   |.  68 50AB4600          push _wnwb.0046AB50                           ;  ASCII "\wnwb.exe"
004237A2   |.  50                   push eax
004237A3   |.  E8 58CA0000          call _wnwb.00430200
004237A8   |.  83C4 10              add esp,10
004237AB   |.  8D85 80FDFFFF        lea eax,dword ptr ss:[ebp-280]
004237B1   |.  50                   push eax                                      ; /pFindFileData
004237B2   |.  8D85 C0FEFFFF        lea eax,dword ptr ss:[ebp-140]                ; |
004237B8   |.  50                   push eax                                      ; |FileName
004237B9   |.  FF15 9C004500        call dword ptr ds:[<&KERNEL32.FindFirstFileA>>; \FindFirstFileA ,查找关键

004237BF   |.  50                   push eax                                      ; /hSearch
004237C0   |.  FF15 98004500        call dword ptr ds:[<&KERNEL32.FindClose>]     ; \FindClose
004237C6   |.  399D 98FDFFFF        cmp dword ptr ss:[ebp-268],ebx
004237CC   |.  74 19                je short _wnwb.004237E7
004237CE   |.  399D 94FDFFFF        cmp dword ptr ss:[ebp-26C],ebx
004237D4   |.  74 11                je short _wnwb.004237E7
004237D6   |.  8D45 EC              lea eax,dword ptr ss:[ebp-14]
004237D9   |.  50                   push eax                                      ; /pSystemTime
004237DA   |.  8D85 94FDFFFF        lea eax,dword ptr ss:[ebp-26C]                ; |
004237E0   |.  50                   push eax                                      ; |pFileTime
004237E1   |.  FF15 94004500        call dword ptr ds:[<&KERNEL32.FileTimeToSyste>; \FileTimeToSystemTime
004237E7   |>  68 28AB4600          push _wnwb.0046AB28                           ; /MutexName =
"IsItNecessaryToDisallowMultipleInstance"
004237EC   |.  6A 01                push 1                                        ; |InitialOwner = TRUE
004237EE   |.  53                   push ebx                                      ; |pSecurity
004237EF   |.  FF15 F4014500        call dword ptr ds:[<&KERNEL32.CreateMutexA>]  ; \CreateMutexA
004237F5   |.  8BF0                 mov esi,eax
004237F7   |.  FF15 F8014500        call dword ptr ds:[<&KERNEL32.GetLastError>]  ; [GetLastError
004237FD   |.  3D B7000000          cmp eax,0B7                                   ; 关键比较
00423802   |.  74 03                je short _wnwb.00423807                    ; 内存中已经加载选字搜,跳至00423807继续,否则闪人
00423804   |.  53                   push ebx
00423805   |.  FFD7                 call edi                        ;USER32!POSTQUITMESSAGE,发送退出消息,准备走人了
423807   |>  56                   push esi                                      ; /hObject
00423808   |.  FF15 FC014500        call dword ptr ds:[<&KERNEL32.CloseHandle>]   ; \CloseHandle
0042380E   |.  5F                   pop edi
0042380F   |.  5E                   pop esi
00423810   |.  5B                   pop ebx
00423811   |.  C9                   leave
00423812   \.  C3                   retn

--------------------------------------------------------------------------------

【总结】
有人说,万能五笔无碍乎就是去主页和时间,可这次不同,去主页很简单,而现在是免费版,虽有过期验证代码,但没有接上,因此无时间限制,关键是selectso.exe的自校验。

因为调试过程中发现,无论是将selectso.exe删除,还是将004018c3中的createprocessa去掉,wnwb.exe就一闪而过了。自校验就在004236E5call中的004237FD的CMP,因此,完全去除bug,此版需要三步:
1. 004018C3处,改为6个90,去selectso.exe;
2. 00401DCF处,改为5个90,去265.com主页;
3. 00401DFD处,改为5个90,去selectso.exe的自校验call,或将00423804处改为3个90,去除发送退出消息的call;
这一节中,我们了解了KERNEL32.CreateProcessA、KERNEL32.CreateMutexA和USER32!POSTQUITMESSAGE三个和进程有关的函数,它们是此次破解的关键。
最后,对于控制条中的功能提示和“关于”中的提示,用reshacker将资源修改即可。

                                    jackily
                                    二零零五年二月十六日

本人空间 http://esudy.ys168.com 和 http://jackily.ys168.com 中提供全新绿色安装版,欢迎试用!
---------------------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (28)
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
辛苦了,学习
2005-2-17 17:06
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
学习!
2005-2-17 17:31
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
支持楼主,学习学习!
2005-2-17 17:39
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
5
学习
偶用的是一个叫“念青“的五笔,很老的好像,能用就行
2005-2-17 17:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错不错。
不过还有一点你没发现,就是过期。
调整系统时间,要调年份,程序就会提示你过期了。
脱壳后反汇编也能轻松发现过期的字符串提示。
至于“选字搜”,因其有E文单词功能,所以我没考虑搞掉他。
2005-2-17 20:33
0
雪    币: 214
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
好文,学习中
2005-2-17 20:44
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
8
支持jackily!
2005-2-17 21:47
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
9
万能五笔的安装包是用什么做的,能不能直接把里面的文件替换了
2005-2-17 21:55
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
请问楼主:如何判断出00401DFD   |.  E8 E3180200          call _wnwb.004236E5 这里为自校验CALL?
2005-2-17 23:01
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
11
偶就用的王码五笔,好像是微软自带的吧
2005-2-17 23:24
0
雪    币: 50
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
五笔推荐使用极点中文和龙文五笔
2005-2-18 09:30
0
雪    币: 272
活跃值: (470)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
13
学习!支持!
2005-2-18 11:18
0
雪    币: 265
活跃值: (430)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
14
最初由 ljy3282393 发布
请问楼主:如何判断出00401DFD |. E8 E3180200 call _wnwb.004236E5 这里为自校验CALL?


原文最后部分重新做了修改,一看便知。
2005-2-18 14:12
0
雪    币: 194
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
很难用得输入法!
用极点吧
www.freewb.net
2005-2-18 20:03
0
雪    币: 50161
活跃值: (20630)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
16
最初由 baron 发布
很难用得输入法!
用极点吧
www.freewb.net

同意

http://www.wbfans.com/bbs/list.asp?boardid=3
2005-2-19 19:49
0
雪    币: 265
活跃值: (430)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
17
最初由 baron 发布
很难用得输入法!
用极点吧
www.freewb.net


都说是好,可用了一段时间,觉得它对拼音和五笔的自动识别上不如万能。各有所好吧。呵呵!
2005-2-20 09:58
0
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
又是篇好问啊,学习ing ~
2005-2-20 11:44
0
雪    币: 205
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢楼主好文!我试了几次都没能把自校验去掉!
我从前是使用万能五笔的,而且发现有很多人喜欢这个,尽管我现在只用加笔加加。
2005-2-20 15:06
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
20
很不错呀!
还可以从selectso.exe入手的。selectso.exe没有加壳,让selectso.exe自关闭不是很合法嘛。不要让selectso.exe一运行就关闭,入手点在它会每过几秒更新单词的地方,在更新单词前做个跳转,跳到程序退出命令就好了。这样不是简单多了。
我以前一直用万能五笔的,但现在用极点五笔了,有时也关注一下万能五笔。嘿嘿。
大家上网有空时来我的网站坐坐,有事就不用来啦。

http://www.ohko.com
2005-2-20 21:25
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
21
我这里有2001版的,也很好用的。我做的绿色包,大家如果想要,我可以发给他,只有1MB左右大小。
2005-2-20 21:30
0
雪    币: 205
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
最初由 ohuangkeo 发布
很不错呀!
还可以从selectso.exe入手的。selectso.exe没有加壳,让selectso.exe自关闭不是很合法嘛。不要让selectso.exe一运行就关闭,入手点在它会每过几秒更新单词的地方,在更新单词前做个跳转,跳到程序退出命令就好了。这样不是简单多了。
我以前一直用万能五笔的,但现在用极点五笔了,有时也关注一下万能五笔。嘿嘿。
大家上网有空时来我的网站坐坐,有事就不用来啦。
http://www.ohko.com


是的,我曾有这种想法,但没有成功。好象是 selectso.exe 先启动,然后万能五笔再启动,启动完以后校验内存中是不是有 selectso.exe,没有的话就自动退出。
2005-2-21 00:08
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
23
所以才说:

入手点在它会每过几秒更新单词的地方,在更新单词前做个跳转,跳到程序退出命令就好了。
2005-2-21 01:06
0
雪    币: 265
活跃值: (430)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
24
最初由 ohuangkeo 发布
很不错呀!
还可以从selectso.exe入手的。selectso.exe没有加壳,让selectso.exe自关闭不是很合法嘛。不要让selectso.exe一运行就关闭,入手点在它会每过几秒更新单词的地方,在更新单词前做个跳转,跳到程序退出命令就好了。这样不是简单多了。


也曾想过这样,不过还是直接去除的好。
2005-2-21 14:32
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
25
说得对,不运行selectso.exe可以少运行的程序,加快速度,我只是建议。嘿嘿。我觉得万能五笔有个最大的好处,就是输入英文可以输出中文,输入中文还可以输出英文。比如输入“china”就输出“中国”,这样不是快多了!!!
2005-2-21 15:19
0
游客
登录 | 注册 方可回帖
返回
//