【破文标题】拓思建筑工程资料管理系统 1.1.40注册算法
【破文作者】XXNB
【作者邮箱】支持PYG
【作者主页】http://free.ys168.com/?binbinbin7456
【破解工具】OD
【破解平台】xpsp2
【软件名称】拓思建筑工程资料管理系统 1.1.40
【软件大小】4062KB
【原版下载】http://www.newhua.com/soft/52073.htm
【保护方式】注册码
【软件简介】拓思建筑工程资料管理系统件是我公司软件开发人员与建工集团资深工程技术人员联合针对建筑公司,建筑监理公司,房地产公司以及各建筑相关行业从事资料管理,编写制作人员开发的。软件包内含有全套建筑工程竣工资料表格,全套建筑安全资料311页(范本,可填写使用),建筑工程项目管理表格(368页)。建筑工程监理制度及表格(143页,可填写使用)。是工程技术人员的得利助手。弹指飞间,资料搞定。
【破解声明】向大侠们学习!!!只为学习!
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------
1、字符串参考查找“注册成功”就可以找到断点。(能找到断点是破解软件的关键)。点“注册”按钮后中断在下面:

0050F69C  /.  55            push    ebp                          
0050F69D  |.  8BEC          mov     ebp, esp
0050F69F  |.  33C9          xor     ecx, ecx                         ;这里随便下断点
0050F6A1  |.  51            push    ecx
0050F6A2  |.  51            push    ecx
0050F6A3  |.  51            push    ecx
0050F6A4  |.  51            push    ecx
0050F6A5  |.  51            push    ecx
0050F6A6  |.  51            push    ecx
0050F6A7  |.  51            push    ecx
0050F6A8  |.  53            push    ebx
0050F6A9  |.  8BD8          mov     ebx, eax
0050F6AB  |.  33C0          xor     eax, eax
0050F6AD  |.  55            push    ebp
0050F6AE  |.  68 DCF75000   push    0050F7DC
0050F6B3  |.  64:FF30       push    dword ptr fs:[eax]
0050F6B6  |.  64:8920       mov     fs:[eax], esp
0050F6B9  |.  8D55 F4       lea     edx, [ebp-C]
0050F6BC  |.  8B83 1C030000 mov     eax, [ebx+31C]
0050F6C2  |.  E8 8DC3F4FF   call    0045BA54
0050F6C7  |.  8B45 F4       mov     eax, [ebp-C]                     ;  假码出现
0050F6CA  |.  8D55 F8       lea     edx, [ebp-8]
0050F6CD  |.  E8 B694EFFF   call    00408B88
0050F6D2  |.  8B45 F8       mov     eax, [ebp-8]                     ;  假码又出现
0050F6D5  |.  50            push    eax
0050F6D6  |.  8D55 EC       lea     edx, [ebp-14]
0050F6D9  |.  8B83 18030000 mov     eax, [ebx+318]
0050F6DF  |.  E8 70C3F4FF   call    0045BA54
0050F6E4  |.  8B45 EC       mov     eax, [ebp-14]                    ;   "TOPTHINK"出现了这个字符串,这个是软件的名称
0050F6E7  |.  8D55 F0       lea     edx, [ebp-10]
0050F6EA  |.  E8 9994EFFF   call    00408B88
0050F6EF  |.  8B45 F0       mov     eax, [ebp-10]                    ;   "TOPTHINK"又出现了这个字符串
0050F6F2  |.  50            push    eax
0050F6F3  |.  8D55 E4       lea     edx, [ebp-1C]
0050F6F6  |.  8B83 14030000 mov     eax, [ebx+314]
0050F6FC  |.  E8 53C3F4FF   call    0045BA54
0050F701  |.  8B45 E4       mov     eax, [ebp-1C]
0050F704  |.  8D55 E8       lea     edx, [ebp-18]
0050F707  |.  E8 7C94EFFF   call    00408B88
0050F70C  |.  8B55 E8       mov     edx, [ebp-18]
0050F70F  |.  8B83 2C030000 mov     eax, [ebx+32C]
0050F715  |.  59            pop     ecx
0050F716  |.  E8 75CDFFFF   call    0050C490                         ;  应该是算法call《《《《《《《《《《《《《------
0050F71B  |.  84C0          test    al, al                           ;  注册成功标志位
0050F71D  |.  75 2C         jnz     short 0050F74B                   ;  关键跳转  一定要跳的!!
0050F71F  |.  8D45 FC       lea     eax, [ebp-4]
0050F722  |.  BA F0F75000   mov     edx, 0050F7F0                    ;  输入注册码不正确,请检查!
0050F727  |.  E8 504CEFFF   call    0040437C
0050F72C  |.  6A 40         push    40
0050F72E  |.  8B45 FC       mov     eax, [ebp-4]
0050F731  |.  E8 6E50EFFF   call    004047A4
0050F736  |.  8BD0          mov     edx, eax
0050F738  |.  B9 0CF85000   mov     ecx, 0050F80C                    ;  输入错误
0050F73D  |.  A1 5C585100   mov     eax, [51585C]
0050F742  |.  8B00          mov     eax, [eax]
0050F744  |.  E8 83CEF6FF   call    0047C5CC
0050F749  |.  EB 4E         jmp     short 0050F799
0050F74B  |>  68 20F85000   push    0050F820                         ;  注册成功!\n注册信息为:\n注册码:
0050F750  |.  8B83 2C030000 mov     eax, [ebx+32C]
0050F756  |.  FF70 5C       push    dword ptr [eax+5C]
0050F759  |.  68 4CF85000   push    0050F84C                         ;  \n
0050F75E  |.  68 58F85000   push    0050F858                         ;  感谢您对我们的支持!请重新启动利康医药进销存系统!
0050F763  |.  8D45 FC       lea     eax, [ebp-4]
0050F766  |.  BA 04000000   mov     edx, 4
0050F76B  |.  E8 F44EEFFF   call    00404664
0050F770  |.  6A 40         push    40
0050F772  |.  8B45 FC       mov     eax, [ebp-4]
0050F775  |.  E8 2A50EFFF   call    004047A4
0050F77A  |.  8BD0          mov     edx, eax
0050F77C  |.  B9 8CF85000   mov     ecx, 0050F88C                    ;  注册成功


