liuyun213 发表于 2010-1-10 15:36:10

某视频转换软件算法分析

【破文标题】某视频转换软件算法分析
【破解工具】OD
【破解平台】Windows
【软件名称】某视频转换软件
【软件简介】https://www.chinapyg.com/viewthread.php?tid=53247&extra=page%3D1
【破解声明】
------------------------------------------------------------------------
【破解过程】004D6E62      00            db      00
004D6E63      90            nop
004D6E64/$55            push    ebp                              ;算法入口
004D6E65|.8BEC          mov   ebp, esp
004D6E67|.51            push    ecx
004D6E68|.B9 04000000   mov   ecx, 4
004D6E6D|>6A 00         /push    0
004D6E6F|.6A 00         |push    0
004D6E71|.49            |dec   ecx
004D6E72|.^ 75 F9         \jnz   short 004D6E6D                  ;push 8 0
004D6E74|.51            push    ecx
004D6E75|.874D FC       xchg    dword ptr , ecx
004D6E78|.53            push    ebx
004D6E79|.56            push    esi
004D6E7A|.57            push    edi
004D6E7B|.8BF9          mov   edi, ecx
004D6E7D|.8955 FC       mov   dword ptr , edx         ;edx -- name
004D6E80|.8B45 FC       mov   eax, dword ptr          ;eax -- name
004D6E83|.E8 08DBF2FF   call    00404990
004D6E88|.33C0          xor   eax, eax
004D6E8A|.55            push    ebp
004D6E8B|.68 25704D00   push    004D7025
004D6E90|.64:FF30       push    dword ptr fs:
004D6E93|.64:8920       mov   dword ptr fs:, esp
004D6E96|.8BC7          mov   eax, edi
004D6E98|.E8 43D6F2FF   call    004044E0
004D6E9D|.8B45 FC       mov   eax, dword ptr          ; --- name
004D6EA0|.E8 FBD8F2FF   call    004047A0                         ;len(eax) --- 9
004D6EA5|.8BF0          mov   esi, eax
004D6EA7|.85F6          test    esi, esi
004D6EA9|.7E 26         jle   short 004D6ED1                   ;if len(name) <= 0, then jump
004D6EAB|.BB 01000000   mov   ebx, 1                           ;ebx = 1
004D6EB0|>8D4D EC       /lea   ecx, dword ptr
004D6EB3|.8B45 FC       |mov   eax, dword ptr           ;eax -- name
004D6EB6|.0FB64418 FF   |movzx   eax, byte ptr        ;eax = name
004D6EBB|.33D2          |xor   edx, edx
004D6EBD|.E8 E222F3FF   |call    004091A4                        ;eax to ASCII string (16进制大写)
004D6EC2|.8B55 EC       |mov   edx, dword ptr          ;edx -- ASCII string of eax
004D6EC5|.8D45 F8       |lea   eax, dword ptr           ;eax -- some buffer
004D6EC8|.E8 DBD8F2FF   |call    004047A8                        ;strcat(eax, edx)
004D6ECD|.43            |inc   ebx
004D6ECE|.4E            |dec   esi
004D6ECF|.^ 75 DF         \jnz   short 004D6EB0
004D6ED1|>8B45 F8       mov   eax, dword ptr          ; --- AsciiString of name --- NameAscii
004D6ED4|.E8 C7D8F2FF   call    004047A0                         ;eax = len(eax)
004D6ED9|.8BF0          mov   esi, eax
004D6EDB|.85F6          test    esi, esi
004D6EDD|.7E 2C         jle   short 004D6F0B
004D6EDF|.BB 01000000   mov   ebx, 1
004D6EE4|>8B45 F8       /mov   eax, dword ptr
004D6EE7|.E8 B4D8F2FF   |call    004047A0                        ;eax = len(eax) -- len()
004D6EEC|.2BC3          |sub   eax, ebx                        ;eax = eax - ebx
004D6EEE|.8B55 F8       |mov   edx, dword ptr           ;edx -- -- NameAscii
004D6EF1|.8A1402      |mov   dl, byte ptr           ;dl = NameAscii
004D6EF4|.8D45 E8       |lea   eax, dword ptr          ; -- some buffer
004D6EF7|.E8 CCD7F2FF   |call    004046C8
004D6EFC|.8B55 E8       |mov   edx, dword ptr
004D6EFF|.8D45 F4       |lea   eax, dword ptr
004D6F02|.E8 A1D8F2FF   |call    004047A8                        ;strcat(eax, edx)
004D6F07|.43            |inc   ebx
004D6F08|.4E            |dec   esi
004D6F09|.^ 75 D9         \jnz   short 004D6EE4                  ;以上 反转(NameAscii) -- NameAscii2
004D6F0B|>8D45 F8       lea   eax, dword ptr
004D6F0E|.50            push    eax                              ;eax -- some buffer
004D6F0F|.B9 04000000   mov   ecx, 4
004D6F14|.BA 01000000   mov   edx, 1
004D6F19|.8B45 F4       mov   eax, dword ptr          ; -- NameAscii2
004D6F1C|.E8 DFDAF2FF   call    00404A00                         ;substring(NameAscii2, 1, 4)
004D6F21|.8D45 F4       lea   eax, dword ptr
004D6F24|.50            push    eax
004D6F25|.B9 04000000   mov   ecx, 4
004D6F2A|.BA 05000000   mov   edx, 5
004D6F2F|.8B45 F4       mov   eax, dword ptr
004D6F32|.E8 C9DAF2FF   call    00404A00                         ;substring(NameAscii2, 5, 4)
004D6F37|.8B45 F8       mov   eax, dword ptr          ; -- NameAscii2 前4位
004D6F3A|.E8 61D8F2FF   call    004047A0
004D6F3F|.83F8 04       cmp   eax, 4
004D6F42|.7D 2F         jge   short 004D6F73                   ;if >= 4, jmp
004D6F44|.8B45 F8       mov   eax, dword ptr
004D6F47|.E8 54D8F2FF   call    004047A0
004D6F4C|.8BD8          mov   ebx, eax                         ;ebx = len(前几位)
004D6F4E|.83FB 03       cmp   ebx, 3
004D6F51|.7F 20         jg      short 004D6F73                   ;if >= 3 , jmp
004D6F53|>8D4D E4       /lea   ecx, dword ptr
004D6F56      8BC3          mov   eax, ebx                         ;eax = 2/3
004D6F58|.C1E0 02       |shl   eax, 2                        ;eax = eax * 4
004D6F5B|.33D2          |xor   edx, edx
004D6F5D|.E8 4222F3FF   |call    004091A4                        ;eax to AsciiString
004D6F62|.8B55 E4       |mov   edx, dword ptr          ;可能是8 C
004D6F65|.8D45 F8       |lea   eax, dword ptr
004D6F68|.E8 3BD8F2FF   |call    004047A8                        ;strcat(eax, edx)
004D6F6D|.43            |inc   ebx
004D6F6E|.83FB 04       |cmp   ebx, 4
004D6F71|.^ 75 E0         \jnz   short 004D6F53                  ;凑够4位
004D6F73|>8B45 F4       mov   eax, dword ptr          ; NameAscii2 第二个前4位
004D6F76|.E8 25D8F2FF   call    004047A0
004D6F7B|.83F8 04       cmp   eax, 4
004D6F7E|.7D 2F         jge   short 004D6FAF
004D6F80|.8B45 F4       mov   eax, dword ptr
004D6F83|.E8 18D8F2FF   call    004047A0
004D6F88|.8BD8          mov   ebx, eax
004D6F8A|.83FB 03       cmp   ebx, 3
004D6F8D|.7F 20         jg      short 004D6FAF
004D6F8F|>8D4D E0       /lea   ecx, dword ptr
004D6F92|.8BC3          |mov   eax, ebx                        ;可能是 0 1 2 3
004D6F94|.C1E0 02       |shl   eax, 2
004D6F97|.33D2          |xor   edx, edx
004D6F99|.E8 0622F3FF   |call    004091A4
004D6F9E|.8B55 E0       |mov   edx, dword ptr          ;0 4 8 C
004D6FA1|.8D45 F4       |lea   eax, dword ptr
004D6FA4|.E8 FFD7F2FF   |call    004047A8
004D6FA9|.43            |inc   ebx
004D6FAA|.83FB 04       |cmp   ebx, 4
004D6FAD|.^ 75 E0         \jnz   short 004D6F8F                  ;凑够4位
004D6FAF|>8D45 F0       lea   eax, dword ptr
004D6FB2|.BA 3C704D00   mov   edx, 004D703C                  ;lenomp4888
004D6FB7|.E8 BCD5F2FF   call    00404578                         ;store something to
004D6FBC|.8D45 DC       lea   eax, dword ptr           ;buff
004D6FBF|.50            push    eax
004D6FC0|.B9 04000000   mov   ecx, 4
004D6FC5|.BA 01000000   mov   edx, 1
004D6FCA|.8B45 F0       mov   eax, dword ptr
004D6FCD|.E8 2EDAF2FF   call    00404A00                         ;取 1234 位 到
004D6FD2|.FF75 DC       push    dword ptr
004D6FD5|.68 50704D00   push    004D7050                         ;-
004D6FDA|.FF75 F8       push    dword ptr
004D6FDD|.8D45 D8       lea   eax, dword ptr           ;buff
004D6FE0|.50            push    eax
004D6FE1|.B9 05000000   mov   ecx, 5
004D6FE6|.BA 05000000   mov   edx, 5
004D6FEB|.8B45 F0       mov   eax, dword ptr
004D6FEE|.E8 0DDAF2FF   call    00404A00                         ;从 的 56789 位 到
004D6FF3|.FF75 D8       push    dword ptr
004D6FF6|.68 50704D00   push    004D7050                         ;-
004D6FFB|.FF75 F4       push    dword ptr
004D6FFE|.8BC7          mov   eax, edi
004D7000|.BA 06000000   mov   edx, 6
004D7005|.E8 56D8F2FF   call    00404860
004D700A|.33C0          xor   eax, eax
004D700C|.5A            pop   edx
004D700D|.59            pop   ecx
004D700E|.59            pop   ecx
004D700F|.64:8910       mov   dword ptr fs:, edx
004D7012|.68 2C704D00   push    004D702C
004D7017|>8D45 D8       lea   eax, dword ptr
004D701A|.BA 0A000000   mov   edx, 0A
004D701F|.E8 E0D4F2FF   call    00404504
004D7024\.C3            retn
004D7025   .^ E9 FACDF2FF   jmp   00403E24
004D702A   .^ EB EB         jmp   short 004D7017
004D702C   .5F            pop   edi
004D702D   .5E            pop   esi
004D702E   .5B            pop   ebx
004D702F   .8BE5          mov   esp, ebp
004D7031   .5D            pop   ebp
004D7032   .C3            retn
004D7033      00            db      00


