- UID
- 73854
注册时间2014-2-6
阅读权限85
最后登录1970-1-1
见习版主
TA的每日心情 | 开心 2019-3-17 22:44 |
---|
签到天数: 132 天 [LV.7]常住居民III
|
本帖最后由 tree_fly 于 2014-11-25 22:17 编辑
分析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
评分
-
查看全部评分
|