【文章标题】: 一款在线注册程序注册过程的简略分析
【文章作者】: looyoo
【软件名称】: AVIGIF v2.1
【软件大小】: 1.39 Mb
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 在线注册/注册文件/功能限制
【编写语言】: Borland Delphi 6.0-7.0
【使用工具】: PEiD0.94,Filemon7.02,Ollydbg1.10
【操作平台】: winXP sp2
【软件介绍】: 视频转换
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------

  百岁(篇)华诞还遥遥 N 期,但又好生羡慕,于是也找个由头来写上一篇,并美其名曰“三十而立”。所谓“立”者,“立字存照”也,而“三十”只不过是对脚下里程碑的一次“累加”,仅此而已。请弟兄们不要高看,更不要较真,如果有兴趣,不妨也来幽它一默,为“二进制”添加一点人文色彩,权当“个性化灌水”好吗?^_^
  
  闲话就此打住。这次拿来“灌水”的是一款视频转换工具,界面清爽,简洁方便,但要求在线注册,注册后会在同目录下生成一个注册文件。换句话说,有这个文件就是已注册的了。因此,我们的目的就是设法创建这个文件,完成注册。
--------------------------------------------------------------------------------
【详细过程】
  
  开启目标程序,弹出注册催单,点击“TryMore”,进入主界面,查看“Help/About”,有“Unregistered version”字样,有显示用户名与特许码的槽口,但不能写入,也没有“确认”按钮,只有“BoyNow”,这玩意可是要支付“米米”的,动不得!
  我们怎么判断它是用文件注册呢?因为程序界面无法输入特许码,但有完整功能,这些特征让我们怀疑是文件注册的。不妨用“Filemon”来验证一下。打开 Filemon,过滤所有进程,然后打开目标程序 AVIGIF,在 Filemon 窗口查看目标程序的调用情况。我们发现,一个与目标程序同路径、名为“avigif.inc”的文件被密集调用,而这个文件事实上还不存在,它与“注册”是什么关系?转入 Ollydbg,加载目标程序,搜索字符串 avigif.inc,找到五处,并均在它的下方发现“reginfo”“userinfo”和“licence”等字样,显然这个文件与注册密切相关。分别在它们上方的 Call 处设置断点,然后在目标文件同目录下创建一个 avigif.inc 文件,里面敲入一串我们容易识别的字符(如:2006-05-05),F9 运行。程序在 004F98F6 处被断下,F8 跟进,浏览一遍,没有收获,既未看到那一串字符被调用,也未看到其他类似特许码之类的东西。如果不怀疑这个文件名的话,那么它的内容就是唯一值得怀疑的。我们发现,在五处调用文件“avigif.inc”的地方,都格式一致地出现了一组字符:"userinfo/reginfo"、"licence/reginfo"、"others",它们与文件内容有关吗?极有可能。试着按顺序将三组字符整理,并写入我们赋予的试注册信息:

[reginfo]
userinfo=abcdef
licence=2006-05-05
others=xxxxxx

保存到文件“avigif.inc”中。重启目标程序,仍然是 F8 一路浏览。这一次我们发现文件内容被目标程序调用了,看来找到了一点名堂,创建注册文件有希望了。有了一个初步印象以后,接下来我们要再次重启目标程序,精耕细作一番。请看代码解析(只列举主干过程,其余只插入关键代码,以压缩篇幅):
=============================================================

