• 标 题:班门弄斧之GoldView32 2.0 Build168算法分析 (8千字)
  • 作 者:eCool[BCG]
  • 时 间:2002-1-24 12:07:03
  • 链 接:http://bbs.pediy.com

GoldView32 2.0 build 168破解过程
【软件简介】是一个对文件的所在结构进行浏览的软件。就是能显示文件有关结            构和对象的相关信息,是一种只能显示不能修改的工具,对于不想            查询数据词典而想知道有关信息的人非常有用,能让人们安全浏览            文件。
【下载地址】http://newhua.infosail.com/Goldview.htm
【破解工具】Language2000、DeDe 3.0、Ollydbg 1.4
【文章作者】eCool[BCG][FCG][CNCG]
【出版时间】2002年1月24日
【郑重声明】转载请保持文章完整,谢谢。

      很久没有搞破解了有点手痒,所以立马去华军一趟,随便选了个软件下载,结果就搞到了这个东东,安装完成后,运行,注册,原来是单Serial型的注册,看来有点困难,随便输入一个注册码,点Ok,出来一个错误对话框,呵呵,有戏看了。退出程序,立即用Language2000分析一下GoldView.exe,不错没有加壳,而且是DeDe的,so,用Dede分析一下,很快在Nag Unit中找到个RegisterButtonClick,进入这个事件,来到这里:
* Reference to field TNagDlg.OFFS_0314
|
004E0626  8B9314030000          mov    edx, [ebx+$0314]
004E062C  8D45FC                lea    eax, [ebp-$04]

|
004E062F  E8B445F2FF            call    00404BE8
004E0634  8B45FC                mov    eax, [ebp-$04]

|
004E0637  E894F8FFFF            call    004DFED0
004E063C  84C0                  test    al, al==》经典的比较啊,因此在4E0637处下断。
004E063E  743C                  jz      004E067C
004E0640  8D55F4                lea    edx, [ebp-$0C]
      好的,马上运行Ollydbg,载入,运行,输入假注册码AB1234,然后在4E0637下断,点OK按钮,马上背拦下,按F7跟入。
004DFED0  55                    push    ebp
004DFED1  8BEC                  mov    ebp, esp
004DFED3  33C9                  xor    ecx, ecx
004DFED5  51                    push    ecx
004DFED6  51                    push    ecx
004DFED7  51                    push    ecx
004DFED8  51                    push    ecx
004DFED9  51                    push    ecx
004DFEDA  51                    push    ecx
004DFEDB  53                    push    ebx
004DFEDC  56                    push    esi
004DFEDD  8945FC                mov    [ebp-$04], eax
004DFEE0  8B45FC                mov    eax, [ebp-$04]

|
004DFEE3  E89C4EF2FF            call    00404D84
004DFEE8  33C0                  xor    eax, eax
004DFEEA  55                    push    ebp

* Possible String Reference to: '閹B?脬奅鸮[嬪]脥@'
|
004DFEEB  68F5FF4D00            push    $004DFFF5

***** TRY
|
004DFEF0  64FF30                push    dword ptr fs:[eax]
004DFEF3  648920                mov    fs:[eax], esp
004DFEF6  C645FB00              mov    byte ptr [ebp-$05], $00
004DFEFA  8D55EC                lea    edx, [ebp-$14]
004DFEFD  8B45FC                mov    eax, [ebp-$04]

|
004DFF00  E8DB8EF2FF            call    00408DE0==》取字符串"Goldview32"
004DFF05  8B55EC                mov    edx, [ebp-$14]
004DFF08  8D45FC                lea    eax, [ebp-$04]

|
004DFF0B  E86C4AF2FF            call    0040497C==》将"Goldview32"加上我们的注册码
004DFF10  8D45F0                lea    eax, [ebp-$10]所以变成"Goldview32AB1234"

|
004DFF13  E8CC49F2FF            call    004048E4==》转换成大写
004DFF18  8B45FC                mov    eax, [ebp-$04]"GOLDVIEW32AB1234"

|
004DFF1B  E87C4CF2FF            call    00404B9C
004DFF20  8BD8                  mov    ebx, eax
004DFF22  EB01                  jmp    004DFF25
004DFF24  4B                    dec    ebx
004DFF25  8B45FC                mov    eax, [ebp-$04]            -+
004DFF28  8A4418FF              mov    al, byte ptr [eax+ebx-$01] |这段代码的作用是
004DFF2C  04D0                  add    al, -$30                  |判断输入的注册码的
004DFF2E  2C0A                  sub    al, $0A                    |最后几位是不是数字。
004DFF30  7304                  jnb    004DFF36                  |(最起码最后一位必须
004DFF32  85DB                  test    ebx, ebx                  |是数字)
004DFF34  7FEE                  jnle    004DFF24                  -+
004DFF36  8D45F0                lea    eax, [ebp-$10]
004DFF39  50                    push    eax
004DFF3A  8B45FC                mov    eax, [ebp-$04]

