• 标 题:EmEditor v3 Version 3.09 汉化版注册码算法分析 (8千字)
  • 作 者:chn-boy
  • 时 间:2001-1-9 5:11:05
  • 链 接:http://bbs.pediy.com

EmEditor v3 Version 3.09 汉化版注册码算法分析

软件名称:EmEditor v3 Version 3.09
下载地址:http://www.inhua.com/EmEditor.htm
软件说明:简单好用的文本编辑器,支持多种配置,自定义颜色、字体、工具栏、快捷键设置,可以调整行距,避免中文排列过于紧密,
          具有选择文本列块的功能(按ALT 键拖动鼠标),并允许无限撤消、重做,总之功能多多,使用方便,是替代记事本的最佳编辑
          器。
调试工具:SoftICE 4.05、W32dsm89
调试平台:Win2K

    作者:chn-boy
    日期:2001-1-9



【第一步】:
    下中断:bpx GetWindowTextW do "d esp->8; p ret; ",然后输入你的Virtual Code,点注册。我输入的是:9999 8888 7777 6666
程序拦断在如下代码段处:

:004173CD 53                      push ebx
:004173CE 8D86F2030000            lea eax, dword ptr [esi+000003F2]
:004173D4 53                      push ebx
:004173D5 50                      push eax
:004173D6 FF7508                  push [ebp+08]
:004173D9 FF1584334300            Call dword ptr [00433384]  / GetWindowTextW()
:004173DF 668907                  mov word ptr [edi], ax  / 中断拦断在此,四个输入框,你将会被拦断四次
                                                          / 每次将十进制值返回给ax,如9999 = 0x270F, 那么 AX = 270F
                                                          / 为了表达方便,我分别用①、②、③、④来表示
:004173E2 46                      inc esi
:004173E3 47                      inc edi
:004173E4 47                      inc edi
:004173E5 83FE04                  cmp esi, 00000004  / 是不是有了四个窗口输入?
:004173E8 7CE3                    jl 004173CD
:004173EA 8D45F4                  lea eax, dword ptr [ebp-0C]  / 将得到的四个值连续放到eax偏移处
                                                              / 此处,用 d eax,可以查看到你输入的四个十进制值
:004173ED 50                      push eax
:004173EE E8F5FEFFFF              call 004172E8  / 核心处,判断算法,查看输入的注册码是否正确?

:004173F3 3BC3                    cmp eax, ebx  / 如果 eax = ebx ,那么输入正确
:004173F5 5F                      pop edi
:004173F6 742A                    je 00417422
:004173F8 33C9                    xor ecx, ecx
:004173FA 83F802                  cmp eax, 00000002
:004173FD 0F95C1                  setne cl



【第二步】:Call 004172EB代码为:
:004172E8 56                      push esi
:004172E9 8B742408                mov esi, dword ptr [esp+08]
:004172ED 57                      push edi
:004172EE 6A0A                    push 0000000A
:004172F0 0FB706                  movzx eax, word ptr [esi]  / ①
:004172F3 99                      cdq
:004172F4 59                      pop ecx  / ecx = 0x0A = 10
:004172F5 F7F9                    idiv ecx
:004172F7 3DAB000000              cmp eax, 000000AB  / ①÷10 是否等于AB,也就是看①是否为0x6AE=1710
:004172FC 7405                    je 00417303        / 是,则正确,也就是说①必须为1710
:004172FE 6A01                    push 00000001
:00417300 58                      pop eax
:00417301 EB15                    jmp 00417318
:00417303 668B7E06                mov di, word ptr [esi+06]  / ④
:00417307 56                      push esi
:00417308 E834FFFFFF              call 00417241  / 此Call为:用①、②、③进行一系列运算,得到一个结果,假设为⑤
                                                / 最后结果返回到 [esi+06]
:0041730D 85C0                    test eax, eax
:0041730F 7507                    jne 00417318
:00417311 663B7E06                cmp di, word ptr [esi+06]  / 看看④是否等于⑤?相等,则注册成功
:00417315 0F95C0                  setne al
:00417318 5F                      pop edi
:00417319 5E                      pop esi
:0041731A C20400                  ret 0004



