Y4Ng 发表于 2012-5-3 21:53

极速MP4视频格式转换器 注册码分析

本帖最后由 Y4Ng 于 2012-5-6 21:23 编辑

使用工具:Peid,OllyDbg,Python
说明:本方法使用于极速软件的各种格式转换器,其他软件的方法和本方法类同。

Peid 查壳,无壳,语言:Borland Delphi 6.0 - 7.0
OD载入mp4.exe,F9运行,弹出试用或者输入注册码的窗口,


软件注册-用假注册码去试试有什么提示,
弹出“注册码错误,请重新输入用户名和注册码!”的对话框
OD中搜索字符串注册码错误,找到上面的提示,双击。停在004C1FA8
004C1FA1   > \6A 40         PUSH 40
004C1FA3   .68 C4204C00   PUSH 004C20C4                            ;register
004C1FA8   .68 D0204C00   PUSH 004C20D0                            ;注册码错误,请重新输入用户名和注册码!

向上观察反汇编代码
004C1EB9   .E8 B2FEFFFF   CALL 004C1D70                            ;注册码在这个CALL里面 F7
004C1EBE   .84C0          TEST AL,AL
004C1EC0   .0F84 DB000000 JE 004C1FA1                              ;关键跳,如果成功跳转,就跳到注册码错误

在004C1EB9 CALL 004C1D70下断点,再次用假注册码试着注册一下,OD断在004C1EB9 CALL 004C1D70处F7进入这个CALL ,
...
004C1D9B|.E8 8054FAFF   CALL 00467220                            ;取假注册码
004C1DA0|.8B45 F8       MOV EAX,DWORD PTR SS:
004C1DA3|.8D55 FC       LEA EDX,DWORD PTR SS:
004C1DA6|.E8 296DF4FF   CALL 00408AD4
004C1DAB|.8B45 FC       MOV EAX,DWORD PTR SS:
004C1DAE|.50            PUSH EAX
004C1DAF|.8D55 EC       LEA EDX,DWORD PTR SS:
004C1DB2|.8B86 04030000 MOV EAX,DWORD PTR DS:
004C1DB8|.E8 6354FAFF   CALL 00467220                            ;取用户名
004C1DBD|.8B45 EC       MOV EAX,DWORD PTR SS:
004C1DC0|.8D55 F0       LEA EDX,DWORD PTR SS:
004C1DC3|.E8 0C6DF4FF   CALL 00408AD4
004C1DC8|.8B55 F0       MOV EDX,DWORD PTR SS:
004C1DCB|.8D4D F4       LEA ECX,DWORD PTR SS:
004C1DCE|.8BC6          MOV EAX,ESI
004C1DD0|.E8 EBFCFFFF   CALL 004C1AC0                            ;这个CALL生成真注册码 F7进入
004C1DD5|.8B55 F4       MOV EDX,DWORD PTR SS:

F7进入004C1DD0 CALL 004C1AC0   
以下直接看注释!
004C1B0C|> /8D4D EC       /LEA ECX,DWORD PTR SS:
004C1B0F|. |8B45 FC       |MOV EAX,DWORD PTR SS:
004C1B12|. |0FB64418 FF   |MOVZX EAX,BYTE PTR DS:
004C1B17|. |33D2          |XOR EDX,EDX
004C1B19|. |E8 3273F4FF   |CALL 00408E50                           ;hex4Uname = 把用户名转换成十六进制
004C1B1E|. |8B55 EC       |MOV EDX,DWORD PTR SS:
004C1B21|. |8D45 F8       |LEA EAX,DWORD PTR SS:
004C1B24|. |E8 CB2AF4FF   |CALL 004045F4
004C1B29|. |43            |INC EBX
004C1B2A|. |4E            |DEC ESI
004C1B2B|.^\75 DF         \JNZ SHORT 004C1B0C

004C1B40|> /8B45 F8       /MOV EAX,DWORD PTR SS:
004C1B43|. |E8 A42AF4FF   |CALL 004045EC
004C1B48|. |2BC3          |SUB EAX,EBX
004C1B4A|. |8B55 F8       |MOV EDX,DWORD PTR SS:
004C1B4D|. |8A1402      |MOV DL,BYTE PTR DS:            ;reOrdHex4Uname = 逆序用户名的ASCII码的每一位
004C1B50|. |8D45 E8       |LEA EAX,DWORD PTR SS:
004C1B53|. |E8 A029F4FF   |CALL 004044F8
004C1B58|. |8B55 E8       |MOV EDX,DWORD PTR SS:
004C1B5B|. |8D45 F4       |LEA EAX,DWORD PTR SS:
004C1B5E|. |E8 912AF4FF   |CALL 004045F4
004C1B63|. |43            |INC EBX
004C1B64|. |4E            |DEC ESI
004C1B65|.^\75 D9         \JNZ SHORT 004C1B40

004C1B80|.50            PUSH EAX
004C1B81|.B9 04000000   MOV ECX,4
004C1B86|.BA 05000000   MOV EDX,5
004C1B8B|.8B45 F4       MOV EAX,DWORD PTR SS:             ;key = 取string2的前八位
004C1B8E|.E8 B92CF4FF   CALL 0040484C
004C1B93|.8B45 F8       MOV EAX,DWORD PTR SS:             ;key1 = key的前四位
004C1B96|.E8 512AF4FF   CALL 004045EC
004C1B9B|.83F8 04       CMP EAX,4                              ;判断key1是否大于4
004C1B9E|.7D 2F         JGE SHORT 004C1BCF