2、跟进算法0050F716   call    0050C490。我们得到:

0050C490  /$  55            push    ebp
0050C491  |.  8BEC          mov     ebp, esp
0050C493  |.  83C4 F0       add     esp, -10
0050C496  |.  53            push    ebx
0050C497  |.  33DB          xor     ebx, ebx
0050C499  |.  895D F0       mov     [ebp-10], ebx
0050C49C  |.  895D F4       mov     [ebp-C], ebx
0050C49F  |.  894D F8       mov     [ebp-8], ecx
0050C4A2  |.  8955 FC       mov     [ebp-4], edx
0050C4A5  |.  8BD8          mov     ebx, eax
0050C4A7  |.  8B45 FC       mov     eax, [ebp-4]
0050C4AA  |.  E8 E582EFFF   call    00404794
0050C4AF  |.  8B45 F8       mov     eax, [ebp-8]
0050C4B2  |.  E8 DD82EFFF   call    00404794
0050C4B7  |.  8B45 08       mov     eax, [ebp+8]                     ;  假码
0050C4BA  |.  E8 D582EFFF   call    00404794
0050C4BF  |.  33C0          xor     eax, eax
0050C4C1  |.  55            push    ebp
0050C4C2  |.  68 7AC55000   push    0050C57A
0050C4C7  |.  64:FF30       push    dword ptr fs:[eax]
0050C4CA  |.  64:8920       mov     fs:[eax], esp
0050C4CD  |.  8B45 FC       mov     eax, [ebp-4]
0050C4D0  |.  E8 CF80EFFF   call    004045A4                         ;  这个是计算位数
0050C4D5  |.  3B43 4C       cmp     eax, [ebx+4C]
0050C4D8  |.  7F 19         jg      short 0050C4F3
0050C4DA  |.  8B45 FC       mov     eax, [ebp-4]
0050C4DD  |.  E8 C280EFFF   call    004045A4
0050C4E2  |.  3B43 50       cmp     eax, [ebx+50]
0050C4E5  |.  7C 0C         jl      short 0050C4F3
0050C4E7  |.  8B45 08       mov     eax, [ebp+8]
0050C4EA  |.  E8 B580EFFF   call    004045A4
0050C4EF  |.  85C0          test    eax, eax
0050C4F1  |.  75 04         jnz     short 0050C4F7
0050C4F3  |>  33DB          xor     ebx, ebx
0050C4F5  |.  EB 60         jmp     short 0050C557
0050C4F7  |>  8D55 F4       lea     edx, [ebp-C]
0050C4FA  |.  8B45 08       mov     eax, [ebp+8]
0050C4FD  |.  E8 16C4EFFF   call    00408918
0050C502  |.  8B55 F4       mov     edx, [ebp-C]
0050C505  |.  8D45 08       lea     eax, [ebp+8]
0050C508  |.  E8 6F7EEFFF   call    0040437C
0050C50D  |.  8D4D F0       lea     ecx, [ebp-10]
0050C510  |.  8B55 FC       mov     edx, [ebp-4]
0050C513  |.  8BC3          mov     eax, ebx
0050C515  |.  E8 46FBFFFF   call    0050C060                         ;  这个才是关键call,要跟进的《《《《《《《《《《《《-
0050C51A  |.  8B45 F0       mov     eax, [ebp-10]                    ;  真码出现了 "0000932C03DC"
0050C51D  |.  8B55 08       mov     edx, [ebp+8]                     ;  假码到edx
0050C520  |.  E8 6BC4EFFF   call    00408990                         ;  这个跟进发现原来是逐位比较函数
0050C525  |.  85C0          test    eax, eax
0050C527  |.  74 04         je      short 0050C52D                   ;  这个地方是关键,一定要跳的,不然下面清空了ebx就完蛋了
0050C529  |.  33DB          xor     ebx, ebx
0050C52B  |.  EB 2A         jmp     short 0050C557
0050C52D  |>  8D43 48       lea     eax, [ebx+48]
0050C530  |.  8B55 FC       mov     edx, [ebp-4]
0050C533  |.  E8 007EEFFF   call    00404338