004F98F6  |.  E8 75F6F0FF   CALL AVIGIF2_.00408F70          ;  断点
004F98FB  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
004F98FE  |.  B8 3CE04F00   MOV EAX,AVIGIF2_.004FE03C
004F9903  |.  B9 909A4F00   MOV ECX,AVIGIF2_.004F9A90       ;  ASCII "avigif.inc"
004F9908  |.  E8 D3ABF0FF   CALL AVIGIF2_.004044E0          ;  F7 跟进--确定文件是否存在
--------------------------------------------------
插入:edx,ecx 为空,空则文件不存在
0040449C   $  85D2          TEST EDX,EDX                             ;  edx 不能为 0
0040449E   .  74 3F         JE SHORT AVIGIF2_.004044DF               ;  跳则失败
004044A0   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
004044A2   .  85C9          TEST ECX,ECX                             ;  ecx 不能为 0
004044A4   .^ 0F84 7EFDFFFF JE AVIGIF2_.00404228                     ;  跳则失败
--------------------------------------------------
004F990D  |.  8B0D 3CE04F00 MOV ECX,DWORD PTR DS:[4FE03C]   ;  注意ecx变化//返回值
004F9913  |.  B2 01         MOV DL,1
004F9915  |.  A1 C48E4300   MOV EAX,DWORD PTR DS:[438EC4]
004F991A  |.  E8 55F6F3FF   CALL AVIGIF2_.00438F74
004F991F  |.  8BD8          MOV EBX,EAX
004F9921  |.  6A 00         PUSH 0
004F9923  |.  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
004F9926  |.  50            PUSH EAX
004F9927  |.  B9 A49A4F00   MOV ECX,AVIGIF2_.004F9AA4       ;  ASCII "userinfo"
004F992C  |.  BA B89A4F00   MOV EDX,AVIGIF2_.004F9AB8       ;  ASCII "reginfo"
004F9931  |.  8BC3          MOV EAX,EBX
004F9933  |.  8B30          MOV ESI,DWORD PTR DS:[EAX]
004F9935  |.  FF16          CALL DWORD PTR DS:[ESI]         ;  F7 跟进//读取用户名并确定其长度
-------------------------------------------------
插入:用户名及其长度
004398E0      E8 8BCDFCFF   CALL <JMP.&kernel32.GetPrivateP>;  用户名/测试码长度
004398E5      8BC8          MOV ECX,EAX
004398E7      8D95 00F8FFFF LEA EDX,DWORD PTR SS:[EBP-800]  ;  用户名/测试码
-------------------------------------------------
004F9937  |.  8B55 E4       MOV EDX,DWORD PTR SS:[EBP-1C]   ;  用户名
004F993A  |.  B8 40E04F00   MOV EAX,AVIGIF2_.004FE040
004F993F  |.  E8 E4A8F0FF   CALL AVIGIF2_.00404228          ;  F7 跟进//无用户名则在 0040422a 跳转
-------------------------------------------------
插入:用户名不能为空,但不限长度
00404228   $  85D2          TEST EDX,EDX                    ;  用户名,不能为空
0040422A   .  74 24         JE SHORT AVIGIF2_.00404250      ;  无用户名则跳向失败
-------------------------------------------------
004F9944  |.  6A 00         PUSH 0
004F9946  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004F9949  |.  50            PUSH EAX
004F994A  |.  B9 C89A4F00   MOV ECX,AVIGIF2_.004F9AC8       ;  ASCII "licence"
004F994F  |.  BA B89A4F00   MOV EDX,AVIGIF2_.004F9AB8       ;  ASCII "reginfo"
004F9954  |.  8BC3          MOV EAX,EBX
004F9956  |.  8B30          MOV ESI,DWORD PTR DS:[EAX]
004F9958  |.  FF16          CALL DWORD PTR DS:[ESI]         ;  F7 跟进//读取测试码并确定其长

