【文章标题】: 超级mp4视频转换大师1.10 破解手记
【文章作者】: 阿蔡
【软件名称】: 超级mp4视频转换大师1.10
【编写语言】: Borland Delphi 6.0 - 7.0 (PEID识别)
【使用工具】: od & ida & peid & WinHex
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------------------------------
【详细过程】
PEID查壳,如图:
没壳,正好适合我等菜鸟(本人还没学习脱壳),虽然是Borland Delphi写的,但本人还没用过DEDE,所以后面还是用OD + IDA 解决之.由于此软件是明文比较,所以可以直接在内存中找到正确的注册码,下面将将使用这种方法查找注册码,大侠跳过.
先运行软件,打开注册窗口,随便输入用户名和KEY进行注册,如图:
这里不要点确定,然后用WinHex打开本进程的内存,如图:
打开这后按CTRL + F进行搜索,搜索内容为刚才输入的假注册码,如图:
点搜索,在找到的位置附近看一下有没有像注册码(你自己觉得是就是吧^_^)的字符串,如果没有的话继续向下查找,直到找到如图的地方:
发现一串很像注册码的字符串(是我自己觉得,或许你觉得不是^_^): leno-9796mp488-4656,于是马上去验证一下用户名:pediy.注册码: leno-9796mp488-4656,重启软件没有再弹出提示注册的对话框了,主对话框上也没有那个未注册的提示了,注册成功(看来我的感觉还是蛮不错的,哈哈哈…
).
--------------------------------------------------------------------------------------------------------
至此,如果你意在免费使用本软件的话,目的已经达到了.但这并不是我的目的,我的目的是技术研究,所以下面继续用OD + IDA 分析之(IDA主要用来识别一些系统函数).
OD载入,用Ultra String Reference插件查找字符串,找到如图所示的敏感字符串:
双击”注册名不能为空,请重新输入”这行(因为注册成功与否的提示信息都是在注册码计算完成之后才显示的,这里我们是要分析算法,所以从获取用户名和KEY的地方开始分析),来到下面的地方:
004C0430 |. /75 29 JNZ SHORT MP4Conve.004C045B
004C0432 |. |6A 40 PUSH 40
004C0434 |. |68 CC044C00 PUSH MP4Conve.004C04CC ; 提示
004C0439 |. |68 D4044C00 PUSH MP4Conve.004C04D4 ; 注册名不能为空,请重新输入!
004C043E |. |8BC3 MOV EAX, EBX
004C0440 |. |E8 B3D1FAFF CALL MP4Conve.0046D5F8
004C0445 |. |50 PUSH EAX ; |hOwner
004C0446 |. |E8 4D73F4FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
在此段代码的开始处下断,然后开始分析,下面是我的分析,错误之处敬请指出.
004C0421 |. E8 D668FAFF CALL <MP4Conve.GetText> ; GetText,获取用户名
004C0426 |. 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
004C0429 |. E8 7E48F4FF CALL <MP4Conve.GetLen>
004C042E |. 85C0 TEST EAX, EAX ; 如果用户名为空则提示信息,注册失败
004C0430 |. 75 29 JNZ SHORT MP4Conve.004C045B
004C0432 |. 6A 40 PUSH 40
004C0434 |. 68 CC044C00 PUSH MP4Conve.004C04CC ; 提示
004C0439 |. 68 D4044C00 PUSH MP4Conve.004C04D4 ; 注册名不能为空,请重新输入!
004C043E |. 8BC3 MOV EAX, EBX
004C0440 |. E8 B3D1FAFF CALL MP4Conve.0046D5F8
004C0445 |. 50 PUSH EAX ; |hOwner
004C0446 |. E8 4D73F4FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
004C044B |. 8B83 00030000 MOV EAX, DWORD PTR DS:[EBX+300]
004C0451 |. 8B10 MOV EDX, DWORD PTR DS:[EAX]
004C0453 |. FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
004C0459 |. EB 4A JMP SHORT MP4Conve.004C04A5
004C045B |> 8D55 F8 LEA EDX, DWORD PTR SS:[EBP-8]
004C045E |. 8B83 04030000 MOV EAX, DWORD PTR DS:[EBX+304]
004C0464 |. E8 9368FAFF CALL <MP4Conve.GetText> ; GetText,获取KEY
004C0469 |. 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-8]
004C046C |. E8 3B48F4FF CALL <MP4Conve.GetLen>
004C0471 |. 85C0 TEST EAX, EAX
004C0473 |. 75 29 JNZ SHORT MP4Conve.004C049E ; 如果KEY为空则提示信息,注册失败
004C0475 |. 6A 40 PUSH 40
004C0477 |. 68 CC044C00 PUSH MP4Conve.004C04CC ; 提示
004C047C |. 68 F0044C00 PUSH MP4Conve.004C04F0 ; 注册码不能为空,请重新输入!
004C0481 |. 8BC3 MOV EAX, EBX
004C0483 |. E8 70D1FAFF CALL MP4Conve.0046D5F8
004C0488 |. 50 PUSH EAX ; |hOwner
004C0489 |. E8 0A73F4FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
004C048E |. 8B83 04030000 MOV EAX, DWORD PTR DS:[EBX+304]
004C0494 |. 8B10 MOV EDX, DWORD PTR DS:[EAX]
004C0496 |. FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
004C049C |. EB 07 JMP SHORT MP4Conve.004C04A5
004C049E |> 8BC3 MOV EAX, EBX
004C04A0 |. E8 E7FCFFFF CALL MP4Conve.004C018C ; 关键CALL,注册函数
004C04A5 |> 33C0 XOR EAX, EAX
004C04A7 |. 5A POP EDX
004C04A8 |. 59 POP ECX
004C04A9 |. 59 POP ECX
004C04AA |. 64:8910 MOV DWORD PTR FS:[EAX], EDX
004C04AD |. 68 C7044C00 PUSH MP4Conve.004C04C7
004C04B2 |> 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
004C04B5 |. BA 02000000 MOV EDX, 2
004C04BA |. E8 5145F4FF CALL <MP4Conve.LStrArrayClr> ; 销毁字符串数组
004C04BF \. C3 RETN
004C018C $ 55 PUSH EBP
004C018D . 8BEC MOV EBP, ESP
004C018F . 33C9 XOR ECX, ECX
004C0191 . 51 PUSH ECX
004C0192 . 51 PUSH ECX
004C0193 . 51 PUSH ECX
004C0194 . 51 PUSH ECX
004C0195 . 51 PUSH ECX
004C0196 . 53 PUSH EBX
004C0197 . 56 PUSH ESI
004C0198 . 57 PUSH EDI
004C0199 . 8945 FC MOV DWORD PTR SS:[EBP-4], EAX
004C019C . 33C0 XOR EAX, EAX
004C019E . 55 PUSH EBP
004C019F . 68 DD024C00 PUSH MP4Conve.004C02DD
004C01A4 . 64:FF30 PUSH DWORD PTR FS:[EAX]
004C01A7 . 64:8920 MOV DWORD PTR FS:[EAX], ESP
004C01AA . 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
004C01AD . E8 B2FEFFFF CALL MP4Conve.004C0064 ; 关键CALL,生成KEY,并验证
004C01B2 . 84C0 TEST AL, AL
004C01B4 . 0F84 DB000000 JE MP4Conve.004C0295 ; 这里跳则失败,提示注册失败
004C01BA . 33C0 XOR EAX, EAX
004C01BC . 55 PUSH EBP ; 下面代码将用户名和KEY保存到注册表
004C0064 /$ 55 PUSH EBP
004C0065 |. 8BEC MOV EBP, ESP
004C0067 |. B9 04000000 MOV ECX, 4
004C006C |> 6A 00 /PUSH 0
004C006E |. 6A 00 |PUSH 0
004C0070 |. 49 |DEC ECX
004C0071 |.^ 75 F9 \JNZ SHORT MP4Conve.004C006C
004C0073 |. 51 PUSH ECX
004C0074 |. 53 PUSH EBX
004C0075 |. 56 PUSH ESI
004C0076 |. 8BF0 MOV ESI, EAX
004C0078 |. 33C0 XOR EAX, EAX
004C007A |. 55 PUSH EBP
004C007B |. 68 7B014C00 PUSH MP4Conve.004C017B
004C0080 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004C0083 |. 64:8920 MOV DWORD PTR FS:[EAX], ESP
004C0086 |. 8D55 F8 LEA EDX, DWORD PTR SS:[EBP-8]
004C0089 |. 8B86 04030000 MOV EAX, DWORD PTR DS:[ESI+304]
004C008F |. E8 686CFAFF CALL <MP4Conve.GetText> ; GetText,获取KEY
004C0094 |. 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-8] ; 取KEY
004C0097 |. 8D55 FC LEA EDX, DWORD PTR SS:[EBP-4]
004C009A |. E8 ED9DF4FF CALL <MP4Conve.Trim> ; Trim,去除KEY两边的空格
004C009F |. 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4] ; 取去除两边空格后的KEY
004C00A2 |. 50 PUSH EAX
004C00A3 |. 8D55 EC LEA EDX, DWORD PTR SS:[EBP-14]
004C00A6 |. 8B86 00030000 MOV EAX, DWORD PTR DS:[ESI+300]
004C00AC |. E8 4B6CFAFF CALL <MP4Conve.GetText> ; GetText,获取用户名
004C00B1 |. 8B45 EC MOV EAX, DWORD PTR SS:[EBP-14] ; 取用户名
004C00B4 |. 8D55 F0 LEA EDX, DWORD PTR SS:[EBP-10]
004C00B7 |. E8 D09DF4FF CALL <MP4Conve.Trim> ; Trim,去除用户名两边的空格
004C00BC |. 8B55 F0 MOV EDX, DWORD PTR SS:[EBP-10] ; 取去除两边空格后的用户名
004C00BF |. 8D4D F4 LEA ECX, DWORD PTR SS:[EBP-C]
004C00C2 |. 8BC6 MOV EAX, ESI
004C00C4 |. E8 EBFCFFFF CALL MP4Conve.004BFDB4 ; 关键CALL,计算注册码
004C00C9 |. 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C] ; 取得生成的KEY
004C00CC |. 58 POP EAX ; 弹出用户输入的KEY
004C00CD |. E8 264DF4FF CALL MP4Conve.00404DF8 ; LStrCmp,结果比较
004C00D2 |. 75 52 JNZ SHORT MP4Conve.004C0126 ; 这里跳走则注册失败
004C00D4 |. B3 01 MOV BL, 1 ; (initial cpu selection)
004C00D6 |. 8D55 E4 LEA EDX, DWORD PTR SS:[EBP-1C]
004C00D9 |. 8B86 00030000 MOV EAX, DWORD PTR DS:[ESI+300]
004C00DF |. E8 186CFAFF CALL <MP4Conve.GetText> ; GetText,取用户名
004C00E4 |. 8B45 E4 MOV EAX, DWORD PTR SS:[EBP-1C]
004C00E7 |. 8D55 E8 LEA EDX, DWORD PTR SS:[EBP-18]
004C00EA |. E8 9D9DF4FF CALL <MP4Conve.Trim> ; Trim
004C00EF |. 8B55 E8 MOV EDX, DWORD PTR SS:[EBP-18]
004C00F2 |. 8D86 20030000 LEA EAX, DWORD PTR DS:[ESI+320]
004C00F8 |. E8 4349F4FF CALL <MP4Conve.LStrAsg> ; LStrAsg
004C00FD |. 8D55 DC LEA EDX, DWORD PTR SS:[EBP-24]
004C0100 |. 8B86 04030000 MOV EAX, DWORD PTR DS:[ESI+304]
004C0106 |. E8 F16BFAFF CALL <MP4Conve.GetText> ; GetText,取KEY
004C010B |. 8B45 DC MOV EAX, DWORD PTR SS:[EBP-24]
004C010E |. 8D55 E0 LEA EDX, DWORD PTR SS:[EBP-20]
004C0111 |. E8 769DF4FF CALL <MP4Conve.Trim>
004C0116 |. 8B55 E0 MOV EDX, DWORD PTR SS:[EBP-20]
004C0119 |. 8D86 24030000 LEA EAX, DWORD PTR DS:[ESI+324]
004C011F |. E8 1C49F4FF CALL <MP4Conve.LStrAsg>
004C0124 |. EB 02 JMP SHORT MP4Conve.004C0128
004C0126 |> 33DB XOR EBX, EBX ; 跳到此注册失败
004C0128 |> 33C0 XOR EAX, EAX ; 跳到此注册成功
004C012A |. 5A POP EDX
004C012B |. 59 POP ECX
004C012C |. 59 POP ECX
004C012D |. 64:8910 MOV DWORD PTR FS:[EAX], EDX
004C0130 |. 68 82014C00 PUSH MP4Conve.004C0182
004C0135 |> 8D45 DC LEA EAX, DWORD PTR SS:[EBP-24] ; 下面代码进行清理工作
004C0138 |. E8 AF48F4FF CALL <MP4Conve.LStrClr> ; LStrClr,销毁字符串
004C013D |. 8D45 E0 LEA EAX, DWORD PTR SS:[EBP-20]
004C0140 |. E8 A748F4FF CALL <MP4Conve.LStrClr>
004C0145 |. 8D45 E4 LEA EAX, DWORD PTR SS:[EBP-1C]
004C0148 |. E8 9F48F4FF CALL <MP4Conve.LStrClr>
004C014D |. 8D45 E8 LEA EAX, DWORD PTR SS:[EBP-18]
004C0150 |. E8 9748F4FF CALL <MP4Conve.LStrClr>
004C0155 |. 8D45 EC LEA EAX, DWORD PTR SS:[EBP-14]
004C0158 |. E8 8F48F4FF CALL <MP4Conve.LStrClr>
004C015D |. 8D45 F0 LEA EAX, DWORD PTR SS:[EBP-10]
004C0160 |. BA 02000000 MOV EDX, 2
004C0165 |. E8 A648F4FF CALL <MP4Conve.LStrArrayClr> ; LStrArrayClr
004C016A |. 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
004C016D |. E8 7A48F4FF CALL <MP4Conve.LStrClr>
004C0172 |. 8D45 FC LEA EAX, DWORD PTR SS:[EBP-4]
004C0175 |. E8 7248F4FF CALL <MP4Conve.LStrClr>
004C017A \. C3 RETN
004BFDB4 /$ 55 PUSH EBP
004BFDB5 |. 8BEC MOV EBP, ESP
004BFDB7 |. 51 PUSH ECX
004BFDB8 |. B9 04000000 MOV ECX, 4
004BFDBD |> 6A 00 /PUSH 0
004BFDBF |. 6A 00 |PUSH 0
004BFDC1 |. 49 |DEC ECX
004BFDC2 |.^ 75 F9 \JNZ SHORT MP4Conve.004BFDBD
004BFDC4 |. 51 PUSH ECX
004BFDC5 |. 874D FC XCHG DWORD PTR SS:[EBP-4], ECX
004BFDC8 |. 53 PUSH EBX
004BFDC9 |. 56 PUSH ESI
004BFDCA |. 57 PUSH EDI
004BFDCB |. 8BF9 MOV EDI, ECX
004BFDCD |. 8955 FC MOV DWORD PTR SS:[EBP-4], EDX ; 保存用户名
004BFDD0 |. 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
004BFDD3 |. E8 C450F4FF CALL <MP4Conve.LStrAddRef> ; LStrAddRef,用户名字符串引用+1
004BFDD8 |. 33C0 XOR EAX, EAX
004BFDDA |. 55 PUSH EBP
004BFDDB |. 68 75FF4B00 PUSH MP4Conve.004BFF75
004BFDE0 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004BFDE3 |. 64:8920 MOV DWORD PTR FS:[EAX], ESP
004BFDE6 |. 8BC7 MOV EAX, EDI
004BFDE8 |. E8 FF4BF4FF CALL <MP4Conve.LStrClr> ; LStrClr
004BFDED |. 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4] ; 取用户名
004BFDF0 |. E8 B74EF4FF CALL <MP4Conve.GetLen> ; 取用户名长度
004BFDF5 |. 8BF0 MOV ESI, EAX
004BFDF7 |. 85F6 TEST ESI, ESI
004BFDF9 |. 7E 26 JLE SHORT MP4Conve.004BFE21 ; 用户名长度小于等于0则跳
004BFDFB |. BB 01000000 MOV EBX, 1
004BFE00 |> 8D4D EC /LEA ECX, DWORD PTR SS:[EBP-14]
004BFE03 |. 8B45 FC |MOV EAX, DWORD PTR SS:[EBP-4] ; 取用户名
004BFE06 |. 0FB64418 FF |MOVZX EAX, BYTE PTR DS:[EAX+EBX-1] ; 根据EBX值,循环取每一位用户名
004BFE0B |. 33D2 |XOR EDX, EDX
004BFE0D |. E8 F6A3F4FF |CALL <MP4Conve.IntToHex> ; IntToHex,将十进制数转换为十六进制的字符串形式
004BFE12 |. 8B55 EC |MOV EDX, DWORD PTR SS:[EBP-14] ; 转换后的结果
004BFE15 |. 8D45 F8 |LEA EAX, DWORD PTR SS:[EBP-8]
004BFE18 |. E8 974EF4FF |CALL <MP4Conve.LStrCat> ; LStrCat,追加字符串
004BFE1D |. 43 |INC EBX
004BFE1E |. 4E |DEC ESI
004BFE1F |.^ 75 DF \JNZ SHORT MP4Conve.004BFE00 ; 循环生成每一位用户名ASCII值的十六进制形式字符串
004BFE21 |> 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-8] ; 取生成的字符串
004BFE24 |. E8 834EF4FF CALL <MP4Conve.GetLen> ; 求长度
004BFE29 |. 8BF0 MOV ESI, EAX
004BFE2B |. 85F6 TEST ESI, ESI
004BFE2D |. 7E 2C JLE SHORT MP4Conve.004BFE5B ; 长度不大于0则跳
004BFE2F |. BB 01000000 MOV EBX, 1
004BFE34 |> 8B45 F8 /MOV EAX, DWORD PTR SS:[EBP-8] ; 取生成的字符串
004BFE37 |. E8 704EF4FF |CALL <MP4Conve.GetLen> ; 求长度
004BFE3C |. 2BC3 |SUB EAX, EBX
004BFE3E |. 8B55 F8 |MOV EDX, DWORD PTR SS:[EBP-8]
004BFE41 |. 8A1402 |MOV DL, BYTE PTR DS:[EDX+EAX] ; 根据EAX的值取一位生成的字符串,此处是由后面向前取
004BFE44 |. 8D45 E8 |LEA EAX, DWORD PTR SS:[EBP-18]
004BFE47 |. E8 884DF4FF |CALL <MP4Conve.NewString> ; 分配字符串
004BFE4C |. 8B55 E8 |MOV EDX, DWORD PTR SS:[EBP-18]
004BFE4F |. 8D45 F4 |LEA EAX, DWORD PTR SS:[EBP-C]
004BFE52 |. E8 5D4EF4FF |CALL <MP4Conve.LStrCat> ; LstrCat,追加字符串
004BFE57 |. 43 |INC EBX
004BFE58 |. 4E |DEC ESI
004BFE59 |.^ 75 D9 \JNZ SHORT MP4Conve.004BFE34 ; 循环将生成的字符串逆序
004BFE5B |> 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] ; 指向原来生成的字符串
004BFE5E |. 50 PUSH EAX
004BFE5F |. B9 04000000 MOV ECX, 4
004BFE64 |. BA 01000000 MOV EDX, 1
004BFE69 |. 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ; 指向逆序后的字符串
004BFE6C |. E8 9B50F4FF CALL <MP4Conve.LStrCopy> ; LStrCopy,取1-4位逆序后的字符串
004BFE71 |. 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-C]
004BFE74 |. 50 PUSH EAX
004BFE75 |. B9 04000000 MOV ECX, 4
004BFE7A |. BA 05000000 MOV EDX, 5
004BFE7F |. 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
004BFE82 |. E8 8550F4FF CALL <MP4Conve.LStrCopy> ; LStrCopy,取5-8位
004BFE87 |. 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-8] ; 指向逆序后的1-4位字符串
004BFE8A |. E8 1D4EF4FF CALL <MP4Conve.GetLen> ; 取长度
004BFE8F |. 83F8 04 CMP EAX, 4 ; 如果大于等于4
004BFE92 7D 2F JGE SHORT MP4Conve.004BFEC3
004BFE94 |. 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-8] ; 指向逆序后的字符串
004BFE97 |. E8 104EF4FF CALL <MP4Conve.GetLen>
004BFE9C |. 8BD8 MOV EBX, EAX
004BFE9E |. 83FB 03 CMP EBX, 3 ; 大于3
004BFEA1 |. 7F 20 JG SHORT MP4Conve.004BFEC3
004BFEA3 |> 8D4D E4 /LEA ECX, DWORD PTR SS:[EBP-1C]
004BFEA6 |. 8BC3 |MOV EAX, EBX
004BFEA8 |. C1E0 02 |SHL EAX, 2 ; 长度 = 长度 * 4
004BFEAB |. 33D2 |XOR EDX, EDX
004BFEAD |. E8 56A3F4FF |CALL <MP4Conve.IntToHex> ; 转成十六进制表示的字符串
004BFEB2 |. 8B55 E4 |MOV EDX, DWORD PTR SS:[EBP-1C]
004BFEB5 |. 8D45 F8 |LEA EAX, DWORD PTR SS:[EBP-8]
004BFEB8 |. E8 F74DF4FF |CALL <MP4Conve.LStrCat> ; 追加到逆序后的字符串
004BFEBD |. 43 |INC EBX
004BFEBE |. 83FB 04 |CMP EBX, 4
004BFEC1 |.^ 75 E0 \JNZ SHORT MP4Conve.004BFEA3 ; 循环进行扩展
004BFEC3 |> 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ; 指向逆序后的5-8位字符串
004BFEC6 |. E8 E14DF4FF CALL <MP4Conve.GetLen>
004BFECB |. 83F8 04 CMP EAX, 4
004BFECE |. 7D 2F JGE SHORT MP4Conve.004BFEFF
004BFED0 |. 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
004BFED3 |. E8 D44DF4FF CALL <MP4Conve.GetLen>
004BFED8 |. 8BD8 MOV EBX, EAX
004BFEDA |. 83FB 03 CMP EBX, 3
004BFEDD |. 7F 20 JG SHORT MP4Conve.004BFEFF
004BFEDF |> 8D4D E0 /LEA ECX, DWORD PTR SS:[EBP-20]
004BFEE2 |. 8BC3 |MOV EAX, EBX
004BFEE4 |. C1E0 02 |SHL EAX, 2
004BFEE7 |. 33D2 |XOR EDX, EDX
004BFEE9 |. E8 1AA3F4FF |CALL <MP4Conve.IntToHex>
004BFEEE |. 8B55 E0 |MOV EDX, DWORD PTR SS:[EBP-20]
004BFEF1 |. 8D45 F4 |LEA EAX, DWORD PTR SS:[EBP-C]
004BFEF4 |. E8 BB4DF4FF |CALL <MP4Conve.LStrCat>
004BFEF9 |. 43 |INC EBX
004BFEFA |. 83FB 04 |CMP EBX, 4
004BFEFD |.^ 75 E0 \JNZ SHORT MP4Conve.004BFEDF ; 循环扩展
004BFEFF |> 8D45 F0 LEA EAX, DWORD PTR SS:[EBP-10]
004BFF02 |. BA 8CFF4B00 MOV EDX, MP4Conve.004BFF8C ; lenomp4888
004BFF07 |. E8 784BF4FF CALL MP4Conve.00404A84 ; LStrLAsg,复制字符串
004BFF0C |. 8D45 DC LEA EAX, DWORD PTR SS:[EBP-24]
004BFF0F |. 50 PUSH EAX
004BFF10 |. B9 04000000 MOV ECX, 4
004BFF15 |. BA 01000000 MOV EDX, 1
004BFF1A |. 8B45 F0 MOV EAX, DWORD PTR SS:[EBP-10]
004BFF1D |. E8 EA4FF4FF CALL <MP4Conve.LStrCopy> ; LStrCopy,取1-4位密钥
004BFF22 |. FF75 DC PUSH DWORD PTR SS:[EBP-24]
004BFF25 |. 68 A0FF4B00 PUSH MP4Conve.004BFFA0 ; -
004BFF2A |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] ; 逆序后的1-4位
004BFF2D |. 8D45 D8 LEA EAX, DWORD PTR SS:[EBP-28]
004BFF30 |. 50 PUSH EAX
004BFF31 |. B9 05000000 MOV ECX, 5
004BFF36 |. BA 05000000 MOV EDX, 5
004BFF3B |. 8B45 F0 MOV EAX, DWORD PTR SS:[EBP-10]
004BFF3E |. E8 C94FF4FF CALL <MP4Conve.LStrCopy> ; 取5-9位密钥
004BFF43 |. FF75 D8 PUSH DWORD PTR SS:[EBP-28]
004BFF46 |. 68 A0FF4B00 PUSH MP4Conve.004BFFA0 ; -
004BFF4B |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; 逆序后的5-8位
004BFF4E |. 8BC7 MOV EAX, EDI
004BFF50 |. BA 06000000 MOV EDX, 6
004BFF55 |. E8 124EF4FF CALL MP4Conve.00404D6C ; LStrCatN,连接之前入栈的各字符串
004BFF5A |. 33C0 XOR EAX, EAX
004BFF5C |. 5A POP EDX
004BFF5D |. 59 POP ECX
004BFF5E |. 59 POP ECX
004BFF5F |. 64:8910 MOV DWORD PTR FS:[EAX], EDX
004BFF62 |. 68 7CFF4B00 PUSH MP4Conve.004BFF7C
004BFF67 |> 8D45 D8 LEA EAX, DWORD PTR SS:[EBP-28]
004BFF6A |. BA 0A000000 MOV EDX, 0A
004BFF6F |. E8 9C4AF4FF CALL <MP4Conve.LStrArrayClr> ; LStrArrayClr,清空字符串数组
004BFF74 \. C3 RETN
-------------------------------------------------------------------------------------------------------
【算法小结】
1. 用户名和KEY的长度必须大于0.(这不是废话么)
2. 将用户名的每一位ASCII值的十六进制形式连接到一起组成一串字符串,呼之:字符串A.
3. 将字符串A逆序
4. 如果字符串A的长度小于8则对其进行扩展
2. J = (i % 4) << 2; //左移2位即相当于乘以4
5. KEY = “leno-” + 字符串A的1-4位 + “mp488-“ + 字符串A的5-8位.
语文功底不好,用文字很难表述,下面帖一个算法的函数(MFC),注册机就不上传了.
//生成KEY
CString MakeKey(CString strName)
{
if (strName.IsEmpty()) //如果用户名为空则返回
{
return "";
}
CString strReverse; //逆序后的字符串
CString strKEY; //最终生成的KEY
CString strTemp; //临时变量
//循环生成字符串
for (int i = 0; i < strName.GetLength(); ++i)
{
strTemp.Format("%x",strName[i]); //十六进制形式
strTemp.MakeUpper(); //字母转成大写
strReverse += strTemp; //追加
}
strReverse.MakeReverse(); //逆序
//如果生成的字符串长度小于(即用户小于位),则进行扩充
int iLen = strReverse.GetLength();
if (8 > iLen)
{
int iPos = iLen;
int iTemp;
for (;iPos < 8; ++iPos)
{
iTemp = iPos % 4; //由于原程序一次只扩充4位,所以位数只能是0-3
iTemp *= 4; //*4,相当于左移位
strTemp.Format("%x",iTemp);
strTemp.MakeUpper();
strReverse.Append(strTemp); //追加
}
}
//生成最终KEY,其中有部分是固定的
strKEY.Format("leno-%smp488-%s",strReverse.Mid(0,4),strReverse.Mid(4,4));
return strKEY;
}
--------------------------------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课