【文章标题】: 一款在线注册程序注册过程的简略分析
【文章作者】: 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
-------------------------------------------------
☆☆☆ 与菜鸟交流,请老鸟指教 ☆☆☆
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)