-------------------------------------------------
插入:测试码及其长度
004398E0      E8 8BCDFCFF   CALL <JMP.&kernel32.GetPrivateP>;  用户名/测试码长度
004398E5      8BC8          MOV ECX,EAX
004398E7      8D95 00F8FFFF LEA EDX,DWORD PTR SS:[EBP-800]  ;  用户名/测试码
-------------------------------------------------
004F995A  |.  8B55 E0       MOV EDX,DWORD PTR SS:[EBP-20]   ;  测试码
004F995D  |.  B8 44E04F00   MOV EAX,AVIGIF2_.004FE044
004F9962  |.  E8 C1A8F0FF   CALL AVIGIF2_.00404228
004F9967  |.  8BC3          MOV EAX,EBX
004F9969  |.  E8 329AF0FF   CALL AVIGIF2_.004033A0
004F996E  |.  A1 10C94F00   MOV EAX,DWORD PTR DS:[4FC910]
004F9973  |.  BA D89A4F00   MOV EDX,AVIGIF2_.004F9AD8       ;  ASCII "others"
004F9978  |.  E8 ABA8F0FF   CALL AVIGIF2_.00404228
004F997D  |.  833D 40E04F00>CMP DWORD PTR DS:[4FE040],0     ;  注意标志位 ZF 变化
004F9984  |.  74 51         JE SHORT AVIGIF2_.004F99D7      ;  不能跳//ZF=1 时跳转
004F9986  |.  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
004F9989  |.  8B15 40E04F00 MOV EDX,DWORD PTR DS:[4FE040]   ;  用户名
004F998F  |.  B8 0BCE3101   MOV EAX,131CE0B                 ;  131ce0b 一个重要参数
004F9994  |.  E8 07F9FFFF   CALL AVIGIF2_.004F92A0          ;  F7 跟进,主干过程,计算真码...见附一 
004F9999  |.  8B55 DC       MOV EDX,DWORD PTR SS:[EBP-24]   ;  传送真码
004F999C  |.  A1 44E04F00   MOV EAX,DWORD PTR DS:[4FE044]   ;  测试码
004F99A1  |.  E8 3AACF0FF   CALL AVIGIF2_.004045E0          ;  F7 跟进//真假比较...见附二 
004F99A6  |.  75 2F         JNZ SHORT AVIGIF2_.004F99D7     ;  不正确就跳向"others"
004F99A8  |.  A1 10C94F00   MOV EAX,DWORD PTR DS:[4FC910]
004F99AD  |.  BA E89A4F00   MOV EDX,AVIGIF2_.004F9AE8       ;  ASCII "Yangmei"
004F99B2  |.  E8 71A8F0FF   CALL AVIGIF2_.00404228
004F99B7  |.  A1 2CC84F00   MOV EAX,DWORD PTR DS:[4FC82C]
004F99BC  |.  8B15 40E04F00 MOV EDX,DWORD PTR DS:[4FE040]
004F99C2  |.  E8 61A8F0FF   CALL AVIGIF2_.00404228
004F99C7  |.  A1 68C84F00   MOV EAX,DWORD PTR DS:[4FC868]
004F99CC  |.  8B15 44E04F00 MOV EDX,DWORD PTR DS:[4FE044]
004F99D2  |.  E8 51A8F0FF   CALL AVIGIF2_.00404228
004F99D7  |>  A1 10C94F00   MOV EAX,DWORD PTR DS:[4FC910]
004F99DC  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
004F99DE  |.  BA D89A4F00   MOV EDX,AVIGIF2_.004F9AD8       ;  ASCII "others"
004F99E3  |.  E8 F8ABF0FF   CALL AVIGIF2_.004045E0          ;  F7 跟进
004F99E8  |.  75 31         JNZ SHORT AVIGIF2_.004F9A1B     ;  不跳就注册失败
004F99EA  |.  33C9          XOR ECX,ECX
004F99EC  |.  B2 01         MOV DL,1
004F99EE  |.  A1 84464F00   MOV EAX,DWORD PTR DS:[4F4684]
004F99F3  |.  E8 1C2CF8FF   CALL AVIGIF2_.0047C614
=============================================================
附一 接 4f9994,计算真码...

