飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4058|回复: 6

[原创] 老板来啦--信任危机 V4.32算法深度分析 ASM注册函数

[复制链接]
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2010-5-1 20:28:23 | 显示全部楼层 |阅读模式
    【破文标题】老板来啦--信任危机 V4.32算法深度分析+ASM注册函数
    【破文作者】飘云/P.Y.G
    【官方主页】https://www.chinapyg.com
    【作者博客】http://blog.piaoyunsoft.com
    破解平台】WinXp SP3
    【破解工具】PEiD0.94、OD
    【作者邮箱】piaoyun04@163.com
    【软件名称】老板来啦--信任危机 V4.32
    【软件大小】673 K
    【原版下载】http://www.skycn.com/soft/20362.html
    【破解过程】

    这是个2004年的老软件~~ 拿来做教程吧,有点代表性~~~ASM代码的几个函数值得收藏~~ 哈~

    FSG1.3壳,脱壳过程--略

    OD载入脱壳后的程序

    搜索 "SOFTWARE\Microsoft\Sbackup5"

    找到如下代码:
    1. 00477D0A   .  BA C0884700    mov     edx, 004788C0                    ;  ASCII "SOFTWARE\Microsoft\Sbackup5"
    2. 00477D0F   .  A1 804E4800    mov     eax, dword ptr [484E80]
    3. 00477D14   .  E8 E383FEFF    call    004600FC
    4. 00477D19   .  8D4D F4        lea     ecx, dword ptr [ebp-C]
    5. 00477D1C   .  BA E4884700    mov     edx, 004788E4                    ;  ASCII "sysback"
    6. 00477D21   .  A1 804E4800    mov     eax, dword ptr [484E80]
    7. 00477D26   .  E8 B985FEFF    call    004602E4
    8. .
    9. .
    10. .
    11. .
    12. .
    13. .
    14. .
    15. 004780CF   .  E8 E4D7FFFF    call    004758B8
    16. 004780D4   .  8B55 98        mov     edx, dword ptr [ebp-68]          ;  机器码
    17. 004780D7   .  8B45 F4        mov     eax, dword ptr [ebp-C]
    18. 004780DA   .  E8 61C7F8FF    call    00404840
    19. 004780DF   .  0F85 87000000  jnz     0047816C
    20. 004780E5   .  8D45 94        lea     eax, dword ptr [ebp-6C]
    21. 004780E8   .  50             push    eax
    22. 004780E9   .  8D55 90        lea     edx, dword ptr [ebp-70]
    23. 004780EC   .  8B45 F4        mov     eax, dword ptr [ebp-C]
    24. 004780EF   .  E8 9CDAFFFF    call    00475B90                         ;  算法CALL,F7跟进
    25. 004780F4   .  8B45 90        mov     eax, dword ptr [ebp-70]
    26. 004780F7   .  B9 0A000000    mov     ecx, 0A                          ;  参数:10
    27. 004780FC   .  33D2           xor     edx, edx
    28. 004780FE   .  E8 51C8F8FF    call    00404954                         ;  截取前10位注册码,所以算法CALL里面的最后连接**部分是没用的
    29. 00478103   .  8B55 94        mov     edx, dword ptr [ebp-6C]          ;  真码
    30. 00478106   .  8B45 F0        mov     eax, dword ptr [ebp-10]          ;  假码
    31. 00478109   .  E8 32C7F8FF    call    00404840                         ;  比较
    32. 0047810E   .  75 5C          jnz     short 0047816C                   ;  关键跳转


    33. {----------------------算法CALL:--------------------------}
    34. 00475B90  /$  55            push    ebp
    35. 00475B91  |.  8BEC          mov     ebp, esp
    36. 00475B93  |.  33C9          xor     ecx, ecx
    37. 00475B95  |.  51            push    ecx
    38. 00475B96  |.  51            push    ecx
    39. 00475B97  |.  51            push    ecx
    40. 00475B98  |.  51            push    ecx
    41. 00475B99  |.  51            push    ecx
    42. 00475B9A  |.  51            push    ecx
    43. 00475B9B  |.  51            push    ecx
    44. 00475B9C  |.  51            push    ecx
    45. 00475B9D  |.  53            push    ebx
    46. 00475B9E  |.  56            push    esi
    47. 00475B9F  |.  8BF2          mov     esi, edx
    48. 00475BA1  |.  8945 FC       mov     dword ptr [ebp-4], eax
    49. 00475BA4  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
    50. 00475BA7  |.  E8 38EDF8FF   call    004048E4
    51. 00475BAC  |.  33C0          xor     eax, eax
    52. 00475BAE  |.  55            push    ebp
    53. 00475BAF  |.  68 8B5D4700   push    00475D8B
    54. 00475BB4  |.  64:FF30       push    dword ptr fs:[eax]
    55. 00475BB7  |.  64:8920       mov     dword ptr fs:[eax], esp
    56. 00475BBA  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
    57. 00475BBD  |.  E8 82E8F8FF   call    00404444
    58. 00475BC2  |.  8B45 FC       mov     eax, dword ptr [ebp-4]          ;  机器码
    59. 00475BC5  |.  E8 4E2EF9FF   call    00408A18                        ;  机器码转换成16进制
    60. 00475BCA  |.  B9 1F000000   mov     ecx, 1F                         ;  ecx = 0x1F
    61. 00475BCF  |.  99            cdq
    62. 00475BD0  |.  F7F9          idiv    ecx                             ;  eax / ecx
    63. 00475BD2  |.  05 750E0000   add     eax, 0E75                       ;  eax = 上面的结果 + 0x0E75
    64. 00475BD7  |.  B9 03000000   mov     ecx, 3                          ;  ecx = 3
    65. 00475BDC  |.  99            cdq
    66. 00475BDD  |.  F7F9          idiv    ecx                             ;  eax = eax / 3
    67. 00475BDF  |.  83C0 65       add     eax, 65                         ;  结果+0x65  保存到eax
    68. 00475BE2  |.  8D55 EC       lea     edx, dword ptr [ebp-14]
    69. 00475BE5  |.  E8 CA2DF9FF   call    004089B4                        ;  转换成10进制字符串 设为 X1
    70. 00475BEA  |.  8B55 EC       mov     edx, dword ptr [ebp-14]
    71. 00475BED  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
    72. 00475BF0  |.  E8 E7E8F8FF   call    004044DC
    73. 00475BF5  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
    74. 00475BF8  |.  8B55 FC       mov     edx, dword ptr [ebp-4]          ;  X1
    75. 00475BFB  |.  8A12          mov     dl, byte ptr [edx]              ;  第一位ASCII  设为 ASCII_X1_1
    76. 00475BFD  |.  E8 22EAF8FF   call    00404624                        ;  保存起来,下面要用到
    77. 00475C02  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
    78. 00475C05  |.  E8 F2EAF8FF   call    004046FC                        ;  X1长度
    79. 00475C0A  |.  8B55 FC       mov     edx, dword ptr [ebp-4]
    80. 00475C0D  |.  8A5402 FF     mov     dl, byte ptr [edx+eax-1]        ;  最后一位ASCII 设为 ASCII_X1_N
    81. 00475C11  |.  8D45 F0       lea     eax, dword ptr [ebp-10]
    82. 00475C14  |.  E8 0BEAF8FF   call    00404624                        ;  保存起来,下面要用到
    83. 00475C19  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
    84. 00475C1C  |.  E8 DBEAF8FF   call    004046FC
    85. 00475C21  |.  83F8 08       cmp     eax, 8
    86. 00475C24  |.  7E 18         jle     short 00475C3E                  ;  长度是否小于8位,小于则跳
    87. 00475C26  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
    88. 00475C29  |.  50            push    eax
    89. 00475C2A  |.  B9 08000000   mov     ecx, 8
    90. 00475C2F  |.  33D2          xor     edx, edx
    91. 00475C31  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
    92. 00475C34  |.  E8 1BEDF8FF   call    00404954
    93. 00475C39  |.  E9 AE000000   jmp     00475CEC
    94. 00475C3E  |>  8B45 FC       mov     eax, dword ptr [ebp-4]
    95. 00475C41  |.  E8 B6EAF8FF   call    004046FC
    96. 00475C46  |.  83F8 07       cmp     eax, 7                          ;  Switch (cases 0..7)
    97. 00475C49  |.  0F87 9D000000 ja      00475CEC
    98. 00475C4F  |.  FF2485 565C47>jmp     dword ptr [eax*4+475C56]        ;  下面是根据长度来拼接字符串~~ 最终为8位~ 设为X2
    99. 00475C56  |.  DF5C4700      dd      dumped_.00475CDF                ;  分支表 被用于 00475C4F
    100. 00475C5A  |.  D05C4700      dd      dumped_.00475CD0
    101. 00475C5E  |.  C15C4700      dd      dumped_.00475CC1
    102. 00475C62  |.  B25C4700      dd      dumped_.00475CB2
    103. 00475C66  |.  A35C4700      dd      dumped_.00475CA3
    104. 00475C6A  |.  945C4700      dd      dumped_.00475C94
    105. 00475C6E  |.  855C4700      dd      dumped_.00475C85
    106. 00475C72  |.  765C4700      dd      dumped_.00475C76
    107. 00475C76  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 7 of switch 00475C46
    108. 00475C79  |.  BA A05D4700   mov     edx, 00475DA0                   ;  ASCII "2"
    109. 00475C7E  |.  E8 81EAF8FF   call    00404704
    110. 00475C83  |.  EB 67         jmp     short 00475CEC
    111. 00475C85  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 6 of switch 00475C46
    112. 00475C88  |.  BA AC5D4700   mov     edx, 00475DAC                   ;  ASCII "25"
    113. 00475C8D  |.  E8 72EAF8FF   call    00404704
    114. 00475C92  |.  EB 58         jmp     short 00475CEC
    115. 00475C94  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 5 of switch 00475C46
    116. 00475C97  |.  BA B85D4700   mov     edx, 00475DB8                   ;  ASCII "232"
    117. 00475C9C  |.  E8 63EAF8FF   call    00404704
    118. 00475CA1  |.  EB 49         jmp     short 00475CEC
    119. 00475CA3  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 4 of switch 00475C46
    120. 00475CA6  |.  BA C45D4700   mov     edx, 00475DC4                   ;  ASCII "4675"
    121. 00475CAB  |.  E8 54EAF8FF   call    00404704
    122. 00475CB0  |.  EB 3A         jmp     short 00475CEC
    123. 00475CB2  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 3 of switch 00475C46
    124. 00475CB5  |.  BA D45D4700   mov     edx, 00475DD4                   ;  ASCII "83855"
    125. 00475CBA  |.  E8 45EAF8FF   call    00404704
    126. 00475CBF  |.  EB 2B         jmp     short 00475CEC
    127. 00475CC1  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 2 of switch 00475C46
    128. 00475CC4  |.  BA E45D4700   mov     edx, 00475DE4                   ;  ASCII "334342"
    129. 00475CC9  |.  E8 36EAF8FF   call    00404704
    130. 00475CCE  |.  EB 1C         jmp     short 00475CEC
    131. 00475CD0  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 1 of switch 00475C46
    132. 00475CD3  |.  BA F45D4700   mov     edx, 00475DF4                   ;  ASCII "3447584"
    133. 00475CD8  |.  E8 27EAF8FF   call    00404704
    134. 00475CDD  |.  EB 0D         jmp     short 00475CEC
    135. 00475CDF  |>  8D45 FC       lea     eax, dword ptr [ebp-4]          ;  Case 0 of switch 00475C46
    136. 00475CE2  |.  BA 045E4700   mov     edx, 00475E04                   ;  ASCII "47568328"
    137. 00475CE7  |.  E8 18EAF8FF   call    00404704
    138. 00475CEC  |>  BB 01000000   mov     ebx, 1                          ;  Default case of switch 00475C46
    139. 00475CF1  |>  8D45 E4       /lea     eax, dword ptr [ebp-1C]
    140. 00475CF4      8B55 FC       mov     edx, dword ptr [ebp-4]          ;  (ASCII "42074232")
    141. 00475CF7  |.  8A541A FF     |mov     dl, byte ptr [edx+ebx-1]       ;  第i位
    142. 00475CFB  |.  E8 24E9F8FF   |call    00404624
    143. 00475D00  |.  8B45 E4       |mov     eax, dword ptr [ebp-1C]
    144. 00475D03  |.  8D55 E8       |lea     edx, dword ptr [ebp-18]
    145. 00475D06  |.  E8 45FCFFFF   |call    00475950                       ;  对X2进行查表~~  F7进入,看下

    146. {
    147. ==========================================
    148. 00475AA0   dd      FFFFFFFF
    149. 00475AA4   dd      00000001
    150. 00475AA8   ascii   "1",0
    151. 00475AAA   db      00
    152. 00475AAB   db      00
    153. 00475AAC   dd      FFFFFFFF
    154. 00475AB0   dd      00000001
    155. 00475AB4   ascii   "I",0
    156. 00475AB6   db      00
    157. 00475AB7   db      00
    158. 00475AB8   dd      FFFFFFFF
    159. 00475ABC   dd      00000001
    160. 00475AC0   ascii   "2",0
    161. 00475AC2   db      00
    162. 00475AC3   db      00
    163. 00475AC4   dd      FFFFFFFF
    164. 00475AC8   dd      00000001
    165. 00475ACC   ascii   "M",0
    166. 00475ACE   db      00
    167. 00475ACF   db      00
    168. 00475AD0   dd      FFFFFFFF
    169. 00475AD4   dd      00000001
    170. 00475AD8   ascii   "3",0
    171. 00475ADA   db      00
    172. 00475ADB   db      00
    173. 00475ADC   dd      FFFFFFFF
    174. 00475AE0   dd      00000001
    175. 00475AE4   ascii   "J",0
    176. 00475AE6   db      00
    177. 00475AE7   db      00
    178. 00475AE8   dd      FFFFFFFF
    179. 00475AEC   dd      00000001
    180. 00475AF0   ascii   "4",0
    181. 00475AF2   db      00
    182. 00475AF3   db      00
    183. 00475AF4   dd      FFFFFFFF
    184. 00475AF8   dd      00000001
    185. 00475AFC   ascii   "S",0
    186. 00475AFE   db      00
    187. 00475AFF   db      00
    188. 00475B00   dd      FFFFFFFF
    189. 00475B04   dd      00000001
    190. 00475B08   ascii   "5",0
    191. 00475B0A   db      00
    192. 00475B0B   db      00
    193. 00475B0C   dd      FFFFFFFF
    194. 00475B10   dd      00000001
    195. 00475B14   ascii   "Z",0
    196. 00475B16   db      00
    197. 00475B17   db      00
    198. 00475B18   dd      FFFFFFFF
    199. 00475B1C   dd      00000001
    200. 00475B20   ascii   "6",0
    201. 00475B22   db      00
    202. 00475B23   db      00
    203. 00475B24   dd      FFFFFFFF
    204. 00475B28   dd      00000001
    205. 00475B2C   ascii   "T",0
    206. 00475B2E   db      00
    207. 00475B2F   db      00
    208. 00475B30   dd      FFFFFFFF
    209. 00475B34   dd      00000001
    210. 00475B38   ascii   "7",0
    211. 00475B3A   db      00
    212. 00475B3B   db      00
    213. 00475B3C   dd      FFFFFFFF
    214. 00475B40   dd      00000001
    215. 00475B44   ascii   "X",0
    216. 00475B46   db      00
    217. 00475B47   db      00
    218. 00475B48   dd      FFFFFFFF
    219. 00475B4C   dd      00000001
    220. 00475B50   ascii   "8",0
    221. 00475B52   db      00
    222. 00475B53   db      00
    223. 00475B54   dd      FFFFFFFF
    224. 00475B58   dd      00000001
    225. 00475B5C   ascii   "K",0
    226. 00475B5E   db      00
    227. 00475B5F   db      00
    228. 00475B60   dd      FFFFFFFF
    229. 00475B64   dd      00000001
    230. 00475B68   ascii   "9",0
    231. 00475B6A   db      00
    232. 00475B6B   db      00
    233. 00475B6C   dd      FFFFFFFF
    234. 00475B70   dd      00000001
    235. 00475B74   ascii   "L",0
    236. 00475B76   db      00
    237. 00475B77   db      00
    238. 00475B78   dd      FFFFFFFF
    239. 00475B7C   dd      00000001
    240. 00475B80   ascii   "0",0
    241. 00475B82   db      00
    242. 00475B83   db      00
    243. 00475B84   dd      FFFFFFFF
    244. 00475B88   dd      00000001
    245. 00475B8C   ascii   "B",0
    246. ==========================================
    247. 整理之后得到:
    248. 0123456789
    249. BIMJSZTXKL
    250. ==========================================
    251. }

    252. 00475D0B  |.  8B55 E8       |mov     edx, dword ptr [ebp-18]
    253. 00475D0E  |.  8D45 F8       |lea     eax, dword ptr [ebp-8]
    254. 00475D11  |.  E8 EEE9F8FF   |call    00404704
    255. 00475D16  |.  43            |inc     ebx
    256. 00475D17  |.  83FB 09       |cmp     ebx, 9
    257. 00475D1A  |.^ 75 D5         \jnz     short 00475CF1                 ;  循环完成的结果设为X3
    258. 00475D1C  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
    259. 00475D1F  |.  B9 03000000   mov     ecx, 3
    260. 00475D24  |.  8B45 F4       mov     eax, dword ptr [ebp-C]          ;  参数A = ASCII_X1_1
    261. 00475D27  |.  E8 B0ECF8FF   call    004049DC                        ;  在X3第3位插入参数A 设为X4
    262. 00475D2C  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
    263. 00475D2F  |.  B9 07000000   mov     ecx, 7
    264. 00475D34      8B45 F0       mov     eax, dword ptr [ebp-10]         ;  参数B = ASCII_X1_N
    265. 00475D37  |.  E8 A0ECF8FF   call    004049DC                        ;  在X4第7位插入参数B 设为SN
    266. 00475D3C  |.  FF75 F8       push    dword ptr [ebp-8]               ;  这里出来之后就是10位注册码了~
    267. 00475D3F  |.  B8 E8030000   mov     eax, 3E8
    268. 00475D44  |.  E8 23D2F8FF   call    00402F6C                        ;  下面几个CALL计算和连接**字符串,因为考虑 ASCII_X1_1 和 ASCII_X1_N 为空的情况~~ 导致

    269. 注册码为8位~~
    270. 00475D49  |.  8D55 E0       lea     edx, dword ptr [ebp-20]         ;  我仔细分析了下,不会出现为空的情况,所以下面的连接部分忽略不计~
    271. 00475D4C  |.  E8 632CF9FF   call    004089B4
    272. 00475D51  |.  FF75 E0       push    dword ptr [ebp-20]
    273. 00475D54  |.  68 185E4700   push    00475E18                        ;  ASCII "**"
    274. 00475D59  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
    275. 00475D5C  |.  BA 03000000   mov     edx, 3
    276. 00475D61  |.  E8 56EAF8FF   call    004047BC
    277. 00475D66  |.  8BC6          mov     eax, esi
    278. 00475D68  |.  8B55 F8       mov     edx, dword ptr [ebp-8]
    279. 00475D6B  |.  E8 28E7F8FF   call    00404498
    280. 00475D70  |.  33C0          xor     eax, eax
    281. 00475D72  |.  5A            pop     edx
    282. 00475D73  |.  59            pop     ecx
    283. 00475D74  |.  59            pop     ecx
    284. 00475D75  |.  64:8910       mov     dword ptr fs:[eax], edx
    285. 00475D78  |.  68 925D4700   push    00475D92
    286. 00475D7D  |>  8D45 E0       lea     eax, dword ptr [ebp-20]
    287. 00475D80  |.  BA 08000000   mov     edx, 8
    288. 00475D85  |.  E8 DEE6F8FF   call    00404468
    289. 00475D8A  \.  C3            retn
    290. 00475D8B   .^ E9 58E0F8FF   jmp     00403DE8
    291. 00475D90   .^ EB EB         jmp     short 00475D7D
    292. 00475D92   .  5E            pop     esi
    293. 00475D93   .  5B            pop     ebx
    294. 00475D94   .  8BE5          mov     esp, ebp
    295. 00475D96   .  5D            pop     ebp
    296. 00475D97   .  C3            retn
    复制代码
    【算法总结】
    1.eax = 16进制(机器码) / 0x1F
    2.eax = eax + 0x0E75
    3.eax = eax / 3
    4.eax = eax + 0x65
    5.X1 = 10进制(eax)
    6.ASCII_X1_1 = X1[1]
    7.ASCII_X1_N = X1[N]
    8.Len(X1)=8位则用原来的数据 Len(X1)<8 则补充长度为8位~
      分别为:
    ====================
    7位: + "2"
    6位: + "25"
    5位: + "232"
    4位: + "4675"
    3位: + "83855"
    2位: + "334342"
    1位: + "3447584"
    0位: + "47568328"
    ====================

    补充之后的数据为X2
    9.对X2逐位查表:
    0123456789
    BIMJSZTXKL
    10.在X3第3位插入参数ASCII_X1_1(字符)
    11.在X4第7位插入参数ASCII_X1_N((字符)
    12.截取步骤11的前10位即为注册码

    【注册函数】
    ;字符串操作宏
    T MACRO text
            local @lbl
            .const
                    @lbl db text,0
            .code
            exitm   <offset @lbl>
    ENDM

    .data
    ;密码表
    szConstTable                db                'BIMJSZTXKL',0
    szFormatOct                        db                '%d',0

    .code

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;函数功能:将字符串转换成数值
    ;Code By PiaoYun/P.Y.G
    ;http://blog.piaoyunsoft.com
    ;说明:仅做转换用,没有判断传入字符串的合法性~~  如 "1111" --> 1111
    ;
    ;函数参数:
    ;  lpszStr:指针,传入字符串的地址
    ;返回值:16进制数值
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    _ProcStrToDword proc lpszStr:dword
            mov         esi,lpszStr
            xor  eax, eax
            xor  ebx, ebx
            
    @@:
            mov  bl, byte ptr [esi]
            test bl, bl
            je         @F
            sub  bl, 30h
            lea  eax, dword ptr [eax+eax*4]
            add  eax, eax
            add  eax, ebx
            inc  esi
            jmp         @B
    @@:
            ret
    _ProcStrToDword endp


    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;函数功能:在字符串中指定位置插入字符
    ;Code By PiaoYun/P.Y.G
    ;http://blog.piaoyunsoft.com
    ;函数参数:
    ;  lpszStr:指针,待插入字符的字符串地址
    ;  lpChar: 指针,要插入的字符地址
    ;  wPos:  插入的位置
    ;返回值:没有
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    _InsertChar  proc  lpszStr:DWORD,lpChar:DWORD,wPos:DWORD
      local  @szInStr[32]:BYTE
      mov  edi,lpszStr
      mov  esi,lpChar
      mov  edx,wPos
      dec  edx
      mov  ecx,edx
      add  edx,edi
      add  edi,ecx
      invoke  lstrcpy, addr @szInStr,edx
      mov  bl,BYTE ptr [esi]
      mov  BYTE ptr [edi],bl
      mov  BYTE ptr [edi+1],0
      invoke  lstrcat,edi,addr @szInStr
      ret
    _InsertChar  endp

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;函数功能:注册算法总户数
    ;Code By PiaoYun/P.Y.G
    ;http://blog.piaoyunsoft.com
    ;函数参数:
    ;  lpID:        指针,传入机器码地址
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    KeyGen        proc        uses ecx edx lpID:DWORD

            LOCAL        @szKey[256]:byte
            
            invoke        RtlZeroMemory,addr @szKey,sizeof @szKey        

            xor                ecx,ecx
            xor                edx,edx
            
            ;机器码转换成数值
            invoke        _ProcStrToDword,lpID
            
            mov     ecx, 1Fh
            cdq
            idiv    ecx
            add     eax, 0E75h
            mov     ecx, 3h
            cdq
            idiv    ecx
            add     eax, 65h

            ;上面累加结果转成字符串
            invoke wsprintf,addr @szKey,addr szFormatOct,eax
            ;获取字符串长度
            invoke lstrlen,addr @szKey
            
            ;第一位字符
            mov                dl,byte ptr [@szKey]
            mov                [@szKey+100],dl
            
            ;最后一位字符
            mov                dl,byte ptr [@szKey + eax -1]
            mov                [@szKey+101],dl
            
            .if eax <= 8
                    .if        eax == 6
                            invoke        lstrcat,addr @szKey,T("2")        
                            .elseif        eax == 6
                                    invoke        lstrcat,addr @szKey,T("25")        
                            .elseif        eax == 5
                                    invoke        lstrcat,addr @szKey,T("232")        
                            .elseif        eax == 4
                                    invoke        lstrcat,addr @szKey,T("4675")        
                            .elseif        eax == 3
                                    invoke        lstrcat,addr @szKey,T("83855")        
                            .elseif        eax == 2
                                    invoke        lstrcat,addr @szKey,T("334342")        
                            .elseif        eax == 1
                                    invoke        lstrcat,addr @szKey,T("3447584")        
                            .elseif        eax == 0
                                    invoke        lstrcat,addr @szKey,T("47568328")        
                    .endif
            ;如果大于8位,则截断后面的
            .elseif        
                    mov        byte ptr[@szKey + 8],0
            .endif
            
            
                    xor                ebx,ebx
            @@:
                    movzx   edx,byte ptr [@szKey+ebx]
                    sub          edx,30h
                    movzx        edx,byte ptr [szConstTable+edx]
                    mov                byte ptr[@szKey + ebx],dl
                    inc                ebx
                    cmp                ebx,8
                    jnz                @B
                   
            invoke  _InsertChar,addr @szKey,addr [@szKey+100],3
            invoke  _InsertChar,addr @szKey,addr [@szKey+101],7
            

            ;取前十位作为注册码(这句可省略)
            ;mov        byte ptr[@szKey + 10],0
            
            ;插入分隔符
            invoke  _InsertChar,addr @szKey,T("-"),6
            
            lea                eax,@szKey
            ret

    KeyGen endp
    【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢!
    111.gif

    KeyGen.rar

    2.51 KB, 下载次数: 3, 下载积分: 飘云币 -2 枚

    评分

    参与人数 1威望 +40 飘云币 +40 收起 理由
    月之精灵 + 40 + 40 您的贴子很精彩,希望能再次分享!

    查看全部评分

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

    [LV.2]偶尔看看I

    发表于 2010-5-1 22:04:44 | 显示全部楼层
    第一个来学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-2 00:04:31 | 显示全部楼层
    刚用了LZ的PYG.dll
    Thanks
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2010-5-2 10:14:40 | 显示全部楼层
    前来学习!
    膜拜下!
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-10-9 11:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-5-2 22:05:12 | 显示全部楼层
    学习了,谢谢飘云老大
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-11 08:48:22 | 显示全部楼层
    学习了,谢谢!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-19 20:01:43 | 显示全部楼层
    多谢分享。发现PYG用FireFox登录的时候回复总是有验证码,并且怎么输入都不对。郁闷
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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