原文发表在霏凡论坛
发表时间:2008-08-31 01:13:17
全文如下:
今天去软件站转悠,看看有什么好玩的软件。
突然眼前一亮,部首输入法!
于是下来玩玩。突然发现这是共享软件,需要注册。
由于输入法的特殊性,无法直接用OD像调用EXE来调试它。
即使可以用LoadDll来调用,但因输入法的注册菜单是在输入法的状条上点击右键所得的,如果用它来载入,切又无法看到输入法。
相当于只是静态调试了。等于浪费了OD。
怎么办呢?
我们想办法绕一下。Let’s go!
OD载入记事本。切换一下输入法到这个部首输入法。Alt+E之后找到bushou.ime可执行模块,双击来到如下输入法的反汇编代码。
右键查找字符串参考后来到注册算法附近。下面是关键代码。其中加粗变蓝部分是关键算法(Linc注:因现已以代码显示,不便加粗,特分隔开加以备注,见中间一段)。由于已经打开了记事本,由它再调用输入法,因此可以找到输入法的状态条,找到注册菜单。
可以输入假码进行分析。
0123B834 . 52 push edx ; |Buffer
0123B835 . 68 EA030000 push 3EA ; |/ControlID = 3EA (1002.)
0123B83A . 53 push ebx ; ||hWnd
0123B83B . FF15 B0B22401 call dword ptr [<&USER32.GetDlgItem>] ; |\GetDlgItem
0123B841 . 50 push eax ; |hWnd
0123B842 . FF15 78B22401 call dword ptr [<&USER32.GetWindowTex>; \(initial cpu selection)
0123B848 . BE 24B72401 mov esi, 0124B724 ; 部首输入法
0123B84D . 8D4424 34 lea eax, dword ptr [esp+34]
(Linc注:下面一段是关键算法)
0123B851 > 8A08 mov cl, byte ptr [eax]
0123B853 . 3A0E cmp cl, byte ptr [esi]
0123B855 . 75 1A jnz short 0123B871
0123B857 . 84C9 test cl, cl
0123B859 . 74 12 je short 0123B86D
0123B85B . 8A48 01 mov cl, byte ptr [eax+1]
0123B85E . 3A4E 01 cmp cl, byte ptr [esi+1]
0123B861 . 75 0E jnz short 0123B871
0123B863 . 83C0 02 add eax, 2
0123B866 . 83C6 02 add esi, 2
0123B869 . 84C9 test cl, cl
0123B86B .^ 75 E4 jnz short 0123B851
0123B86D > 33C0 xor eax, eax
0123B86F . EB 05 jmp short 0123B876
0123B871 > 1BC0 sbb eax, eax
0123B873 . 83D8 FF sbb eax, -1
0123B876 > 85C0 test eax, eax
0123B878 . 0F85 82000000 jnz 0123B900
0123B87E . 8D4424 08 lea eax, dword ptr [esp+8]
0123B882 . 50 push eax
0123B883 . E8 38C0FFFF call 012378C0
0123B888 . 83C4 04 add esp, 4
0123B88B . 85C0 test eax, eax
0123B88D . 74 15 je short 0123B8A4
0123B88F . 8D4C24 08 lea ecx, dword ptr [esp+8]
0123B893 . 51 push ecx ; /pHandle
0123B894 . 68 0CB52401 push 0124B50C ; |software\microsoft\windows\currentversion
0123B899 . 68 01000080 push 80000001 ; |hKey = HKEY_CURRENT_USER
0123B89E . FF15 0CB02401 call dword ptr [<&ADVAPI32.RegCreateK>; \RegCreateKeyA
0123B8A4 > 8B4424 08 mov eax, dword ptr [esp+8]
0123B8A8 . 8D5424 0C lea edx, dword ptr [esp+C]
0123B8AC . 52 push edx
0123B8AD . 68 1CF02401 push 0124F01C ; 部首输入法
0123B8B2 . 50 push eax
0123B8B3 . E8 28C0FFFF call 012378E0
0123B8B8 . 8B5424 18 mov edx, dword ptr [esp+18]
0123B8BC . 83C4 0C add esp, 0C
0123B8BF . 6A 04 push 4 ; /BufSize = 4
0123B8C1 . 8D4C24 24 lea ecx, dword ptr [esp+24] ; |
0123B8C5 . 51 push ecx ; |Buffer
0123B8C6 . 6A 04 push 4 ; |ValueType = REG_DWORD
0123B8C8 . 6A 00 push 0 ; |Reserved = 0
0123B8CA . 68 20B72401 push 0124B720 ; |sn
0123B8CF . 52 push edx ; |hKey
0123B8D0 . C74424 38 010>mov dword ptr [esp+38], 1 ; |
0123B8D8 . FF15 00B02401 call dword ptr [<&ADVAPI32.RegSetValu>; \RegSetValueExA
0123B8DE . 8B4424 0C mov eax, dword ptr [esp+C]
0123B8E2 . 8B35 04B02401 mov esi, dword ptr [<&ADVAPI32.RegCl>; ADVAPI32.RegCloseKey
0123B8E8 . 50 push eax ; /hKey
0123B8E9 . FFD6 call esi ; \RegCloseKey
0123B8EB . 8B4C24 08 mov ecx, dword ptr [esp+8]
0123B8EF . 51 push ecx ; /hKey
0123B8F0 . FFD6 call esi ; \RegCloseKey
0123B8F2 . 6A 00 push 0
0123B8F4 . 68 14B72401 push 0124B714 ; 注册成功
0123B8F9 . 68 F8B62401 push 0124B6F8 ; 感谢您使用五笔部首输入法
0123B8FE . EB 0C jmp short 0123B90C
0123B900 > 6A 00 push 0
0123B902 . 68 ECB62401 push 0124B6EC ; 注册失败
0123B907 . 68 C4B62401 push 0124B6C4 ; 请访问www.shurufa.org/sn.htm获取注册码
0123B90C > 6A 00 push 0 ; |hOwner = NULL
0123B90E . FF15 BCB22401 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
0123B914 > 6A 00 push 0 ; /Result = 0; Case 2 of switch 0123B7F0
0123B916 . 53 push ebx ; |hWnd
0123B917 . FF15 B4B22401 call dword ptr [<&USER32.EndDialog>] ; \EndDialog
0123B91D > B8 01000000 mov eax, 1
0123B922 > 8B8C24 340100>mov ecx, dword ptr [esp+134]
0123B929 . 5E pop esi
0123B92A . 5B pop ebx
0123B92B . 33CC xor ecx, esp
0123B92D . E8 AA370000 call 0123F0DC
0123B932 . 81C4 30010000 add esp, 130
0123B938 . C2 1000 retn 10
OD动态调试分析发现,注册码逐位进行比较。开始比较纳闷的是,为什么我输入一个字母a即16进制61怎么会与B2进行比较。后来通过对内存地址跟踪才知道,原来注册码是中文的。呵呵~
就是这里 0012F828 B2 BF CA D7 CA E4 C8 EB B7 A8 部首输入法..P?.
当然了,更重要一点是发现注册码就是固定的“部首输入法”五个字!
不过奇怪的是,软件注册与不注册好像也没啥区别。即使注册了,注册界面上也是原来的样子。难道要重启系统生效?这些不太重要,就不在讨论了。
PS:转载请注明作者和出处!
转载请注明:Linc Hu » 玩玩解密:某输入法破解