|
004DFF3D  E85A4CF2FF            call    00404B9C
004DFF42  8BC8                  mov    ecx, eax
004DFF44  2BCB                  sub    ecx, ebx
004DFF46  8D5301                lea    edx, [ebx+$01]
004DFF49  8B45FC                mov    eax, [ebp-$04]

|
004DFF4C  E8A34EF2FF            call    00404DF4
004DFF51  8D45F4                lea    eax, [ebp-$0C]
004DFF54  50                    push    eax
004DFF55  8B45FC                mov    eax, [ebp-$04]

|
004DFF58  E83F4CF2FF            call    00404B9C
004DFF5D  50                    push    eax
004DFF5E  8B45F0                mov    eax, [ebp-$10]

|
004DFF61  E8364CF2FF            call    00404B9C
004DFF66  59                    pop    ecx
004DFF67  2BC8                  sub    ecx, eax
004DFF69  BA01000000            mov    edx, $00000001
004DFF6E  8B45FC                mov    eax, [ebp-$04]

|
004DFF71  E87E4EF2FF            call    00404DF4
004DFF76  33F6                  xor    esi, esi
004DFF78  8B45F4                mov    eax, [ebp-$0C]

|
004DFF7B  E81C4CF2FF            call    00404B9C
004DFF80  85C0                  test    eax, eax
004DFF82  7E4E                  jle    004DFFD2
004DFF84  8B45F4                mov    eax, [ebp-$0C]

|
004DFF87  E8104CF2FF            call    00404B9C
004DFF8C  85C0                  test    eax, eax
004DFF8E  7E42                  jle    004DFFD2
004DFF90  8B45F4                mov    eax, [ebp-$0C]

|
004DFF93  E8044CF2FF            call    00404B9C==》取去掉最后几位数字的字符
004DFF98  85C0                  test    eax, eax      这里是GOLDVIEW32AB
004DFF9A  7E1B                  jle    004DFFB7
004DFF9C  BB01000000            mov    ebx, $00000001
004DFFA1  8B55F4                mov    edx, [ebp-$0C]
004DFFA4  0FB6541AFF            movzx  edx, byte ptr [edx+ebx-$01]-+对GOLDVIEW32AB进行运算
004DFFA9  0FAFD3                imul    edx, ebx                    |s="GOLDVIEW32AB":y=0
004DFFAC  6BCB0B                imul    ecx, ebx, $0B              |for i=1 to len(s)
004DFFAF  03D1                  add    edx, ecx                    |  x=asc(mid$(s,i,1))
004DFFB1  03F2                  add    esi, edx                    |  x=x*i
004DFFB3  43                    inc    ebx                        |  x=i*&hb+x
004DFFB4  48                    dec    eax                        |  y=y+x
004DFFB5  75EA                  jnz    004DFFA1                  -+next i
004DFFB7  8D55E8                lea    edx, [ebp-$18]
004DFFBA  8BC6                  mov    eax, esi

|
004DFFBC  E80395F2FF            call    004094C4==》获得最后几位是数字的字符,这里是1234
004DFFC1  8B45E8                mov    eax, [ebp-$18]==》eax=y=6100
004DFFC4  8B55F0                mov    edx, [ebp-$10]==》edx=1234

|
004DFFC7  E8144DF2FF            call    00404CE0==》比较是否相等
004DFFCC  7504                  jnz    004DFFD2
004DFFCE  C645FB01              mov    byte ptr [ebp-$05], $01
004DFFD2  33C0                  xor    eax, eax
004DFFD4  5A                    pop    edx
004DFFD5  59                    pop    ecx
004DFFD6  59                    pop    ecx
004DFFD7  648910                mov    fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '奅鸮[嬪]脥@'
|
004DFFDA  68FCFF4D00            push    $004DFFFC
004DFFDF  8D45E8                lea    eax, [ebp-$18]
004DFFE2  BA04000000            mov    edx, $00000004

|
004DFFE7  E81C49F2FF            call    00404908
004DFFEC  8D45FC                lea    eax, [ebp-$04]

|
004DFFEF  E8F048F2FF            call    004048E4
004DFFF4  C3                    ret

004DFFF5  E98E42F2FF            jmp    00404288
004DFFFA  EBE3                  jmp    004DFFDF

****** END
|
004DFFFC  8A45FB                mov    al, byte ptr [ebp-$05]
004DFFFF  5E                    pop    esi
004E0000  5B                    pop    ebx
004E0001  8BE5                  mov    esp, ebp
004E0003  5D                    pop    ebp
004E0004  C3                    ret

到此,我们可以得到一个合法的注册码是:AB6100.