004C1BCF|> \8B45 F4       MOV EAX,DWORD PTR SS:             ;key2 = key的后四位
004C1BD2|.E8 152AF4FF   CALL 004045EC
004C1BD7|.83F8 04       CMP EAX,4                              ;判断key2是否大于4

004C1C0B|> \8D45 F0       LEA EAX,DWORD PTR SS:            ;↓↓↓下面的是一个字符串常量 下面称为mp4str
004C1C0E|.BA 981C4C00   MOV EDX,004C1C98                         ;mp46687i686c
004C1C13|.E8 9027F4FF   CALL 004043A8
004C1C18|.8D45 DC       LEA EAX,DWORD PTR SS:
004C1C1B|.50            PUSH EAX
004C1C1C|.B9 04000000   MOV ECX,4
004C1C21|.BA 01000000   MOV EDX,1
004C1C26|.8B45 F0       MOV EAX,DWORD PTR SS:
004C1C29|.E8 1E2CF4FF   CALL 0040484C
004C1C2E|.FF75 DC       PUSH DWORD PTR SS:               ;mp4str的前四位
004C1C31|.68 B01C4C00   PUSH 004C1CB0                            ;-
004C1C36|.FF75 F8       PUSH DWORD PTR SS:                ;key1
004C1C39|.8D45 D8       LEA EAX,DWORD PTR SS:
004C1C3C|.50            PUSH EAX
004C1C3D|.B9 05000000   MOV ECX,5
004C1C42|.BA 05000000   MOV EDX,5
004C1C47|.8B45 F0       MOV EAX,DWORD PTR SS:
004C1C4A|.E8 FD2BF4FF   CALL 0040484C
004C1C4F|.FF75 D8       PUSH DWORD PTR SS:               ;mp4str的5位至9位
004C1C52|.68 B01C4C00   PUSH 004C1CB0                            ;-
004C1C57|.FF75 F4       PUSH DWORD PTR SS:                ;key2
004C1C5A|.8BC7          MOV EAX,EDI                              ;↑↑↑以上就可以组成正确的注册码了。


至此注册码已经分析完成。

输入分析出来的注册码将会发现,这次没有提示注册码错误了,
但是在帮助文件-关于里面可以看到这只是一个Demo版本。


而且标题栏还有“(试用版只能转换源文件30秒的时间!)”
搜索字符串,

004C60C3   .80B8 A5050000>CMP BYTE PTR DS:,0            ;此处cmp,判断下面的je是否跳转
004C60CA   .74 29         JE SHORT 004C60F5
004C60CC   .8D55 B0       LEA EDX,DWORD PTR SS:
004C60CF   .A1 38DE4D00   MOV EAX,DWORD PTR DS:
004C60D4   .E8 4711FAFF   CALL 00467220
004C60D9   .8D45 B0       LEA EAX,DWORD PTR SS:
004C60DC   .BA B8674C00   MOV EDX,004C67B8                         ;(试用版只能转换源文件30秒的时间!)
004C60E1   .E8 0EE5F3FF   CALL 004045F4


004C60C3   .80B8 A5050000>CMP BYTE PTR DS:,0            ;此处cmp,判断下面的je是否跳转

按F2下断点,用OD重新载入软件, F9运行,停在004C60C3
在信息栏可以看到
DS:=01



右键它,跟随地址到数据窗口
选中00A62CB5地址的“01” 下硬件写入Byte断点。
按Ctrl+F2重新开始。
按两次F9运行,
004C5D7F   .C680 A5050000>MOV BYTE PTR DS:,0            ;此时把“1”传给00A62CB5,就是Demo版本,如果把“0”传给00A62CB5,就是正式版。
004C5D86   .8B45 FC       MOV EAX,DWORD PTR SS:             ;按两次F9停在这里

所以修改
004C5D7FMOV BYTE PTR DS:,1

004C5D7FMOV BYTE PTR DS:,0
然后保存,再次打开就是正式版了。
提供一组可用注册码:
用户名:吾爱专版
用户名:mp46-6E0B687i6-8A7D

注册机(python)
#!/usr/bin/env python

import binascii
class JiSuMp4:
def __init__(self, userName):
    self.userName = userName
    print("UserName is:%s" % self.userName)
    hex4Uname = binascii.b2a_hex(self.userName).upper()
    reOrdHex4Uname = hex4Uname[::-1]
    key = reOrdHex4Uname
    print("key is:mp46-%s%s%s%s687i6-%s%s%s%s" % (key, key, key, key, key, key, key, key))
def main():
username = raw_input("Please enter username(Length>=4):")
JiSuMp4(username)
if __name__ == '__main__':
main()



http://115.com/file/dpp7zhp9#极速mp4视频格式转换器吾爱专版.7z

Chief 发表于 2012-5-3 21:57

继续给力,期待下一次分析。

tk86935367 发表于 2012-5-3 22:09

非常不错,支持一个

a363123626 发表于 2012-5-3 22:17

好东西 谢谢分享

a070458 发表于 2012-5-3 22:20

感谢分享 期待下一期

kino 发表于 2012-5-4 00:42

不错留着以后学习

fuxz2010 发表于 2012-5-4 00:47

不错的教程,很详细很全面,赞

seamac 发表于 2012-5-4 08:27

非常不错,支持一个 继续学习

老海 发表于 2012-5-4 08:48

希望有这样更多的分析贴子。

qzy0549 发表于 2012-5-4 12:59

本帖最后由 qzy0549 于 2012-5-4 14:04 编辑

相当给力的分析啊 谢谢了 学到很多了!!!
页: [1] 2
查看完整版本: 极速MP4视频格式转换器 注册码分析