飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1863|回复: 2

[原创] 分析KeygenMe2014#001——山重水复疑无路,柳暗花明又一村 【下篇】 算法注册机源码

[复制链接]
  • TA的每日心情
    开心
    2019-3-17 22:44
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2014-9-10 22:26:42 | 显示全部楼层 |阅读模式
    本帖最后由 tree_fly 于 2014-11-25 22:17 编辑
    评委:GGLHY、月之精灵
    观战:飘云

    特此声明:
    A.不得利用CM自身任何BUG绕过注册机
    B.算法程序。请勿爆破
    C.分析好的文章评优秀、精华,奖励PYB
    D.记住:没什么值得炫耀的!


    1.请提交一组合法KEY信息[设置阅读权限]
    2.请提交胜利截图[部分信息隐藏]
    3.请提交算法分析[另外开贴,设置阅读权限]
    4.请提交注册机及源码详细内容。

    跳转:https://www.chinapyg.com/thread-72326-1-1.html


    分析KeyGenMe(KM)2014#001——山重水复疑无路,柳暗花明又一村。 【下篇】 算法+注册机+源码


    链接:[原创] 分析KeygenMe(KM)2014#001——山重水复疑无路,柳暗花明又一村。 【上篇】

    0x04 算法篇***************************************************************************************
    1.算法关键CALL入口:
    00401350   $  55            PUSH    EBP                                    


    2.分别获取机器码、用户名、注册码长度并保存于EDX、ESI、EDI。
    00401386   .  8BD1          MOV     EDX, ECX                          ;  EDX 机器码长度
    00401388   .  8955 E4       MOV     DWORD PTR SS:[EBP-1C], EDX
    0040138B   .  8B7D 10       MOV     EDI, DWORD PTR SS:[EBP+10]
    0040138E   .  83C9 FF       OR      ECX, FFFFFFFF
    00401391   .  F2:AE         REPNE   SCAS BYTE PTR ES:[EDI]
    00401393   .  F7D1          NOT     ECX
    00401395   .  49            DEC     ECX
    00401396   .  8BF1          MOV     ESI, ECX                          ;  ESI 用户名长度
    00401398   .  8975 E0       MOV     DWORD PTR SS:[EBP-20], ESI
    0040139B   .  8B7D 14       MOV     EDI, DWORD PTR SS:[EBP+14]
    0040139E   .  83C9 FF       OR      ECX, FFFFFFFF
    004013A1   .  F2:AE         REPNE   SCAS BYTE PTR ES:[EDI]
    004013A3   .  F7D1          NOT     ECX
    004013A5   .  49            DEC     ECX
    004013A6   .  8BF9          MOV     EDI, ECX                          ;  EDI 注册码长度


    3.判断用户名长度不大于0x10.
    004013C2   .  83FE 10       CMP     ESI, 10                          ;  判断用户名长度<=0x10
    004013C5   .  0F87 32020000 JA      KG_Unpac.004015FD


    4.在文件篇提到文件大小校验成功后,全局变量值保值原有值没有被修改,这里获取其内容“-”给ESI。
    从第一位注册码开始如下运算:第1位字节值*8,累加第2位字节值,再重复以上运算直到累加到最后1位,
    或者遇到“-”终止符。
    004013D1   .  8B35 10A04000 MOV     ESI, DWORD PTR DS:[40A010]            ;  取得短横线"-"
    004013D7   .  81E6 FF000000 AND     ESI, 0FF
    004013DD   >  8B45 14       MOV     EAX, DWORD PTR SS:[EBP+14]            ;  取每一位注册码运算,直到遇到"-"
    004013E0   .  8A0402        MOV     AL, BYTE PTR DS:[EDX+EAX]
    004013E3   .  0FBED8        MOVSX   EBX, AL
    004013E6   .  3BDE          CMP     EBX, ESI
    004013E8   .  75 04         JNZ     SHORT KG_Unpac.004013EE
    004013EA   .  3C 2D         CMP     AL, 2D
    004013EC   .  74 0F         JE      SHORT KG_Unpac.004013FD
    004013EE   >  C0E1 03       SHL     CL, 3                                 ;  CL *8
    004013F1   .  02C8          ADD     CL, AL                                ;  CL +=AL
    004013F3   .  42            INC     EDX
    004013F4   .  3BD7          CMP     EDX, EDI
    004013F6   .^ 72 E5         JB      SHORT KG_Unpac.004013DD


    5.取出累计值CL,再次累加用户名的第6位字节值,注意是第6位。并再次保存入内存地址:0012F490.
    若用户名小于6位字符串,累加初始化的0,这里可以在内存中查看。
    004013FF   > \884D D8       MOV     BYTE PTR SS:[EBP-28], CL
    00401402   >  84C9          TEST    CL, CL
    00401404   .  74 09         JE      SHORT KG_Unpac.0040140F
    00401406   .  8B55 10       MOV     EDX, DWORD PTR SS:[EBP+10]
    00401409   .  024A 05       ADD     CL, BYTE PTR DS:[EDX+5]    ;此处EDX是用户名的地址值。
    0040140C   .  884D D8       MOV     BYTE PTR SS:[EBP-28], CL


    6.程序再次取出CL,并带入新的CALL,这也是个关键CALL。
    00401431   > \8B45 D8       MOV     EAX, DWORD PTR SS:[EBP-28]            ;  USER32.77D6B04C
    00401434   .  50            PUSH    EAX                                   ;  USER32.77D6B04C
    00401435   .  68 1D030000   PUSH    31D
    0040143A   .  68 14104000   PUSH    KG_Unpac.00401014
    0040143F   .  E8 1C2E0000   CALL    KG_Unpac.00404260










    0x04-1 解密篇******************************************************************************
    7.程序备份了地址段 401014至401330,长度0x31D的内容至新地址 411FF0,可能原因之一是解密失败时重新还原再次来过。
    看来这段数据是非常重要的。
    0040141F   .  B9 C7000000   MOV     ECX, 0C7
    00401424   .  BE 14104000   MOV     ESI, KG_Unpac.00401014
    00401429   .  BF F01F4100   MOV     EDI, KG_Unpac.00411FF0
    0040142E   .  F3:A5         REP     MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[>
    00401430   .  A4            MOVS    BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]


    备份区长度:0x31D的内容:
    00411FF0  39 10 E9 A9 A9 A9 9A 69 24 D5 8D 94 6F ED 8D 95  9椹┅歩$諐攐韻
    00412000  A9 5A 02 CF 02 03 10 E9 A9 A9 A9 9A 69 24 15 8D  ㈱?椹┅歩$
    00412010  E0 AA A9 A9 6F 2D 8D E1 AA A9 A9 A9 5A 02 CF 02  嗒┅o-嶀?┅Z?
    00412020  03 10 E9 A9 A9 A9 9A 69 24 15 8D E8 A8 A9 A9 6F  椹┅歩$嶈ī﹐
    00412030  2D 8D E9 A8 A9 A9 A9 5A 02 CF 02 03 10 E9 A9 A9  -嶉ī┅Z?椹
    00412040  A9 9A 69 24 15 8D EC AB A9 A9 6F 2D 8D ED AB A9  ?i$嶌?﹐-嶍?
    00412050  A9 A9 5A 02 22 05 8D F1 AD A9 A9 22 1D 8D C9 AD  ┅Z"嶑??嵣
    00412060  A9 A9 CF 02 9A 60 EF 03 20 E5 8D B4 9A 69 20 E5  ┅?歚? 鍗礆i 
    00412070  8D 88 20 ED 8D B8 22 54 2A 60 56 5B 07 5E 78 E0  崍 韻?T*`V[^x
    00412080  20 ED 8D BC 22 78 20 1D 8D C9 AD A9 A9 28 4B AE   韻?x 嵣??K
    00412090  A9 A9 29 6F ED 8D B9 8A 6F ED 8D B8 9A 6F ED 8D  ┅)o韻箠o韻笟o韻
    004120A0  BB 9B 6F ED 8D BA 9E 6F ED 8D BD 9E 6F ED 8D BC  粵o韻簽o韻綖o韻
    004120B0  99 21 ED 8D BF 6F ED 8D B5 EA 6F ED 8D B4 E1 6F  ?韻縪韻店o韻瘁o
    004120C0  ED 8D B7 E0 6F ED 8D B6 E7 6F ED 8D 89 E8 6F ED  韻粪o韻剁o韻夎o
    004120D0  8D 88 F9 6F ED 8D 8B F0 6F ED 8D 8A EE 21 ED 8D  崍鵲韻嬸o韻婎!韻
    004120E0  B1 D0 AC E3 2A 63 51 EB 22 68 30 DC A3 2A 4B AE  毙?*cQ?h0埽*K
    004120F0  AA 6B 68 51 AA 42 A0 2A 4B AE AA 6B 68 51 AA E9  猭hQ狟?K?khQ?
    00412100  24 9D 6C A9 A9 A9 A9 24 ED 8D B9 C3 A9 F9 22 54  $漧┅┅$韻姑?"T
    00412110  2A 60 56 9A 69 5B 07 5E 78 E0 F8 24 25 8D E5 A8  *`V歩[^x帏$%嶅
    00412120  A9 A9 F8 FC 24 E5 8D 95 41 16 AD A9 A9 22 54 2A  ┅?$鍗旳??T*
    00412130  60 56 9A 69 24 FD 8D B5 5B 07 5E 78 C3 A9 E0 FB  `V歩$龒礫^x茅帑
    00412140  24 2D 8D E5 AB A9 A9 F8 F9 FC 24 E5 8D 95 41 30  $-嶅???$鍗旳0
    00412150  AD A9 A9 22 B4 35 38 E9 A9 9A 56 2C 5F D7 88 24  ???8椹歏,_讏$
    00412160  C5 8D 95 9A 60 23 25 95 E9 A8 A9 A9 F8 C1 9D 09  艒暁`#%曢ī?翝.
    00412170  E9 A9 FC 56 7A 2A 6D A5 EE 2A 6C AB 92 57 D5 4A  椹黇z*mヮ*l珤W認
    00412180  9A 56 2C 5F D7 88 24 C5 DD 95 9A 7B 23 3D 95 ED  歏,_讏$泡暁{#=曧
    00412190  AB A9 A9 FB C1 85 09 E9 A9 FC 56 7A 2A 6D A5 EE  ??羺.椹黇z*mヮ
    004121A0  2A 6C AB 92 57 D5 4A 22 3D 8D F5 AD A9 A9 2A 60  *l珤W認"=嶕??`
    004121B0  56 22 53 9A 69 9A 44 5B 07 5E 78 E0 A6 2D 2C A9  V"S歩欴[^x唳-,
    004121C0  A9 A9 22 2D 8D C9 AD A9 A9 AA 79 20 FD 8D 91 22  ┅"-嵣?┆y 龒?
    004121D0  E5 8D 91 A6 17 B5 80 56 BC A9 38 E9 A9 22 9C BD  鍗懄祤V缉8椹"溄
    004121E0  09 E9 A9 2A 60 56 22 57 9A 69 9A 7B 5B 07 5E 78  .椹*`V"W歩歿[^x
    004121F0  E0 DD 97 A6 17 AD 9B 92 71 DD BA 22 57 2A 60 56  噍棪瓫抭莺"W*`V
    00412200  9A 69 EB 5B 07 5E 78 E0 92 78 DB 4E 42 8A 2C 7B  歩隱^x鄴x跱B?{
    00412210  D5 A3 2A 53 A0 D6 AC 29 6B 99 42 A1 2A 53 A3 D5  眨*S犞?k橞?SU
    00412220  A3 29 6B 9E 21 3D 85 E1 AA A9 A9 56 BC A9 38 E9  ?k?=呩?¬缉8
    00412230  A9 22 15 8D F5 AD A9 A9 2A 60 56 9A 69 EC 5B 07  ?嶕??`V歩靃
    00412240  5E 78 E0 92 40 DB 21 6F 2D 85 E1 AA A9 A9 A9 24  ^x鄴@?o-呩?┅$
    00412250  DD 8D 95 24 2D 8D E1 AA A9 A9 23 B9 23 B7 23 63  輱?-嶀????c
    00412260  93 7A DC B7 2D 60 DD BF 23 F9 A8 23 F7 A8 23 63  搝芊-`菘#?#鳕#c
    00412270  93 7A DC A7 2A 69 AB 2A 6F AB 2D 60 DC 75 9A 69  搝堙*i?o?`躸歩
    00412280  42 AC B2 69 2A 71 56 2C 69 DC D7 22 35 8D FD AD  B?i*qV,i茏"5嶟
    00412290  A9 A9 21 ED 8D 85 20 ED 8D 84 9A 5F 20 ED 8D 98  ┅!韻?韻剼_ 韻
    004122A0  22 42 CF 20 ED 8D 9C 56 BC A9 38 E9 A9 22 52 2A  "B?韻淰缉8椹"R*
    004122B0  60 56 9A 69 23 3F 5D 8A E8 A9 5B 07 5E 78 E0 57  `V歩#?]婅?^x郬
    004122C0  6B 23 ED 80 56 9B 6B 21 ED 9D 85 EF E4 2A 57 A3  k#韤V沰!頋咃?W
    004122D0  DB 7C 22 94 09 38 E9 A9 24 E5 8D 85 6F ED 9D 85  踻"?8椹$鍗卭頋
    004122E0  A9 22 1D 8D F9 AD A9 A9 F8 C1 5F AA A9 A9 FF 56  ?嶚??羅??V
    004122F0  7E F9 56 BC 0D 38 E9 A9 C3 A9 C1 5F AA A9 A9 FF  ~鵙?8椹茅羅??
    00412300  56 7E F9 56 BC 01 38 E9 A9 39 F6 F7 F4           V~鵙?8椹9鲼?..


    8.我们进入了这个关键CALL,这里调用了[ESP+4]=00401014内容,取出ECX=0x31D,以及CL的值给DL。
    并进行了XOR运算,很显然这里对加密字节进行解密操作了,这3个参数只有CL是变量,所以CL是一把钥匙,是通向成功的关键钥匙!
    00404230  /> /8B4424 04     MOV     EAX, DWORD PTR SS:[ESP+4]             ;  KG_Unpac.00401014
    00404234  |. |85C0          TEST    EAX, EAX                              ;  USER32.77D6B04C
    00404236  |. |74 1B         JE      SHORT KG_Unpac.00404253
    00404238  |. |8B4C24 08     MOV     ECX, DWORD PTR SS:[ESP+8]
    0040423C  |. |85C9          TEST    ECX, ECX
    0040423E  |. |7E 13         JLE     SHORT KG_Unpac.00404253
    00404240  |. |8A5424 0C     MOV     DL, BYTE PTR SS:[ESP+C]
    00404244  |. |53            PUSH    EBX
    00404245  |> |8A18          /MOV     BL, BYTE PTR DS:[EAX]
    00404247  |. |32DA          |XOR     BL, DL
    00404249  |. |8818          |MOV     BYTE PTR DS:[EAX], BL
    0040424B  |. |40            |INC     EAX                                  ;  USER32.77D6B04C
    0040424C  |. |49            |DEC     ECX
    0040424D  |.^|75 F6         \JNZ     SHORT KG_Unpac.00404245
    0040424F  |. |5B            POP     EBX                                   ;  KG_Unpac.00401444
    00404250  |. |B0 01         MOV     AL, 1
    00404252  |. |C3            RETN
    00404253  |> |32C0          XOR     AL, AL
    00404255  |. |C3            RETN


    9.目前暂且不清楚CL的正确值,我们继续跟入下一个关键CALL 401000:
    目测代码似乎出错了,Ctrl+A,OD仍然不能分析出401016附近的代码。很显然由于CL这把钥匙没有解开加密的代码!
    00401000   $  81EC 3C040000 SUB     ESP, 43C
    00401006   .  53            PUSH    EBX
    00401007   .  55            PUSH    EBP
    00401008   .  56            PUSH    ESI                                   ;  KG_Unpac.00401331
    00401009   .  57            PUSH    EDI                                   ;  KG_Unpac.0041230D
    0040100A   .  C705 E81F4100>MOV     DWORD PTR DS:[411FE8], 5A5A5A5A
    00401014   .  75 5C         JNZ     SHORT KG_Unpac.00401072
    00401016      A5            DB      A5
    00401017      E5            DB      E5
    00401018      E5            DB      E5
    00401019      E5            DB      E5
    0040101A      D6            DB      D6


    10.似乎目前遇到瓶颈。CL可行性范围包括(00-FF),即使逐一爆破我们仍需一个判断解密成功的条件。
    我们来仔细研究以下这段加密代码,看看长度0x31D后面的部分,加密段从401014 至 401330,
    所以401331开始的字节便没有被加密。 Ctrl+G,输入到达地址 401331,即可看到这里。
    00401331   ?  5B            POP     EBX                     
    00401332   ?  81C4 3C040000 ADD     ESP, 43C
    00401338   ?  C3            RETN




    11.聪明的你是否看出来什么?
    是的,这段代码结束了,开始POP操作并修正ESP后RETN了。
    根据压栈原理,POP EBX上一行代码,应该是什么?
    这是代码开头段:
    00401000   $  81EC 3C040000 SUB     ESP, 43C
    00401006   .  53            PUSH    EBX
    00401007   .  55            PUSH    EBP
    00401008   .  56            PUSH    ESI         
    00401009   .  57            PUSH    EDI           


    是的,应该这样:
    0040132E                    POP     EDI
    0040132F                    POP     ESI  
    00401330                    POP     EBP
    00401331   ?  5B            POP     EBX                     
    00401332   ?  81C4 3C040000 ADD     ESP, 43C
    00401338   ?  C3            RETN


    再来看看被加密的这三个字节是什么:
    00412300  56 7E F9 56 BC 01 38 E9 A9 39 F6 F7 F4           V~鵙?8椹9鲼?..


    按照顺序是 F6 F7 F4,所以
    POP EDI   5F(真实) XOR ? =F6
    POP ESI   5E(真实) XOR ? =F7
    POP EBP   5D(真实) XOR ? =F4


    显然 ? = A9.
    至此,钥匙成功找到了,问题变成了怎样构造函数让CL=A9,这个问题我们后面继续。


    我们来重新运行程序,并在解密之前修改CL,看看有什么变化。
    00401000  /$  81EC 3C040000 SUB     ESP, 43C                         ;  算法最终Call
    00401006  |.  53            PUSH    EBX
    00401007  |.  55            PUSH    EBP
    00401008  |.  56            PUSH    ESI                              ;  KG_Unpac.00401331
    00401009  |.  57            PUSH    EDI                              ;  KG_Unpac.0041230D
    0040100A  |.  C705 E81F4100>MOV     DWORD PTR DS:[411FE8], 5A5A5A5A
    00401014  |.  90            NOP
    00401015  |.  B9 40000000   MOV     ECX, 40
    0040101A  |.  33C0          XOR     EAX, EAX
    0040101C  |.  8D7C24 3D     LEA     EDI, DWORD PTR SS:[ESP+3D]
    00401020  |.  C64424 3C 00  MOV     BYTE PTR SS:[ESP+3C], 0
    00401025  |.  F3:AB         REP     STOS DWORD PTR ES:[EDI]
    00401027  |.  66:AB         STOS    WORD PTR ES:[EDI]
    00401029  |.  AA            STOS    BYTE PTR ES:[EDI]
    0040102A  |.  B9 40000000   MOV     ECX, 40
    0040102F  |.  33C0          XOR     EAX, EAX
    00401031  |.  8DBC24 490300>LEA     EDI, DWORD PTR SS:[ESP+349]
    程序代码段被解密,OD正确分析了这段代码。












    0x04-2 字符串篇**********************************************************************************
    1.字符串常量
    004010B7  |.  C64424 10 23  MOV     BYTE PTR SS:[ESP+10], 23
    004010BC  |.  C64424 11 33  MOV     BYTE PTR SS:[ESP+11], 33
    004010C1  |.  C64424 12 32  MOV     BYTE PTR SS:[ESP+12], 32
    004010C6  |.  C64424 13 37  MOV     BYTE PTR SS:[ESP+13], 37
    004010CB  |.  C64424 14 37  MOV     BYTE PTR SS:[ESP+14], 37
    004010D0  |.  C64424 15 30  MOV     BYTE PTR SS:[ESP+15], 30
    004010D5  |.  884424 16     MOV     BYTE PTR SS:[ESP+16], AL
    004010D9  |.  C64424 1C 43  MOV     BYTE PTR SS:[ESP+1C], 43
    004010DE  |.  C64424 1D 48  MOV     BYTE PTR SS:[ESP+1D], 48
    004010E3  |.  C64424 1E 49  MOV     BYTE PTR SS:[ESP+1E], 49
    004010E8  |.  C64424 1F 4E  MOV     BYTE PTR SS:[ESP+1F], 4E
    004010ED  |.  C64424 20 41  MOV     BYTE PTR SS:[ESP+20], 41
    004010F2  |.  C64424 21 50  MOV     BYTE PTR SS:[ESP+21], 50
    004010F7  |.  C64424 22 59  MOV     BYTE PTR SS:[ESP+22], 59
    004010FC  |.  C64424 23 47  MOV     BYTE PTR SS:[ESP+23], 47
    00401101  |.  884424 18     MOV     BYTE PTR SS:[ESP+18], AL
    00401105  |.  79 05         JNS     SHORT KG_Unpac.0040110C


    0012EF10  23 33 32 37 37 30 00                             #32770.
    0012EF1C  43 48 49 4E 41 50 59 47 00                       CHINAPYG.


    2.加密方式一:分析接下来的几个CALL,来到这里:
    00401DC0  /$  81EC DC050000 SUB     ESP, 5DC
    00401DC6  |.  53            PUSH    EBX
    00401DC7  |.  55            PUSH    EBP
    00401DC8  |.  56            PUSH    ESI
    00401DC9  |.  57            PUSH    EDI
    00401DCA  |.  8BF1          MOV     ESI, ECX
    00401DCC  |.  BD 09000000   MOV     EBP, 9
    00401DD1  |.  BB 01000000   MOV     EBX, 1
    00401DD6  |.  BF 1D000000   MOV     EDI, 1D
    00401DDB  |.  BA 15000000   MOV     EDX, 15
    00401DE0  |.  B9 0D000000   MOV     ECX, 0D
    00401DE5  |.  B8 05000000   MOV     EAX, 5
    00401DEA  |.  C78424 DC0100>MOV     DWORD PTR SS:[ESP+1DC], 3A
    00401DF5  |.  C78424 E00100>MOV     DWORD PTR SS:[ESP+1E0], 32
    00401E00  |.  C78424 E40100>MOV     DWORD PTR SS:[ESP+1E4], 2A
    00401E0B  |.  C78424 E80100>MOV     DWORD PTR SS:[ESP+1E8], 22
    00401E16  |.  C78424 EC0100>MOV     DWORD PTR SS:[ESP+1EC], 1A
    00401E21  |.  C78424 F00100>MOV     DWORD PTR SS:[ESP+1F0], 12
    00401E2C  |.  C78424 F40100>MOV     DWORD PTR SS:[ESP+1F4], 0A
    00401E37  |.  C78424 F80100>MOV     DWORD PTR SS:[ESP+1F8], 2
    00401E42  |.  C78424 FC0100>MOV     DWORD PTR SS:[ESP+1FC], 3C
    00401E4D  |.  C78424 000200>MOV     DWORD PTR SS:[ESP+200], 34
    00401E58  |.  C78424 040200>MOV     DWORD PTR SS:[ESP+204], 2C
    00401E63  |.  C78424 080200>MOV     DWORD PTR SS:[ESP+208], 24
    00401E6E  |.  C78424 0C0200>MOV     DWORD PTR SS:[ESP+20C], 1C
    00401E79  |.  C78424 100200>MOV     DWORD PTR SS:[ESP+210], 14


    大幅度的内存赋值,内存中看到这些:
    0012E230  01 00 00 00 01 00 00 00 02 00 00 00 02 00 00 00  ............
    0012E240  02 00 00 00 02 00 00 00 02 00 00 00 02 00 00 00  ............
    0012E250  01 00 00 00 02 00 00 00 02 00 00 00 02 00 00 00  ............
    0012E260  02 00 00 00 02 00 00 00 02 00 00 00 01 00 00 00  ............


    这些:
    0012E450  00 00 00 01 01 01 01 01 00 00 00 01 01 00 00 00  .........
    0012E460  00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 01  ............
    0012E470  01 01 01 01 00 00 00 01 01 00 00 00 00 00 00 00  ..........
    0012E480  00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00  .............
    0012E490  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    0012E4A0  00 00 01 01 01 01 01 01 00 00 01 01 00 00 00 00  ........
    0012E4B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01  ..............


    程序似乎在进行DES算法加密操作。
    分两段加密
    1.密钥 #32770
       原文 CCCCC]
       密文 32CF8FCE6F4E985F
    2.密钥 CHINAPYG
       原文 CCCCC]
       密文 0996A88B246A62FB
    然后将两段加密后密文拼接。
    0012EF3C  33 32 43 46 38 46 43 45 36 46 34 45 39 38 35 46  32CF8FCE6F4E985F
    0012EF4C  30 39 39 36 41 38 38 42 32 34 36 41 36 32 46 42  0996A88B246A62FB
    可以用加密软件证实一下:




    3.加密方式二:
    004011CB  |> \8B9424 5C0400>MOV     EDX, DWORD PTR SS:[ESP+45C]
    004011D2  |.  83C9 FF       OR      ECX, FFFFFFFF
    004011D5  |.  8BFA          MOV     EDI, EDX
    004011D7  |.  33C0          XOR     EAX, EAX
    004011D9  |.  33ED          XOR     EBP, EBP
    004011DB  |.  F2:AE         REPNE   SCAS BYTE PTR ES:[EDI]
    004011DD  |.  F7D1          NOT     ECX
    004011DF  |.  49            DEC     ECX
    004011E0  |.  0F84 85000000 JE      KG_Unpac.0040126B
    004011E6  |.  8B8424 600400>MOV     EAX, DWORD PTR SS:[ESP+460]
    004011ED  |.  03D0          ADD     EDX, EAX
    004011EF  |.  895424 38     MOV     DWORD PTR SS:[ESP+38], EDX
    004011F3  |>  8B4C24 38     /MOV     ECX, DWORD PTR SS:[ESP+38]
    004011F7  |.  0FBE1C29      |MOVSX   EBX, BYTE PTR DS:[ECX+EBP]
    004011FB  |.  FF15 00914000 |CALL    NEAR DWORD PTR DS:[<&msvcrt.rand>]     ; [rand
    00401201  |.  8B35 14A04000 |MOV     ESI, DWORD PTR DS:[40A014]             ;  KG_Unpac.0040A018
    00401207  |.  83C9 FF       |OR      ECX, FFFFFFFF
    0040120A  |.  8BFE          |MOV     EDI, ESI                               ;  KG_Unpac.0040A018
    0040120C  |.  33C0          |XOR     EAX, EAX
    0040120E  |.  33D2          |XOR     EDX, EDX
    00401210  |.  F2:AE         |REPNE   SCAS BYTE PTR ES:[EDI]
    00401212  |.  F7D1          |NOT     ECX
    00401214  |.  49            |DEC     ECX
    00401215  |.  74 3E         |JE      SHORT KG_Unpac.00401255
    00401217  |>  0FBE0432      |/MOVSX   EAX, BYTE PTR DS:[EDX+ESI]
    0040121B  |.  3BD8          ||CMP     EBX, EAX
    0040121D  |.  74 13         ||JE      SHORT KG_Unpac.00401232
    0040121F  |.  8BFE          ||MOV     EDI, ESI                              ;  KG_Unpac.0040A018
    00401221  |.  83C9 FF       ||OR      ECX, FFFFFFFF
    00401224  |.  33C0          ||XOR     EAX, EAX
    00401226  |.  42            ||INC     EDX
    00401227  |.  F2:AE         ||REPNE   SCAS BYTE PTR ES:[EDI]
    00401229  |.  F7D1          ||NOT     ECX
    0040122B  |.  49            ||DEC     ECX
    0040122C  |.  3BD1          ||CMP     EDX, ECX
    0040122E  |.^ 72 E7         |\JB      SHORT KG_Unpac.00401217
    00401230  |.  EB 23         |JMP     SHORT KG_Unpac.00401255
    00401232  |>  85D2          |TEST    EDX, EDX
    00401234  |.  7C 0A         |JL      SHORT KG_Unpac.00401240
    00401236  |.  83FA 09       |CMP     EDX, 9
    00401239  |.  7F 05         |JG      SHORT KG_Unpac.00401240
    0040123B  |.  80C2 30       |ADD     DL, 30
    0040123E  |.  EB 08         |JMP     SHORT KG_Unpac.00401248
    00401240  |>  83FA 0A       |CMP     EDX, 0A
    00401243  |.  7C 0A         |JL      SHORT KG_Unpac.0040124F
    00401245  |.  80C2 37       |ADD     DL, 37
    00401248  |>  88942C 480300>|MOV     BYTE PTR SS:[ESP+EBP+348], DL
    0040124F  |>  FF15 00914000 |CALL    NEAR DWORD PTR DS:[<&msvcrt.rand>]     ; [rand
    00401255  |>  8BBC24 5C0400>|MOV     EDI, DWORD PTR SS:[ESP+45C]
    0040125C  |.  83C9 FF       |OR      ECX, FFFFFFFF
    0040125F  |.  33C0          |XOR     EAX, EAX
    00401261  |.  45            |INC     EBP
    00401262  |.  F2:AE         |REPNE   SCAS BYTE PTR ES:[EDI]
    00401264  |.  F7D1          |NOT     ECX
    00401266  |.  49            |DEC     ECX
    00401267  |.  3BE9          |CMP     EBP, ECX
    00401269  |.^ 72 88         \JB      SHORT KG_Unpac.004011F3
    0040126B  |>  C6842C 480300>MOV     BYTE PTR SS:[ESP+EBP+348], 0


    程序再次行基本的替代加、解密操作,还记得“凯撒密码”吗,简述如下:
    用户名 CCCCC] 行DES加密后的16进制密文:
    32CF8FCE6F4E985F0996A88B246A62FB


    解密钥匙:ASCII "9A028B3C4D1E56F7"
    所以对照表:
    A:0 1 2 3 4 5 6 7 8 9 A B C D E F
    B:9 A 0 2 8 B 3 C 4 D 1 E 5 6 F 7


    真实码:2057475F378FD4B79DD3144E0831307E
    参杂对照表解密(由B查A),如2对应3,0对应2,最后如下:
    解密后:32CF8FCE6F4E985F0996A88B246A62FB


    程序将注册码后半部分的真实码按照对照表解密后与DES加密文比对。
    如果相等,注册码便是正确的。









    0x05 按钮篇 *************************************************************************************
    1.注册码正确后,计算按钮控件的文字便出现了变化,但是是乱码。如何才能正确显示为已注册呢?


    004012CB  |> /FF15 00914000 /CALL    NEAR DWORD PTR DS:[<&msvcrt.rand>]     ; [rand
    004012D1  |. |8BFB          |MOV     EDI, EBX
    004012D3  |. |83C9 FF       |OR      ECX, FFFFFFFF
    004012D6  |. |33C0          |XOR     EAX, EAX
    004012D8  |. |8A96 F4234100 |MOV     DL, BYTE PTR DS:[ESI+4123F4]           ;  全局变量(文件读入的内容)
    004012DE  |. |F2:AE         |REPNE   SCAS BYTE PTR ES:[EDI]
    004012E0  |. |F7D1          |NOT     ECX
    004012E2  |. |49            |DEC     ECX
    004012E3  |. |FEC2          |INC     DL
    004012E5  |. |8A4429 FF     |MOV     AL, BYTE PTR DS:[ECX+EBP-1]
    004012E9  |. |32C2          |XOR     AL, DL
    004012EB  |. |884434 2C     |MOV     BYTE PTR SS:[ESP+ESI+2C], AL
    004012EF  |. |46            |INC     ESI
    004012F0  |. |4D            |DEC     EBP
    004012F1  |. |83FE 0A       |CMP     ESI, 0A
    004012F4  |.^\72 D5         \JB      SHORT KG_Unpac.004012CB


    2.程度读取地址DS:[ESI+4123F4]内容,这个地址正式前面提到的附加文件读取后写入的地址。


    我们需要这样的数据:
    0012EF2C  D2 D1 D7 A2 B2 E1 28 26 52 29 00                 已注册(&R).


    解密演示:
    "PYG20141187475968"
    文件:   1  2  3  4  5  6  7  8  9  10  11
             E9 E6 ED 96 84 D4 1E 1D 62 17   
    +1       EA E7 EE 97 85 D5 1F 1E 63 18     
             8  6  9  5  7  4  7  8  1  1  4
    XOR      38 36 39 35 37 34 37 38 31 31 31
             D2 D1 D7 A2 B2 E1 28 26 52 29    (逆向向上计算)


    所以还原后:
    004123F4  E9 E6 ED 96 84 D4 1E 1D 62 17 00                 殒頄勗b....


    文件内容随着机器码的变化而变化,所以注册机需要生成对应的文件。












    0x06 注册机及源码篇 ************************************************************************
    算法思路:
      1.注册码前部分需满足CL=A9,以解密代码让程序继续运行。
      2.加密用户名获取后部分注册码。
      3.拼接前后注册码即可。


    首先我们考虑1位注册码:(这里默认用户名及注册码均为可打印ASCII,用户名及注册码排除空格 0x21 - 0x7E )
    1位注册码+第6位用户名=0xA9 ,所有1位注册码列表如下:(这里大家可能看的糊涂,阅读注册机源码便可理解)


    Char:, Find 1 byte: 0x7D }
    Char:- Find 1 byte: 0x7C |
    Char:. Find 1 byte: 0x7B {
    Char:/ Find 1 byte: 0x7A z
    Char:0 Find 1 byte: 0x79 y
    Char:1 Find 1 byte: 0x78 x
    Char:2 Find 1 byte: 0x77 w
    Char:3 Find 1 byte: 0x76 v
    Char:4 Find 1 byte: 0x75 u
    Char:5 Find 1 byte: 0x74 t
    Char:6 Find 1 byte: 0x73 s
    Char:7 Find 1 byte: 0x72 r
    Char:8 Find 1 byte: 0x71 q
    Char:9 Find 1 byte: 0x70 p
    Char:: Find 1 byte: 0x6F o
    Char:; Find 1 byte: 0x6E n
    Char:< Find 1 byte: 0x6D m
    Char:= Find 1 byte: 0x6C l
    Char:> Find 1 byte: 0x6B k
    Char:? Find 1 byte: 0x6A j
    Char:@ Find 1 byte: 0x69 i
    Char:A Find 1 byte: 0x68 h
    Char:B Find 1 byte: 0x67 g
    Char:C Find 1 byte: 0x66 f
    Char:D Find 1 byte: 0x65 e
    Char:E Find 1 byte: 0x64 d
    Char:F Find 1 byte: 0x63 c
    Char:G Find 1 byte: 0x62 b
    Char:H Find 1 byte: 0x61 a
    Char:I Find 1 byte: 0x60 `
    Char:J Find 1 byte: 0x5F _
    Char:K Find 1 byte: 0x5E ^
    Char:L Find 1 byte: 0x5D ]
    Char:M Find 1 byte: 0x5C \
    Char:N Find 1 byte: 0x5B [
    Char:O Find 1 byte: 0x5A Z
    Char:P Find 1 byte: 0x59 Y
    Char:Q Find 1 byte: 0x58 X
    Char:R Find 1 byte: 0x57 W
    Char:S Find 1 byte: 0x56 V
    Char:T Find 1 byte: 0x55 U
    Char:U Find 1 byte: 0x54 T
    Char:V Find 1 byte: 0x53 S
    Char:W Find 1 byte: 0x52 R
    Char:X Find 1 byte: 0x51 Q
    Char:Y Find 1 byte: 0x50 P
    Char:Z Find 1 byte: 0x4F O
    Char:[ Find 1 byte: 0x4E N
    Char:\ Find 1 byte: 0x4D M
    Char:] Find 1 byte: 0x4C L
    Char:^ Find 1 byte: 0x4B K
    Char:_ Find 1 byte: 0x4A J
    Char:` Find 1 byte: 0x49 I
    Char:a Find 1 byte: 0x48 H
    Char:b Find 1 byte: 0x47 G
    Char:c Find 1 byte: 0x46 F
    Char:d Find 1 byte: 0x45 E
    Char:e Find 1 byte: 0x44 D
    Char:f Find 1 byte: 0x43 C
    Char:g Find 1 byte: 0x42 B
    Char:h Find 1 byte: 0x41 A
    Char:i Find 1 byte: 0x40 @
    Char:j Find 1 byte: 0x3F ?
    Char:k Find 1 byte: 0x3E >
    Char:l Find 1 byte: 0x3D =
    Char:m Find 1 byte: 0x3C <
    Char:n Find 1 byte: 0x3B ;
    Char:o Find 1 byte: 0x3A :
    Char:p Find 1 byte: 0x39 9
    Char:q Find 1 byte: 0x38 8
    Char:r Find 1 byte: 0x37 7
    Char:s Find 1 byte: 0x36 6
    Char:t Find 1 byte: 0x35 5
    Char:u Find 1 byte: 0x34 4
    Char:v Find 1 byte: 0x33 3
    Char:w Find 1 byte: 0x32 2
    Char:x Find 1 byte: 0x31 1
    Char:y Find 1 byte: 0x30 0
    Char:z Find 1 byte: 0x2F /
    Char:{ Find 1 byte: 0x2E .
    Char:} Find 1 byte: 0x2C ,
    Char:~ Find 1 byte: 0x2B +


    Char:  Nothing!
    Char:! Nothing!
    Char:" Nothing!
    Char:# Nothing!
    Char:$ Nothing!
    Char:% Nothing!
    Char:& Nothing!
    Char:' Nothing!
    Char:( Nothing!
    Char:) Nothing!
    Char:* Nothing!
    Char:+ Nothing!
    Char:| Find 1 byte: 0x2D -
    事实上,包括空格、感叹号等这几个字符,不能用1位注册码解决。
    以及用户名小于6位时,也不能用1位注册码解决。


    扩展到2位注册码试试:
    Char:!  Find 2 bytes:
    5y  6q  7i  8a  9Y  :Q  ;I  <A  =9  >1  ?)  @!  Uy  Vq  Wi  Xa  YY  ZQ  [I  \A  ]9  ^1  _)  `!  uy  vq  wi  xa  yY  zQ  {I  |A  }9  ~1
    Char:"  Find 2 bytes:
    5z  6r  7j  8b  9Z  :R  ;J  <B  =:  >2  ?*  @"  Uz  Vr  Wj  Xb  YZ  ZR  [J  \B  ]:  ^2  _*  `"  uz  vr  wj  xb  yZ  zR  {J  |B  }:  ~2
    Char:#  Find 2 bytes:
    5{  6s  7k  8c  9[  :S  ;K  <C  =;  >3  ?+  @#  U{  Vs  Wk  Xc  Y[  ZS  [K  \C  ];  ^3  _+  `#  u{  vs  wk  xc  y[  zS  {K  |C  };  ~3
    Char:$  Find 2 bytes:
    5|  6t  7l  8d  9\  :T  ;L  <D  =<  >4  ?,  @$  U|  Vt  Wl  Xd  Y\  ZT  [L  \D  ]<  ^4  _,  `$  u|  vt  wl  xd  y\  zT  {L  |D  }<  ~4
    Char:%  Find 2 bytes:
    5}  6u  7m  8e  9]  :U  ;M  <E  ==  >5  @%  U}  Vu  Wm  Xe  Y]  ZU  [M  \E  ]=  ^5  `%  u}  vu  wm  xe  y]  zU  {M  |E  }=  ~5
    Char:&  Find 2 bytes:
    5~  6v  7n  8f  9^  :V  ;N  <F  =>  >6  ?.  @&  U~  Vv  Wn  Xf  Y^  ZV  [N  \F  ]>  ^6  _.  `&  u~  vv  wn  xf  y^  zV  {N  |F  }>  ~6
    Char:'  Find 2 bytes:
    6w  7o  8g  9_  :W  ;O  <G  =?  >7  ?/  @'  Vw  Wo  Xg  Y_  ZW  [O  \G  ]?  ^7  _/  `'  vw  wo  xg  y_  zW  {O  |G  }?  ~7
    Char:(  Find 2 bytes:
    6x  7p  8h  9`  :X  ;P  <H  =@  >8  ?0  @(  Vx  Wp  Xh  Y`  ZX  [P  \H  ]@  ^8  _0  `(  vx  wp  xh  y`  zX  {P  |H  }@  ~8
    Char:)  Find 2 bytes:
    !!  6y  7q  8i  9a  :Y  ;Q  <I  =A  >9  ?1  @)  A!  Vy  Wq  Xi  Ya  ZY  [Q  \I  ]A  ^9  _1  `)  a!  vy  wq  xi  ya  zY  {Q  |I  }A  ~9
    Char:*  Find 2 bytes:
    !"  6z  7r  8j  9b  :Z  ;R  <J  =B  >:  ?2  @*  A"  Vz  Wr  Xj  Yb  ZZ  [R  \J  ]B  ^:  _2  `*  a"  vz  wr  xj  yb  zZ  {R  |J  }B  ~:
    Char:+  Find 2 bytes:
    !#  6{  7s  8k  9c  :[  ;S  <K  =C  >;  ?3  @+  A#  V{  Ws  Xk  Yc  Z[  [S  \K  ]C  ^;  _3  `+  a#  v{  ws  xk  yc  z[  {S  |K  }C  ~;


    最后处理一下0xA9:
    Char:(0xA9)  Find 2 bytes:
    &y  'q  (i  )a  *Y  +Q  ,I   9  /1  0)  1!  Fy  Gq  Hi  Ia  JY  KQ  LI  MA  N9  O1  P)  Q!  fy  gq  hi  ia  jY  kQ  lI  mA  n9  o1  p)  q!


    目前2位以内注册码均可解决所有用户名第6位了(这里排除了空格),不再继续分析,感兴趣的朋友,可以继续扩展前部分注册码的长度。


    部分截图:






    附件:

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x

    评分

    参与人数 1飘云币 +60 收起 理由
    GGLHY + 60 赞一个!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2014-9-10 22:50:15 | 显示全部楼层
    真心强悍~~~~
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    7 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2014-9-11 10:27:58 | 显示全部楼层
    非常聪明!
    终于有人利用栈平衡找到秘钥,这才算是逆向工程精髓,抽丝剥茧!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表