3、跟进0050C515     call    0050C060    。得到下面


0050C096  |.  8BC6          mov     eax, esi
0050C098  |.  E8 070F0000   call    0050CFA4
0050C09D  |.  8B45 DC       mov     eax, [ebp-24]                    ;  软件生成的机器码到eax
0050C0A0  |.  8D55 EC       lea     edx, [ebp-14]                    ;  本机硬盘序列号出现了
0050C0A3  |.  E8 E0CAEFFF   call    00408B88
0050C0A8  |.  837D EC 00    cmp     dword ptr [ebp-14], 0
0050C0AC  |.  75 0D         jnz     short 0050C0BB
0050C0AE  |.  8D45 E0       lea     eax, [ebp-20]
0050C0B1  |.  8B55 FC       mov     edx, [ebp-4]
0050C0B4  |.  E8 C382EFFF   call    0040437C
0050C0B9  |.  EB 5D         jmp     short 0050C118
0050C0BB  |>  8B45 EC       mov     eax, [ebp-14]                    ;  软件生成的机器码到eax
0050C0BE  |.  E8 E184EFFF   call    004045A4                         ;  计算位数
0050C0C3  |.  8BD8          mov     ebx, eax
0050C0C5  |.  8D45 E8       lea     eax, [ebp-18]
0050C0C8  |.  50            push    eax
0050C0C9  |.  8BCB          mov     ecx, ebx
0050C0CB  |.  D1F9          sar     ecx, 1                           ;  右移1位。就是除以2
0050C0CD  |.  79 03         jns     short 0050C0D2
0050C0CF  |.  83D1 00       adc     ecx, 0
0050C0D2  |>  BA 01000000   mov     edx, 1                           ;  这里赋值1
0050C0D7  |.  8B45 EC       mov     eax, [ebp-14]                    ;  软件生成的机器码到eax。是不是要循环?
0050C0DA  |.  E8 2587EFFF   call    00404804
0050C0DF  |.  8D45 E4       lea     eax, [ebp-1C]
0050C0E2  |.  50            push    eax
0050C0E3  |.  8BC3          mov     eax, ebx
0050C0E5  |.  D1F8          sar     eax, 1                           ;  右移1位。就是除以2
0050C0E7  |.  79 03         jns     short 0050C0EC
0050C0E9  |.  83D0 00       adc     eax, 0
0050C0EC  |>  8BCB          mov     ecx, ebx
0050C0EE  |.  2BC8          sub     ecx, eax
0050C0F0  |.  8BD3          mov     edx, ebx
0050C0F2  |.  D1FA          sar     edx, 1
0050C0F4  |.  79 03         jns     short 0050C0F9
0050C0F6  |.  83D2 00       adc     edx, 0
0050C0F9  |>  42            inc     edx
0050C0FA  |.  8B45 EC       mov     eax, [ebp-14]
0050C0FD  |.  E8 0287EFFF   call    00404804                         ;  这个call把机器码分成两个部分,每个部分6位
0050C102  |.  FF75 E8       push    dword ptr [ebp-18]               ;  前六位入栈
0050C105  |.  FF75 FC       push    dword ptr [ebp-4]                ;  固定字符串入栈
0050C108  |.  FF75 E4       push    dword ptr [ebp-1C]               ;  后六位入栈
0050C10B  |.  8D45 E0       lea     eax, [ebp-20]
0050C10E  |.  BA 03000000   mov     edx, 3
0050C113  |.  E8 4C85EFFF   call    00404664
0050C118  |>  C745 F0 00000>mov     dword ptr [ebp-10], 0
0050C11F  |.  C745 F4 00000>mov     dword ptr [ebp-C], 0
0050C126  |.  8B45 FC       mov     eax, [ebp-4]
0050C129  |.  E8 7684EFFF   call    004045A4                         ;  计算位数
0050C12E  |.  3B46 4C       cmp     eax, [esi+4C]                    ;  和64H比较
0050C131  |.  7F 0D         jg      short 0050C140
0050C133  |.  8B45 FC       mov     eax, [ebp-4]
0050C136  |.  E8 6984EFFF   call    004045A4
0050C13B  |.  3B46 50       cmp     eax, [esi+50]                    ;  和3H比较
0050C13E  |.  7D 0C         jge     short 0050C14C
0050C140  |>  8BC7          mov     eax, edi
0050C142  |.  E8 9D81EFFF   call    004042E4
0050C147  |.  E9 91000000   jmp     0050C1DD
0050C14C  |>  8B45 E0       mov     eax, [ebp-20]                    ;  原来上面搞这么多是为了连接那三个字符串
0050C14F  |.  E8 5084EFFF   call    004045A4                         ;  又计算位数
0050C154  |.  8BD8          mov     ebx, eax
0050C156  |.  EB 37         jmp     short 0050C18F
0050C158  |> /8B45 F0       /mov     eax, [ebp-10]                   ;  循环一次得到的结果放到eax。第一次为0
0050C15B  |.  8B55 F4       |mov     edx, [ebp-C]
0050C15E  |.  0346 68       |add     eax, [esi+68]                   ;  123456789的16进制,这里是上一次循环的结果和123456789的16进制数相加
0050C161  |.  1356 6C       |adc     edx, [esi+6C]
0050C164  |.  52            |push    edx
0050C165  |.  50            |push    eax
0050C166  |.  8B45 E0       |mov     eax, [ebp-20]
0050C169  |.  0FB64418 FF   |movzx   eax, byte ptr [eax+ebx-1]       ;  从后面逐个取字符的AscII码
0050C16E  |.  50            |push    eax
0050C16F  |.  B8 59040000   |mov     eax, 459                        ;  常量459(1113)
0050C174  |.  5A            |pop     edx
0050C175  |.  8BCA          |mov     ecx, edx
0050C177  |.  33D2          |xor     edx, edx
0050C179  |.  F7F1          |div     ecx                             ;  常量除以刚才取出的字符的ascii码
0050C17B  |.  8BC2          |mov     eax, edx                        ;  余数到eax
0050C17D  |.  33D2          |xor     edx, edx
0050C17F  |.  290424        |sub     [esp], eax                      ;  循环开始时候相加的结果-余数
0050C182  |.  195424 04     |sbb     [esp+4], edx
0050C186  |.  58            |pop     eax                             ;  这里是减后的结果
0050C187  |.  5A            |pop     edx
0050C188  |.  8945 F0       |mov     [ebp-10], eax                   ;  存储相减的结果
0050C18B  |.  8955 F4       |mov     [ebp-C], edx
0050C18E  |.  4B            |dec     ebx                             ;  计数器减1
0050C18F  |>  8B45 E0        mov     eax, [ebp-20]                   ;  字符串继续循环
0050C192  |.  E8 0D84EFFF   |call    004045A4
0050C197  |.  3BD8          |cmp     ebx, eax
0050C199  |.  7F 04         |jg      short 0050C19F
0050C19B  |.  85DB          |test    ebx, ebx
0050C19D  |.^ 7F B9         \jg      short 0050C158
0050C19F  |>  8B5E 60       mov     ebx, [esi+60]
0050C1A2  |.  85DB          test    ebx, ebx
0050C1A4  |.  7F 11         jg      short 0050C1B7
0050C1A6  |.  FF75 F4       push    dword ptr [ebp-C]                ; /Arg2
0050C1A9  |.  FF75 F0       push    dword ptr [ebp-10]               ; |Arg1
0050C1AC  |.  8BD7          mov     edx, edi                         ; |
0050C1AE  |.  33C0          xor     eax, eax                         ; |
0050C1B0  |.  E8 77CEEFFF   call    0040902C                         ; \TSJZ.0040902C
0050C1B5  |.  EB 26         jmp     short 0050C1DD
0050C1B7  |>  FF75 F4       push    dword ptr [ebp-C]                ; /Arg2
0050C1BA  |.  FF75 F0       push    dword ptr [ebp-10]               ; |这里出现的应该是上面循环后得到的结果了932C03DC
0050C1BD  |.  8BD7          mov     edx, edi                         ; |
0050C1BF  |.  8BC3          mov     eax, ebx                         ; |
0050C1C1  |.  E8 66CEEFFF   call    0040902C                         ; \这个call是把上面的结果转成字符串。就是16进制直接转成
0050C1C6  |.  8B07          mov     eax, [edi]                       ;  这个应该是真码了      "0000932C03DC"
0050C1C8  |.  E8 D783EFFF   call    004045A4
0050C1CD  |.  8BC8          mov     ecx, eax
0050C1CF  |.  2B4E 60       sub     ecx, [esi+60]
0050C1D2  |.  8B56 60       mov     edx, [esi+60]
0050C1D5  |.  42            inc     edx
0050C1D6  |.  8BC7          mov     eax, edi
0050C1D8  |.  E8 6786EFFF   call    00404844
0050C1DD  |>  33C0          xor     eax, eax
0050C1DF  |.  5A            pop     edx
0050C1E0  |.  59            pop     ecx
0050C1E1  |.  59            pop     ecx
0050C1E2  |.  64:8910       mov     fs:[eax], edx
0050C1E5  |.  68 07C25000   push    0050C207
0050C1EA  |>  8D45 DC       lea     eax, [ebp-24]
0050C1ED  |.  BA 05000000   mov     edx, 5
0050C1F2  |.  E8 1181EFFF   call    00404308
0050C1F7  |.  8D45 FC       lea     eax, [ebp-4]
0050C1FA  |.  E8 E580EFFF   call    004042E4
0050C1FF  \.  C3            retn



