变压器设计大师2.0破解实录-----一个易语言程序破解


[保护方式]  采用硬件序列号,一机注册码

[下载]http://www1.skycn.com/soft/21536.html 

破解工具: PEID0.91汉化版,OLLYDBG1.10

破解过程:
1.用peid侦查信息为: "没有发现!".
  不回有壳吧??.
  先不管啦,用OD载入看一下,

00401000 >/$ E8 06000000    CALL 变压器设.0040100B
00401005  |. 50             PUSH EAX                                 ; /ExitCode
00401006  \. E8 BB010000    CALL <JMP.&KERNEL32.ExitProcess>         ; \ExitProcess
0040100B  /$ 55             PUSH EBP
0040100C  |. 8BEC           MOV EBP,ESP
0040100E  |. 81C4 F0FEFFFF  ADD ESP,-110
00401014  |. E9 83000000    JMP 变压器设.0040109C
00401019  |. 6B 72 6E 6C 6E>ASCII "krnln.fnr",0
00401023  |. 6B 72 6E 6C 6E>ASCII "krnln.fne",0
0040102D  |. 47 65 74 4E 65>ASCII "GetNewSock",0
00401038  |. 53 6F 66 74 77>ASCII "Software\FlySky\"
00401048  |. 45 5C 49 6E 73>ASCII "E\Install",0
00401052  |. 50 61 74 68 00>ASCII "Path",0
00401057  |. 4E 6F 74 20 66>ASCII "Not found the ke"
00401067  |. 72 6E 65 6C 20>ASCII "rnel library or "
00401077  |. 74 68 65 20 6B>ASCII "the kernel libra"
00401087  |. 72 79 20 69 73>ASCII "ry is invalid!",0
00401096  |. 45 72 72 6F 72>ASCII "Error",0

我首先发现如下字符串"krnln.fnr",由于以前破过易语言的程序,知道"krnln.fnr"是
易语言的支持库,所以肯定这个程序是由易语言编的.

2.按F9运行程序,点击出注册界面后, 我的注册信息如下:

硬件代码:166385371.9427

填入注册信息,
      注册名: crackerwu
      注册码: 54321

点"注册"后,程序提示信息为 "请重新启动本软件,谢谢您的使用"

看来程序在启动时比较注册码.

3.由于还不知道注册信息保存在什么地方(注册表或某个文件中),我首先想到
用GetWindowtextA函数设断跟踪来看一下注册信息保存位置.
设断后很快发现程序其它地方在不断使用这个函数(不断的被中断),根本就没法去点击注册按钮.
看来需要转变思路想想其它办法.

4.我忽然想到还没有仔细看过它的安装目录下有些什么文件,去看看再说.
找到一个文件"peizhi.ini"内容如下: 
__________________________________________
[zhuce]
注册=54321
姓名=crackerwu
类型=0
邮件=
邮编=
电话=
传真=
地址=
___________________________________________

哈哈,注册信息保存在这里,太好了!!!!

5.  WINDOWS专门提供了一组函数用来读写INI文件:

    GetPrivateProfileString
    GetPrivateProfileInt
    WritePrivateProfileString
    WritePrivateProfileInt


下面对GetPrivateProfileStringA函数设断来跟踪,

用OLLYDBG加载程序后, ALT+E选择到KERNEL32.dll模块,按右键,
选择“View Names” 出现调用函数的窗口,
向下拉动找到GetPrivateProfileStringA并选择它,按下F2。

按F9执行,回到主程序,添入注册名和注册码注册,被OllyDbg拦截住,
按CTRL+F9,按F8来到krnln.fnr中,
再按CTRL+F9,F8返回程序领空后来到如下位置:


