某视频转换软件算法分析
【破文标题】某视频转换软件算法分析【破解工具】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 编辑 ] /:010 貌似算法很复杂..
回复 2# 明次 的帖子
学习中,这个不错
页:
[1]