最新消息:因从typecho切换到wordpress, 由于转换导入问题,文章可能存在部分乱码或者排版问题,逐个排查修复中...

玩玩解密:某输入法破解

玩玩解密 admin 898浏览 0评论

原文发表在霏凡论坛
发表时间: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 » 玩玩解密:某输入法破解

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址