004F92A0  /$  55            PUSH EBP                                 ;  以下是一系列赋值
004F92A1  |.  8BEC          MOV EBP,ESP
004F92A3  |.  83C4 E8       ADD ESP,-18
004F92A6  |.  53            PUSH EBX
004F92A7  |.  56            PUSH ESI
004F92A8  |.  57            PUSH EDI
004F92A9  |.  33DB          XOR EBX,EBX
004F92AB  |.  895D E8       MOV DWORD PTR SS:[EBP-18],EBX
004F92AE  |.  895D EC       MOV DWORD PTR SS:[EBP-14],EBX
004F92B1  |.  895D F0       MOV DWORD PTR SS:[EBP-10],EBX
004F92B4  |.  894D F4       MOV DWORD PTR SS:[EBP-C],ECX             ;  记住这个值
004F92B7  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX             ;  记住这个值
004F92BA  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  记住这个值
004F92BD  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004F92C0  |.  E8 BFB3F0FF   CALL AVIGIF2_.00404684
004F92C5  |.  33C0          XOR EAX,EAX
004F92C7  |.  55            PUSH EBP
004F92C8  |.  68 41944F00   PUSH AVIGIF2_.004F9441
004F92CD  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
004F92D0  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004F92D3  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
004F92D6  |.  E8 F9AEF0FF   CALL AVIGIF2_.004041D4
004F92DB  |.  33F6          XOR ESI,ESI                              ;  清 0
004F92DD  |.  837D FC 00    CMP DWORD PTR SS:[EBP-4],0               ;  131ce0b,给定常数
004F92E1  |.  0F84 2C010000 JE AVIGIF2_.004F9413
004F92E7  |.  837D F8 00    CMP DWORD PTR SS:[EBP-8],0               ;  用户名长度不能为 0
004F92EB  |.  0F84 22010000 JE AVIGIF2_.004F9413                     ;  为 0 则跳
004F92F1  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  用户名 abcdef
004F92F4  |.  E8 9BB1F0FF   CALL AVIGIF2_.00404494
004F92F9  |.  8BD8          MOV EBX,EAX
004F92FB  |.  85DB          TEST EBX,EBX                             ;  用户名全长
004F92FD  |.  7E 26         JLE SHORT AVIGIF2_.004F9325              ;  小于等于/不大于则跳转
004F92FF  |.  BF 01000000   MOV EDI,1                                ;  计算真码第一段(共分三段)
004F9304  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]            ;  [ebp-8]=ee3128
004F9307  |.  E8 88B1F0FF   |CALL AVIGIF2_.00404494                  ;  eax 用户名长度
004F930C  |.  F76D FC       |IMUL DWORD PTR SS:[EBP-4]               ;  用户名长度×131ce0b
004F930F  |.  03F0          |ADD ESI,EAX                             ;  相加,和存入 esi
004F9311  |.  8B45 F8       |MOV EAX,DWORD PTR SS:[EBP-8]            ;  用户名传入 eax
004F9314  |.  0FB64438 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EDI-1]       ;  依次取用户名每个字符的 ASCII 值
004F9319  |.  69C0 8A0C0000 |IMUL EAX,EAX,0C8A                       ;  所取用户名字符的 ASCII 值
×c8a
004F931F  |.  03F0          |ADD ESI,EAX                             ;  运算结果累加到 esi
004F9321  |.  47            |INC EDI                                 ;  加 1/初始值为 1
004F9322  |.  4B            |DEC EBX                                 ;  减 1/计数器,初始值为特许码长度
004F9323  |.^ 75 DF         \JNZ SHORT AVIGIF2_.004F9304             ;  非 0 则跳向下一轮运算
004F9325  |>  8BC6          MOV EAX,ESI                              ;  累加值传入 eax
004F9327  |.  99            CDQ                                      ;  字节扩展
004F9328  |.  33C2          XOR EAX,EDX                              ;  异或
004F932A  |.  2BC2          SUB EAX,EDX                              ;  结果作为 004F932F 计算特许码的初始值
004F932C  |.  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
004F932F  |.  E8 2CF5F0FF   CALL AVIGIF2_.00408860                   ;  F7 跟进,计算真码第一段/倒序...附一㈠
004F9334  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
004F9337  |.  50            PUSH EAX
004F9338  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]            
004F933B  |.  E8 54B1F0FF   CALL AVIGIF2_.00404494
004F9340  |.  8BD0          MOV EDX,EAX
004F9342  |.  83EA 0A       SUB EDX,0A
004F9345  |.  B9 0A000000   MOV ECX,0A
004F934A  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
004F934D  |.  E8 A2B3F0FF   CALL AVIGIF2_.004046F4
004F9352  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004F9355  |.  E8 3AB1F0FF   CALL AVIGIF2_.00404494
004F935A  |.  8BD8          MOV EBX,EAX
004F935C  |.  85DB          TEST EBX,EBX
004F935E  |.  7E 27         JLE SHORT AVIGIF2_.004F9387
004F9360  |.  BF 01000000   MOV EDI,1
004F9365  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]            ;  计算真码第二段(从上例推)
004F9368  |.  E8 27B1F0FF   |CALL AVIGIF2_.00404494
004F936D  |.  8B55 F8       |MOV EDX,DWORD PTR SS:[EBP-8]
004F9370  |.  0FB6543A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EDI-1]
004F9375  |.  0FAF55 FC     |IMUL EDX,DWORD PTR SS:[EBP-4]
004F9379  |.  69D2 440C0000 |IMUL EDX,EDX,0C44
004F937F  |.  03F2          |ADD ESI,EDX
004F9381  |.  2BF0          |SUB ESI,EAX
004F9383  |.  47            |INC EDI
004F9384  |.  4B            |DEC EBX
004F9385  |.^ 75 DE         \JNZ SHORT AVIGIF2_.004F9365
004F9387  |>  FF75 F0       PUSH DWORD PTR SS:[EBP-10]
004F938A  |.  68 58944F00   PUSH AVIGIF2_.004F9458
004F938F  |.  8BC6          MOV EAX,ESI
004F9391  |.  99            CDQ
004F9392  |.  33C2          XOR EAX,EDX
004F9394  |.  2BC2          SUB EAX,EDX                              ;  结果作为下一步计算特许码的初始值
004F9396  |.  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
004F9399  |.  E8 C2F4F0FF   CALL AVIGIF2_.00408860                   
004F939E  |.  FF75 EC       PUSH DWORD PTR SS:[EBP-14]
004F93A1  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
004F93A4  |.  BA 03000000   MOV EDX,3
004F93A9  |.  E8 A6B1F0FF   CALL AVIGIF2_.00404554                   ;  第一、二段连接
-------------------------------------------------------------
插入:实现连接的关键位置
........................................
004029A2  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>;  生成连接符号“-”
........................................
004045C1   .  5A            POP EDX                                  ;  完成第一、二段连接
........................................
-------------------------------------------------------------
004F93AE  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004F93B1  |.  E8 DEB0F0FF   CALL AVIGIF2_.00404494
004F93B6  |.  8BD8          MOV EBX,EAX
004F93B8  |.  85DB          TEST EBX,EBX
004F93BA  |.  7E 2D         JLE SHORT AVIGIF2_.004F93E9
004F93BC  |.  BF 01000000   MOV EDI,1
004F93C1  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]            ;  计算真码第三段(从上例推)
004F93C4  |.  E8 CBB0F0FF   |CALL AVIGIF2_.00404494
004F93C9  |.  8B55 F8       |MOV EDX,DWORD PTR SS:[EBP-8]
004F93CC  |.  0FB6543A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EDI-1]
004F93D1  |.  F7EA          |IMUL EDX                                
004F93D3  |.  69C0 22100000 |IMUL EAX,EAX,1022                       
004F93D9  |.  03F0          |ADD ESI,EAX
004F93DB  |.  8B45 F8       |MOV EAX,DWORD PTR SS:[EBP-8]
004F93DE  |.  E8 B1B0F0FF   |CALL AVIGIF2_.00404494
004F93E3  |.  03F0          |ADD ESI,EAX
004F93E5  |.  47            |INC EDI
004F93E6  |.  4B            |DEC EBX
004F93E7  |.^ 75 D8         \JNZ SHORT AVIGIF2_.004F93C1
004F93E9  |>  0375 FC       ADD ESI,DWORD PTR SS:[EBP-4]
004F93EC  |.  FF75 F0       PUSH DWORD PTR SS:[EBP-10]
004F93EF  |.  68 58944F00   PUSH AVIGIF2_.004F9458
004F93F4  |.  8BC6          MOV EAX,ESI
004F93F6  |.  99            CDQ
004F93F7  |.  33C2          XOR EAX,EDX
004F93F9  |.  2BC2          SUB EAX,EDX                              ;  结果作为下一步计算特许码初始值
004F93FB  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
004F93FE  |.  E8 5DF4F0FF   CALL AVIGIF2_.00408860                   ;  F7 跟进,计算本段特许码的最终值!
004F9403  |.  FF75 E8       PUSH DWORD PTR SS:[EBP-18]
004F9406  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
004F9409  |.  BA 03000000   MOV EDX,3
004F940E  |.  E8 41B1F0FF   CALL AVIGIF2_.00404554                   ;  三段特许码连接
-------------------------------------------------------------
插入:实现连接的关键位置
........................................
004029A2  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>;  生成连接符号“-”
........................................
004045C1   .  5A            POP EDX                                  ;  完成第一、二、三段连接
........................................
-------------------------------------------------------------
004F9413  |>  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
004F9416  |.  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]            ;  完整特许码送入edx并显示
004F9419  |.  E8 0AAEF0FF   CALL AVIGIF2_.00404228                   ;  可制作内存注册机
004F941E  |.  33C0          XOR EAX,EAX
004F9420  |.  5A            POP EDX
004F9421  |.  59            POP ECX
004F9422  |.  59            POP ECX
004F9423  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
004F9426  |.  68 48944F00   PUSH AVIGIF2_.004F9448
004F942B  |>  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
004F942E  |.  BA 03000000   MOV EDX,3
004F9433  |.  E8 C0ADF0FF   CALL AVIGIF2_.004041F8
004F9438  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
004F943B  |.  E8 94ADF0FF   CALL AVIGIF2_.004041D4
004F9440  \.  C3            RETN
004F9441   .^ E9 EEA6F0FF   JMP AVIGIF2_.00403B34
004F9446   .^ EB E3         JMP SHORT AVIGIF2_.004F942B
004F9448   .  5F            POP EDI
004F9449   .  5E            POP ESI
004F944A   .  5B            POP EBX
004F944B   .  8BE5          MOV ESP,EBP
004F944D   .  5D            POP EBP
004F944E   .  C3            RETN                                     ;  返回 004f9999
-----------------------------------------------
附一㈠ 接 004F932F 计算真码第一段