易语言注册机源码:

.版本 2

.程序集 窗口程序集1

.子程序 _按钮1_被单击
.局部变量 jiqima, 文本型
.局部变量 j1, 文本型
.局部变量 j2, 文本型
.局部变量 stringyuan, 文本型
.局部变量 len, 整数型
.局部变量 i, 整数型
.局部变量 stringdao, 文本型
.局部变量 a, 长整数型
.局部变量 b, 长整数型
.局部变量 x, 整数型
.局部变量 eax, 长整数型
.局部变量 yushu, 整数型
.局部变量 code1, 文本型

jiqima = 编辑框1.内容
j1 = 取文本左边 (jiqima, 6)
j2 = 取文本右边 (jiqima, 6)
stringyuan = j1 + “TOPTHINK” + j2
stringdao = 倒转字符串 (stringyuan)
len = 取文本长度 (stringdao)
a = 123456789
b = 1113

.计次循环首 (len, i)
    eax = eax + a
    x = 取代码 (stringdao, i)
    yushu = 1113 % x
    eax = eax - yushu
.计次循环尾 ()

code1 = 取十六进制文本 (eax)
编辑框2.内容 = “0000” + code1


.子程序 倒转字符串, 文本型
.参数 string, 文本型
.局部变量 k, 整数型
.局部变量 RChar, 文本型
.局部变量 LChar, 文本型
.局部变量 WChar, 文本型

.判断循环首 (k < 取文本长度 (string))

    LChar = 取文本左边 (string, 取文本长度 (string) - k)
    RChar = 取文本右边 (LChar, 1)
    k = k + 1
    WChar = WChar + RChar
.判断循环尾 ()
返回 (WChar)





【破解总结】
------------------------------------------------------------------------
1、机器码分成两个部分,前6位和后6位。然后把固定字符串“TOPTHINK”插在中间,如:"00003ATOPTHINKDE67AD"。

2、逐个从后面开始取字符串"00003ATOPTHINKDE67AD"的Ascii码。然后常量1113除以取得的Ascii码值,得到余数。

3、在第一次循环的时候,用输入的假码减去上面得到的余数。得到的数再在循环开始时候加上常量123456789,加后的数将作为下一次循环的初始值。

4、在循环取完那个字符串后最终得到的数,转成16进制后直接转化为字符串,然后前面加上4个0就是真码了。如:"0000932C03DC"