00494C79   55               PUSH EBP
00494C7A   8BEC             MOV EBP,ESP
00494C7C   81EC 2C000000    SUB ESP,2C
00494C82   C745 FC 00000000 MOV DWORD PTR SS:[EBP-4],0
00494C89   C745 F8 00000000 MOV DWORD PTR SS:[EBP-8],0
00494C90   C745 F4 00000000 MOV DWORD PTR SS:[EBP-C],0
00494C97   68 00000000      PUSH 0
00494C9C   BB 04010000      MOV EBX,104
00494CA1   E8 D48B0000      CALL 变压器设.0049D87A
00494CA6   83C4 04          ADD ESP,4
00494CA9   8945 F0          MOV DWORD PTR SS:[EBP-10],EAX
00494CAC   68 FF324000      PUSH 变压器设.004032FF                     ; ASCII "\peizhi.ini"
00494CB1   FF75 F0          PUSH DWORD PTR SS:[EBP-10]
00494CB4   B9 02000000      MOV ECX,2
00494CB9   E8 36CBFFFF      CALL 变压器设.004917F4
00494CBE   83C4 08          ADD ESP,8
00494CC1   8945 EC          MOV DWORD PTR SS:[EBP-14],EAX
00494CC4   8B5D F0          MOV EBX,DWORD PTR SS:[EBP-10]
00494CC7   85DB             TEST EBX,EBX
00494CC9   74 09            JE SHORT 变压器设.00494CD4
00494CCB   53               PUSH EBX
00494CCC   E8 AF8B0000      CALL 变压器设.0049D880
00494CD1   83C4 04          ADD ESP,4
00494CD4   6A 00            PUSH 0
00494CD6   6A 00            PUSH 0
00494CD8   6A 00            PUSH 0
00494CDA   68 04000080      PUSH 80000004
00494CDF   6A 00            PUSH 0
00494CE1   68 0B334000      PUSH 变压器设.0040330B
00494CE6   68 04000080      PUSH 80000004
00494CEB   6A 00            PUSH 0
00494CED   68 10334000      PUSH 变压器设.00403310                     ; ASCII "zhuce"
00494CF2   68 04000080      PUSH 80000004
00494CF7   6A 00            PUSH 0
00494CF9   8B45 EC          MOV EAX,DWORD PTR SS:[EBP-14]
00494CFC   85C0             TEST EAX,EAX
00494CFE   75 05            JNZ SHORT 变压器设.00494D05
00494D00   B8 2E324000      MOV EAX,变压器设.0040322E
00494D05   50               PUSH EAX
00494D06   68 04000000      PUSH 4
00494D0B   BB C8080000      MOV EBX,8C8
00494D10   E8 658B0000      CALL 变压器设.0049D87A
00494D15   83C4 34          ADD ESP,34
00494D18   8945 E8          MOV DWORD PTR SS:[EBP-18],EAX
00494D1B   8B5D EC          MOV EBX,DWORD PTR SS:[EBP-14]
00494D1E   85DB             TEST EBX,EBX
00494D20   74 09            JE SHORT 变压器设.00494D2B
00494D22   53               PUSH EBX
00494D23   E8 588B0000      CALL 变压器设.0049D880
00494D28   83C4 04          ADD ESP,4
00494D2B   8B5D FC          MOV EBX,DWORD PTR SS:[EBP-4]
00494D2E   85DB             TEST EBX,EBX
00494D30   74 09            JE SHORT 变压器设.00494D3B
00494D32   53               PUSH EBX
00494D33   E8 488B0000      CALL 变压器设.0049D880
00494D38   83C4 04          ADD ESP,4
00494D3B   8B45 E8          MOV EAX,DWORD PTR SS:[EBP-18]
00494D3E   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX
00494D41   68 00000000      PUSH 0
00494D46   BB C4060000      MOV EBX,6C4
00494D4B   E8 2A8B0000      CALL 变压器设.0049D87A    ; 调用易语言库函数根据硬盘型号产生一个数
                                                      ;(我的为十六进制50549935)