00408860  /$  56            PUSH ESI                                 ;  来自 00408860
00408861  |.  89E6          MOV ESI,ESP
00408863  |.  83EC 10       SUB ESP,10
00408866  |.  31C9          XOR ECX,ECX
00408868  |.  52            PUSH EDX
00408869  |.  31D2          XOR EDX,EDX
0040886B  |.  E8 A4FFFFFF   CALL AVIGIF2_.00408814                   ;  F7 跟进,计算真码...见附一㈠⑴
00408870  |.  89F2          MOV EDX,ESI
00408872  |.  58            POP EAX
00408873  |.  E8 4CBAFFFF   CALL AVIGIF2_.004042C4                   ;  F7 跟进,特许码倒序...见附一㈠⑴①
00408878  |.  83C4 10       ADD ESP,10
0040887B  |.  5E            POP ESI
0040887C  \.  C3            RETN                                     ;  返回 004f939e
------------------------------------------------
附一㈠⑴ 接 0040886B 计算真码

00408814  /$  08C9          OR CL,CL                                 ;  来自 40886b
00408816  |.  75 17         JNZ SHORT AVIGIF2_.0040882F
00408818  |.  09C0          OR EAX,EAX
0040881A  |.  79 0E         JNS SHORT AVIGIF2_.0040882A              ;  跳转
0040881C  |.  F7D8          NEG EAX
0040881E  |.  E8 07000000   CALL AVIGIF2_.0040882A
00408823  |.  B0 2D         MOV AL,2D
00408825  |.  41            INC ECX
00408826  |.  4E            DEC ESI
00408827  |.  8806          MOV BYTE PTR DS:[ESI],AL
00408829  |.  C3            RETN
0040882A  |$  B9 0A000000   MOV ECX,0A                               ;  来自 40881a,a为常数,下面用作除数
0040882F  |>  52            PUSH EDX
00408830  |.  56            PUSH ESI                                 ;  以下开始计算
00408831  |>  31D2          /XOR EDX,EDX                             ;  异或
00408833  |.  F7F1          |DIV ECX                                 ;  每次除以A直至商为0,被除数的初始值是 004F93F9 处的 eax 值,余数连接起来就是第一段特许码的倒序形式。余数为阿拉伯数字
00408835  |.  4E            |DEC ESI                                 ;  减 1
00408836  |.  80C2 30       |ADD DL,30                               ;  加 30,转换为 ASCII 码
00408839  |.  80FA 3A       |CMP DL,3A                               ;  比较
0040883C  |.  72 03         |JB SHORT AVIGIF2_.00408841              ;  低于/不高于等于则跳转
0040883E  |.  80C2 07       |ADD DL,7
00408841  |>  8816          |MOV BYTE PTR DS:[ESI],DL                ;  保存结果
00408843  |.  09C0          |OR EAX,EAX                              ;  或运算,判断是否为 0
00408845  |.^ 75 EA         \JNZ SHORT AVIGIF2_.00408831             ;  不为 0 则跳,作下一轮运算
00408847  |.  59            POP ECX
00408848  |.  5A            POP EDX
00408849  |.  29F1          SUB ECX,ESI                              ;  相减
0040884B  |.  29CA          SUB EDX,ECX                              ;  相减
0040884D  |.  76 10         JBE SHORT AVIGIF2_.0040885F              ;  跳转
0040884F  |.  01D1          ADD ECX,EDX
00408851  |.  B0 30         MOV AL,30
00408853  |.  29D6          SUB ESI,EDX
00408855  |.  EB 03         JMP SHORT AVIGIF2_.0040885A
00408857  |>  880432        /MOV BYTE PTR DS:[EDX+ESI],AL
0040885A  |>  4A             DEC EDX
0040885B  |.^ 75 FA         \JNZ SHORT AVIGIF2_.00408857
0040885D  |.  8806          MOV BYTE PTR DS:[ESI],AL
0040885F  \>  C3            RETN                                     ;  跳至 00408870
................................................
00408870  |.  89F2          MOV EDX,ESI
00408872  |.  58            POP EAX
00408873  |.  E8 4CBAFFFF   CALL AVIGIF2_.004042C4                   ;  F7 跟进,倒序后成为正确的特许码 附一㈠⑴① 
00408878  |.  83C4 10       ADD ESP,10
0040887B  |.  5E            POP ESI
0040887C  \.  C3            RETN                                     ;  返回 004f9334
------------------------------------------------
附一㈠⑴① 接 00408873  倒序后成为正确的特许码