------------------------------------------------------------------------
【破解总结】算法比较简单,伪码如下:

name // 用户名
NameAscii = AsciiString(name)// 去用户名的Ascii大写字符串
NameAscii2 = 反转(NameAscii) // 反转用户名Ascii字符串
N1 = 取子串(NameAscii2, 1, 4) // 1到4位
N2 = 取子串(nameascii2, 5,4)// 5 到8位
如果 取 长度(N1)不大于3 或 4, 补齐{
   补 0 4 8 C
...
}
Code = "lenomp4888"
C1 = 取子串(Code,1,4)// 取 1 到 4 位
C1 入栈
"-"入栈
N1入栈
C2 = 取子串(Code,5, 5) // 取 5 到 9 位
C2入栈
"-"入栈
N2入栈
连接以上6个入栈的字符串
------------------------------------------------------------------------
【版权声明】本文只是出于学习和交流目的,请勿用于商业用途,否则后果自负。软件版权归作者所有。
软件在https://www.chinapyg.com/viewthread.php?tid=53247&extra=page%3D1里有介绍
tianxj老大说有暗桩,不过那就不是我这个小菜鸟能解决的了,^_^

[ 本帖最后由 liuyun213 于 2010-1-10 16:27 编辑 ]

明次 发表于 2010-2-23 13:57:10

/:010 貌似算法很复杂..

济民 发表于 2010-3-7 16:11:13

回复 2# 明次 的帖子

学习中,这个不错
页: [1]
查看完整版本: 某视频转换软件算法分析