00494D50   83C4 04          ADD ESP,4
00494D53   8945 E8          MOV DWORD PTR SS:[EBP-18],EAX ;硬件数送[EBP-18]
00494D56   DB45 E8          FILD DWORD PTR SS:[EBP-18]    ;[EBP-18]装入浮点寄存器(我的为1347721525.0000000000)
00494D59   DD5D E8          FSTP QWORD PTR SS:[EBP-18]    ; 
00494D5C   DD45 E8          FLD QWORD PTR SS:[EBP-18]
00494D5F   DC0D 16334000    FMUL QWORD PTR DS:[403316]   ; 与0.1234567890000000作浮点乘法运算产生机器码
00494D65   DD5D E0          FSTP QWORD PTR SS:[EBP-20]   ;结果存入[EBP-20](我的166385371.9426832)
00494D68   DD45 E0          FLD QWORD PTR SS:[EBP-20]    ; [EBP-20]装入浮点寄存器
00494D6B   E8 E0CAFFFF      CALL 变压器设.00491850        ; 对浮取整取整call


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^跟进00491850
00491850   55               PUSH EBP
00491851   8BEC             MOV EBP,ESP
00491853   83C4 F4          ADD ESP,-0C
00491856   D97D FE          FSTCW WORD PTR SS:[EBP-2]
00491859   66:8B45 FE       MOV AX,WORD PTR SS:[EBP-2]
0049185D   80CC 0C          OR AH,0C
00491860   66:8945 FC       MOV WORD PTR SS:[EBP-4],AX
00491864   D96D FC          FLDCW WORD PTR SS:[EBP-4]
00491867   DF7D F4          FISTP QWORD PTR SS:[EBP-C]  ;以整数保存我的166385371.9426832。
0049186A   D96D FE          FLDCW WORD PTR SS:[EBP-2]
0049186D   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
00491870   8B55 F8          MOV EDX,DWORD PTR SS:[EBP-8]
00491873   8BE5             MOV ESP,EBP
00491875   5D               POP EBP
00491876   C3               RETN
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

00494D70   8945 F8          MOV DWORD PTR SS:[EBP-8],EAX
00494D73   68 01030080      PUSH 80000301
00494D78   6A 00            PUSH 0
00494D7A   FF75 F8          PUSH DWORD PTR SS:[EBP-8]              ; [EBP-8]机器码整数部份入栈
00494D7D   68 01000000      PUSH 1                                 ; 1为参与运算参数个数
00494D82   BB C0000000      MOV EBX,0C0                            ; EBX=0C0  ,代表求反
00494D87   E8 EE8A0000      CALL 变压器设.0049D87A                 ; 跟进可知调用易语言库函数(对[EBP-8]作求反运算)
                                                                   