【第三步】:Call 00417241代码为:
:00417241 56                      push esi
:00417242 8B742408                mov esi, dword ptr [esp+08]
:00417246 668B4602                mov ax, word ptr [esi+02]    / ax = ②
:0041724A 6683660600              and word ptr [esi+06], 0000
:0041724F 663D0F27                cmp ax, 270F
:00417253 0F8788000000            ja 004172E1
:00417259 668B4E04                mov cx, word ptr [esi+04]  / cx = ③
:0041725D 6681F90F27              cmp cx, 270F
:00417262 777D                    ja 004172E1
:00417264 6685C0                  test ax, ax
:00417267 7474                    je 004172DD
:00417269 663DAE08                cmp ax, 08AE    / 0x08AE = 2222
:0041726D 746E                    je 004172DD
:0041726F 663D2E16                cmp ax, 162E    / 0x162E = 5678 ,第二个窗口中不能输入2222或5678
:00417273 7468                    je 004172DD
:00417275 53                      push ebx
:00417276 55                      push ebp
:00417277 57                      push edi
:00417278 6A0A                    push 0000000A
:0041727A 0FB7F9                  movzx edi, cx                / edi = ③
:0041727D 0FB70E                  movzx ecx, word ptr [esi]    / ecx = ①
:00417280 0FB7C0                  movzx eax, ax                / eax = ②
:00417283 89442418                mov dword ptr [esp+18], eax
:00417287 8BC1                    mov eax, ecx                / eax = ③
:00417289 99                      cdq
:0041728A 5B                      pop ebx
:0041728B F7FB                    idiv ebx                    / eax = ③÷10
:0041728D 6A64                    push 00000064
:0041728F 5D                      pop ebp
:00417290 55                      push ebp
:00417291 8BD8                    mov ebx, eax                / ebx = ③÷10
:00417293 8BC7                    mov eax, edi
:00417295 99                      cdq
:00417296 F7FD                    idiv ebp                    / eax = ③÷100
:00417298 8B542418                mov edx, dword ptr [esp+18]  / edx = ②
:0041729C 03D3                    add edx, ebx
:0041729E 03C2                    add eax, edx
:004172A0 03C7                    add eax, edi                / eax = ②+③+③÷10+③÷100
:004172A2 5F                      pop edi
:004172A3 99                      cdq
:004172A4 F7FF                    idiv edi                    / eax = (②+③+③÷10+③÷100)÷100的商
                                                              / edx 为余数
:004172A6 8B442414                mov eax, dword ptr [esp+14]
:004172AA 55                      push ebp
:004172AB 5B                      pop ebx
:004172AC 55                      push ebp
:004172AD 8B3C954C7F4300          mov edi, dword ptr [4*edx+00437F4C]  / 用余数查表,表可以用 d 00437F4C 查看

。。。。。。    下面的算法分析同前,不再一一列出    。。。。。。

:004172B4 99                      cdq
:004172B5 6BFF64                  imul edi, 00000064
:004172B8 F7FB                    idiv ebx
:004172BA 8BD8                    mov ebx, eax
:004172BC 8BC1                    mov eax, ecx
:004172BE 99                      cdq
:004172BF F7FD                    idiv ebp
:004172C1 03CB                    add ecx, ebx
:004172C3 03C1                    add eax, ecx
:004172C5 59                      pop ecx
:004172C6 99                      cdq
:004172C7 F7F9                    idiv ecx
:004172C9 8B04954C7F4300          mov eax, dword ptr [4*edx+00437F4C]
:004172D0 03F8                    add edi, eax
:004172D2 33C0                    xor eax, eax
:004172D4 66897E06                mov word ptr [esi+06], di      / 将用①、②、③的值算出的值赋给 [esi+06]
                                                                / 此处得到的di就是⑤,在SoftICE环境下用?di
                                                                / 得到的十进制的值就是你要输入的第4个窗口的数字号码
:004172D8 5F                      pop edi
:004172D9 5D                      pop ebp
:004172DA 5B                      pop ebx
:004172DB EB07                    jmp 004172E4
:004172DD 6A02                    push 00000002
:004172DF EB02                    jmp 004172E3
:004172E1 6A01                    push 00000001
:004172E3 58                      pop eax
:004172E4 5E                      pop esi
:004172E5 C20400                  ret 0004



【结果】
    经过跟踪,得到注册码为:1710 8888 7777 5651

【后记】
    写文章用的时间比跟踪、研究算法的时间要长的多得多。:(
    这篇文章就是用这个软件写成,感觉这个软件真的不错。:)


                                                                    2001年1月9日 by chn-boy

  • 标 题:看看 (146字)
  • 作 者:[最弱智]
  • 时 间:2001-1-9 9:59:35

>①÷10 是否等于AB,也就是看①是否为0x6AE=1710
>是,则正确,也就是说①必须为1710

这位老兄真是可爱啊。1711整除10难道不等于171么?1712呢?

  • 标 题:是,应该有10个,从1710~1719,呵呵,犯晕了。多谢指教! (空)
  • 作 者:chn-boy
  • 时 间:2001-1-9 12:34:11
  • 链 接:http://bbs.pediy.com