004042C4  /$  53            PUSH EBX
004042C5  |.  56            PUSH ESI
004042C6  |.  57            PUSH EDI
004042C7  |.  89C3          MOV EBX,EAX
004042C9  |.  89D6          MOV ESI,EDX
004042CB  |.  89CF          MOV EDI,ECX
004042CD  |.  89F8          MOV EAX,EDI
004042CF  |.  E8 C4FFFFFF   CALL AVIGIF2_.00404298
004042D4  |.  89F9          MOV ECX,EDI
004042D6  |.  89C7          MOV EDI,EAX
004042D8  |.  85F6          TEST ESI,ESI
004042DA  |.  74 09         JE SHORT AVIGIF2_.004042E5
004042DC  |.  89C2          MOV EDX,EAX
004042DE  |.  89F0          MOV EAX,ESI
004042E0  |.  E8 83E6FFFF   CALL AVIGIF2_.00402968                   ;  特许码由倒序成顺序
004042E5  |>  89D8          MOV EAX,EBX
004042E7  |.  E8 E8FEFFFF   CALL AVIGIF2_.004041D4
004042EC  |.  893B          MOV DWORD PTR DS:[EBX],EDI
004042EE  |.  5F            POP EDI
004042EF  |.  5E            POP ESI
004042F0  |.  5B            POP EBX
004042F1  \.  C3            RETN                                     ;  返回 00408878
------------------------------------------------
附二 接 004F99A1 比较 