00494D8C   83C4 10          ADD ESP,10
00494D8F   8945 F0          MOV DWORD PTR SS:[EBP-10],EAX
00494D92   68 01030080      PUSH 80000301
00494D97   6A 00            PUSH 0
00494D99   68 75A9B33F      PUSH 3FB3A975
00494D9E   68 01030080      PUSH 80000301
00494DA3   6A 00            PUSH 0
00494DA5   FF75 F0          PUSH DWORD PTR SS:[EBP-10]
00494DA8   68 02000000      PUSH 2                            ; 2为参与运算参数个数
00494DAD   BB C4000000      MOV EBX,0C4                       ; EBX=0C4,代表作与运算
00494DB2   E8 C38A0000      CALL 变压器设.0049D87A            ; 跟进可知调用易语言库函数(对[EBP-10]与3FB3A975作与运算)
00494DB7   83C4 1C          ADD ESP,1C
00494DBA   68 01030080      PUSH 80000301
00494DBF   6A 00            PUSH 0
00494DC1   50               PUSH EAX
00494DC2   68 01000000      PUSH 1                            ; 1为参与运算参数个数
00494DC7   BB D4010000      MOV EBX,1D4                       ; EBX=1D4,
00494DCC   E8 A98A0000      CALL 变压器设.0049D87A            ;跟进可知调用易语言库函数(EAX中十六进制数转换为字符串得注册码第一部份)
00494DD1   83C4 10          ADD ESP,10
00494DD4   8945 E8          MOV DWORD PTR SS:[EBP-18],EAX     ; 注册码第一部份地址送[EBP-18]
00494DD7   68 01030080      PUSH 80000301
00494DDC   6A 00            PUSH 0
00494DDE   68 75A9B33F      PUSH 3FB3A975
00494DE3   68 01030080      PUSH 80000301
00494DE8   6A 00            PUSH 0
00494DEA   FF75 F8          PUSH DWORD PTR SS:[EBP-8]              ; [EBP-8]机器码整数部份入栈
00494DED   68 02000000      PUSH 2                                 ; 2为参与运算参数个数
00494DF2   BB CC000000      MOV EBX,0CC                            ; EBX=0CC,
00494DF7   E8 7E8A0000      CALL 变压器设.0049D87A       ;跟进可知调用易语言库函数(3FB3A975与[EBP-8]作异或运算)
00494DFC   83C4 1C          ADD ESP,1C
00494DFF   68 01030080      PUSH 80000301
00494E04   6A 00            PUSH 0
00494E06   50               PUSH EAX
00494E07   68 01000000      PUSH 1
00494E0C   BB D4010000      MOV EBX,1D4                ; EBX=1D4,表示十六进制数转换为字符串
00494E11   E8 648A0000      CALL 变压器设.0049D87A    ;跟进可知调用易语言库函数(EAX中十六进制数转换为字符串得注册码第二部份)
00494E16   83C4 10          ADD ESP,10
00494E19   8945 E0          MOV DWORD PTR SS:[EBP-20],EAX       ; 注册码第二部份地址送[EBP-20]
00494E1C   68 01030080      PUSH 80000301
00494E21   6A 00            PUSH 0
00494E23   68 15CD5B07      PUSH 75BCD15
00494E28   68 01030080      PUSH 80000301
00494E2D   6A 00            PUSH 0
00494E2F   FF75 F8          PUSH DWORD PTR SS:[EBP-8]          ; [EBP-8]为机器码整数部份入栈
00494E32   68 02000000      PUSH 2                              ;2为参与运算参数个数
00494E37   BB C8000000      MOV EBX,0C8                         ;EBX=0C8,表示作或运算
00494E3C   E8 398A0000      CALL 变压器设.0049D87A              ;跟进可知调用易语言库函数(75BCD15与[EBP-8]作或运算)
00494E41   83C4 1C          ADD ESP,1C
00494E44   68 01030080      PUSH 80000301
00494E49   6A 00            PUSH 0
00494E4B   50               PUSH EAX
00494E4C   68 01000000      PUSH 1
00494E51   BB D4010000      MOV EBX,1D4                           ; EBX=1D4,表示十六进制数转换为字符串
00494E56   E8 1F8A0000      CALL 变压器设.0049D87A                ;调用易语言库函数(EAX中十六进制数转换为字符串得注册码第二部份)
00494E5B   83C4 10          ADD ESP,10
00494E5E   8945 D8          MOV DWORD PTR SS:[EBP-28],EAX         ; 注册码第三部份地址送[EBP-28]

