首页
社区
课程
招聘
[旧帖] [原创]超级mp4视频转换大师1.10 破解手记 0.00雪花
发表于: 2009-10-22 09:33 1891

[旧帖] [原创]超级mp4视频转换大师1.10 破解手记 0.00雪花

2009-10-22 09:33
1891
【文章标题】: 超级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则对其进行扩展
    1.  i代表字符串A的下标,j为临时变量.

    2.  J = (i % 4)  <<  2;  //左移2位即相当于乘以4

    3.  字符串A += j 的十六进制表示.

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;
}


--------------------------------------------------------------------------------------------------------

【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 390
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,思路很清晰
2009-10-22 10:09
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很好,学习了
2009-10-22 10:17
0
雪    币: 146
活跃值: (1395)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
很不错...学习了
2009-10-22 22:50
0
雪    币: 93
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了。。。。。。。
2009-10-23 21:46
0
雪    币: 77
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习中.......
2009-10-23 23:18
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错,很好的学习材料.谢谢lz
2009-10-24 01:22
0
雪    币: 146
活跃值: (1395)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
下载下来不能用啊...需要解压卷
2009-10-24 10:04
0
雪    币: 101
活跃值: (157)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我试过可以啊..不要告诉我你只下了PART1吧...
要全部下完放到一个目录中才能解压啊..
2009-10-24 11:43
0
雪    币: 499
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢楼主分享,学习了
2009-10-24 14:29
0
雪    币: 146
活跃值: (1395)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
谢谢啦....我去试试
2009-10-24 15:28
0
雪    币: 101
活跃值: (157)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
还是申请不了邀请码...
2009-10-29 11:04
0
游客
登录 | 注册 方可回帖
返回
//