004045E0  /$  53            PUSH EBX
004045E1  |.  56            PUSH ESI
004045E2  |.  57            PUSH EDI
004045E3  |.  89C6          MOV ESI,EAX
004045E5  |.  89D7          MOV EDI,EDX
004045E7  |.  39D0          CMP EAX,EDX
004045E9  |.  0F84 8F000000 JE AVIGIF2_.0040467E                     ;  不能跳
004045EF  |.  85F6          TEST ESI,ESI
004045F1  |.  74 68         JE SHORT AVIGIF2_.0040465B               ;  不能跳
004045F3  |.  85FF          TEST EDI,EDI
004045F5  |.  74 6B         JE SHORT AVIGIF2_.00404662               ;  不能跳
004045F7  |.  8B46 FC       MOV EAX,DWORD PTR DS:[ESI-4]
004045FA  |.  8B57 FC       MOV EDX,DWORD PTR DS:[EDI-4]
004045FD  |.  29D0          SUB EAX,EDX
004045FF  |.  77 02         JA SHORT AVIGIF2_.00404603               ;  不能跳
00404601  |.  01C2          ADD EDX,EAX
00404603  |>  52            PUSH EDX
00404604  |.  C1EA 02       SHR EDX,2
00404607  |.  74 26         JE SHORT AVIGIF2_.0040462F               ;  不能跳
00404609  |>  8B0E          /MOV ECX,DWORD PTR DS:[ESI]              ;  分段循环比较
0040460B  |.  8B1F          |MOV EBX,DWORD PTR DS:[EDI]
0040460D  |.  39D9          |CMP ECX,EBX
0040460F      75 58         |JNZ SHORT AVIGIF2_.00404669              ;  不能跳
00404611  |.  4A            |DEC EDX
00404612      74 15         |JE SHORT AVIGIF2_.00404629               ;  正确则从这里跳出
00404614  |.  8B4E 04       |MOV ECX,DWORD PTR DS:[ESI+4]
00404617  |.  8B5F 04       |MOV EBX,DWORD PTR DS:[EDI+4]
0040461A  |.  39D9          |CMP ECX,EBX
0040461C      75 4B         |JNZ SHORT AVIGIF2_.00404669              ;  不能跳
0040461E  |.  83C6 08       |ADD ESI,8
00404621  |.  83C7 08       |ADD EDI,8
00404624  |.  4A            |DEC EDX
00404625  |.^ 75 E2         \JNZ SHORT AVIGIF2_.00404609
00404627  |.  EB 06         JMP SHORT AVIGIF2_.0040462F
00404629  |>  83C6 04       ADD ESI,4
0040462C  |.  83C7 04       ADD EDI,4
0040462F  |>  5A            POP EDX
00404630  |.  83E2 03       AND EDX,3
00404633  |.  74 22         JE SHORT AVIGIF2_.00404657               ;  不能跳
00404635  |.  8B0E          MOV ECX,DWORD PTR DS:[ESI]
00404637  |.  8B1F          MOV EBX,DWORD PTR DS:[EDI]
00404639  |.  38D9          CMP CL,BL
0040463B  |.  75 41         JNZ SHORT AVIGIF2_.0040467E              ;  不能跳
0040463D  |.  4A            DEC EDX
0040463E  |.  74 17         JE SHORT AVIGIF2_.00404657               ;  不能跳
00404640  |.  38FD          CMP CH,BH
00404642  |.  75 3A         JNZ SHORT AVIGIF2_.0040467E              ;  不能跳
00404644  |.  4A            DEC EDX
00404645  |.  74 10         JE SHORT AVIGIF2_.00404657               ;  不能跳
00404647  |.  81E3 0000FF00 AND EBX,0FF0000
0040464D  |.  81E1 0000FF00 AND ECX,0FF0000
00404653  |.  39D9          CMP ECX,EBX
00404655  |.  75 27         JNZ SHORT AVIGIF2_.0040467E              ;  不能跳
00404657  |>  01C0          ADD EAX,EAX
00404659  |.  EB 23         JMP SHORT AVIGIF2_.0040467E
0040465B  |>  8B57 FC       MOV EDX,DWORD PTR DS:[EDI-4]
0040465E  |.  29D0          SUB EAX,EDX
00404660  |.  EB 1C         JMP SHORT AVIGIF2_.0040467E
00404662  |>  8B46 FC       MOV EAX,DWORD PTR DS:[ESI-4]
00404665  |.  29D0          SUB EAX,EDX
00404667  |.  EB 15         JMP SHORT AVIGIF2_.0040467E
00404669  |>  5A            POP EDX
0040466A  |.  38D9          CMP CL,BL
0040466C  |.  75 10         JNZ SHORT AVIGIF2_.0040467E
0040466E  |.  38FD          CMP CH,BH
00404670  |.  75 0C         JNZ SHORT AVIGIF2_.0040467E
00404672  |.  C1E9 10       SHR ECX,10
00404675  |.  C1EB 10       SHR EBX,10
00404678  |.  38D9          CMP CL,BL
0040467A  |.  75 02         JNZ SHORT AVIGIF2_.0040467E
0040467C  |.  38FD          CMP CH,BH
0040467E  |>  5F            POP EDI                                  ;  ntdll.7C930738
0040467F  |.  5E            POP ESI
00404680  |.  5B            POP EBX
00404681  \.  C3            RETN                                     ;  返回 004F99A6
*****************************************************

总结:
有两个关键:一是判断注册文件的存在并确定该文件内部条目;二是算法。
注册文件方面如上述,不再重复。
特许码的算法:
分三段进行,算法大致相同,但参数不同:
第一段,参数为 c8a:
1.依次取用户名长度乘以 131ce0b,累加在 esi;
2.依次取用户名每个字符的 ASCII 值乘以参数 c8a,累加在 esi;
3.esi 传入 eax 与 edx 异或,再与 edx 相减,结果作为第4步计算特许码的初始值;
4.eax 的值层层除以 a,直至商为0,所得余数依次排列,该字符串就是特许码的倒序形式;
5.调整排列顺序(堆栈中原本为从后向前依次保存);
6.同理算出第二、三段;
7.用“-”将三段相连接,得到最终的特许码。
另外,用户名长度不能为0,“others”可以忽略。
-------------------------------------------------
§给出一组特许码,仅供参考。
        用户名:abcdef
        特许码:723400542-1527772054-1562606977
-------------------------------------------------
                           ☆☆☆ 与菜鸟交流,请老鸟指教 ☆☆☆
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!