00494E61   FF75 D8          PUSH DWORD PTR SS:[EBP-28]           ;第三部份
00494E64   68 1E334000      PUSH 变压器设.0040331E
00494E69   FF75 E0          PUSH DWORD PTR SS:[EBP-20]           ;第二部份
00494E6C   68 1E334000      PUSH 变压器设.0040331E
00494E71   FF75 E8          PUSH DWORD PTR SS:[EBP-18]           ;第一部份
00494E74   B9 05000000      MOV ECX,5
00494E79   E8 76C9FFFF      CALL 变压器设.004917F4               ; 连接三部份注册码
00494E7E   83C4 14          ADD ESP,14
00494E81   8945 D4          MOV DWORD PTR SS:[EBP-2C],EAX  ;   注册码地址送[EBP-2C](我的为36112924-36597FAE-FFBDFDF)
00494E84   8B5D E8          MOV EBX,DWORD PTR SS:[EBP-18]
00494E87   85DB             TEST EBX,EBX
00494E89   74 09            JE SHORT 变压器设.00494E94
00494E8B   53               PUSH EBX
00494E8C   E8 EF890000      CALL 变压器设.0049D880
00494E91   83C4 04          ADD ESP,4
00494E94   8B5D E0          MOV EBX,DWORD PTR SS:[EBP-20]
00494E97   85DB             TEST EBX,EBX
00494E99   74 09            JE SHORT 变压器设.00494EA4
00494E9B   53               PUSH EBX
00494E9C   E8 DF890000      CALL 变压器设.0049D880
00494EA1   83C4 04          ADD ESP,4
00494EA4   8B5D D8          MOV EBX,DWORD PTR SS:[EBP-28]
00494EA7   85DB             TEST EBX,EBX
00494EA9   74 09            JE SHORT 变压器设.00494EB4
00494EAB   53               PUSH EBX
00494EAC   E8 CF890000      CALL 变压器设.0049D880                  
00494EB1   83C4 04          ADD ESP,4
00494EB4   8B5D F4          MOV EBX,DWORD PTR SS:[EBP-C]
00494EB7   85DB             TEST EBX,EBX
00494EB9   74 09            JE SHORT 变压器设.00494EC4
00494EBB   53               PUSH EBX
00494EBC   E8 BF890000      CALL 变压器设.0049D880
00494EC1   83C4 04          ADD ESP,4
00494EC4   8B45 D4          MOV EAX,DWORD PTR SS:[EBP-2C]     ; 注册码送EAX
00494EC7   8945 F4          MOV DWORD PTR SS:[EBP-C],EAX
00494ECA   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
00494ECD   50               PUSH EAX                            ;我们输入注册码入栈(54321)
00494ECE   FF75 F4          PUSH DWORD PTR SS:[EBP-C]           ;程序计算注册码入栈(我的为36112924-36597FAE-FFBDFDF)
00494ED1   E8 DAC9FFFF      CALL 变压器设.004918B0              ;比较注册码CALL
00494ED6   83C4 08          ADD ESP,8
00494ED9   83F8 00          CMP EAX,0                         ; 比较注册码是否正确
00494EDC   0F85 0A000000    JNZ 变压器设.00494EEC
00494EE2   B8 01000000      MOV EAX,1                          ; 对EAX赋值1表示已注册
00494EE7   E9 0A000000      JMP 变压器设.00494EF6
00494EEC   B8 00000000      MOV EAX,0                          ; 对EAX赋值0表示未注册
                                                               ;爆破可把这句改为 MOV EAX,1)
00494EF1   E9 00000000      JMP 变压器设.00494EF6
00494EF6   50               PUSH EAX
00494EF7   8B5D FC          MOV EBX,DWORD PTR SS:[EBP-4]
00494EFA   85DB             TEST EBX,EBX
00494EFC   74 09            JE SHORT 变压器设.00494F07
00494EFE   53               PUSH EBX
00494EFF   E8 7C890000      CALL 变压器设.0049D880
00494F04   83C4 04          ADD ESP,4
00494F07   8B5D F4          MOV EBX,DWORD PTR SS:[EBP-C]
00494F0A   85DB             TEST EBX,EBX
00494F0C   74 09            JE SHORT 变压器设.00494F17
00494F0E   53               PUSH EBX
00494F0F   E8 6C890000      CALL 变压器设.0049D880
00494F14   83C4 04          ADD ESP,4
00494F17   58               POP EAX
00494F18   8BE5             MOV ESP,EBP
00494F1A   5D               POP EBP
00494F1B   C3               RETN

6.算法总结:(以我的为例)

        机器码:166385371.9427
   -————————————————
    机器码取整得:166385371转为十六进制09EAD6DB 
   ---------------------------------
    09EAD6DB作求反运算得:F6152924
   
    F6152924 and 3FB3A975(常数)=36112924 (十六进制) ............注册码第一部份
      
  ------------------------------------------------------------

   09EAD6DB xor 3FB3A975(常数)=36597FAE  (十六进制) ............注册码第二部份

  ------------------------------------------------------------

   09EAD6DB or 75BCD15(常数) =FFBDFDF   (十六进制) ............注册码第三部份

  ------------------------------------------------------------
上面三部份用“-”连结起来就的到了注册码: 36112924-36597FAE-FFBDFDF
                                         

7.VB注册机:
 

Private Sub Command1_Click()

On Error Resume Next
s = Text1.Text
If s = "" Then Exit Sub
m = Fix(s)
s1 = Not (m) And &H3FB3A975
s2 = m Xor &H3FB3A975
s3 = m Or &H75BCD15
Text2.Text = Hex(s1) + "-" + Hex(s2) + "-" + Hex(s3)

End Sub