【文章标题】: 光影魔术手0.23 注册算法分析
【文章作者】: LuoXue
【作者邮箱】: player4343@163.com
【作者主页】: 无
【作者QQ号】: 45109326
【软件名称】: nEOiMAGING_v0.23光影魔术手
【软件大小】: 3.28M
【下载地址】: 自己搜索下载
【加壳方式】: aspack2.12
【保护方式】: aspack 2.12+key
【编写语言】: delphi
【使用工具】: od,peid
【操作平台】: winXP SP2
【软件介绍】: 一大堆的功能,自己看看吧
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
今日闲的很,于是便到网上逛了逛,发现一款软件,使用很是顺手!不过当我看见关于项中的注册时。。。嘿嘿。。于是就有了下面着篇破解文章,大虾们闪了!
Peid侦测显示为aspack 2.12. too easy!三下五除二就搞定了,呵呵~~
下面开始跟踪算法,常规思路:OD载入--》老罗的字符插件搜索字符串,呵呵!被我发现了端倪了哦~~共找到了2处如下的代码:
0059510C |. >cmp eax, 4
0059510F |. >jge short 0059514B
00595111 |. >push 0
00595113 |. >push 005952F0 ; 错误:〖注册姓名〗\n
00595118 |. >push dword ptr [ebx+32C]
0059511E |. >push 0059530C ; \n
00595123 |. >push 00595318 ; 长度太短,无法注册!
00595172 |. >cmp eax, 16
00595175 |. >je short 005951B1
00595177 |. >push 0
00595179 |. >push 0059533C ; 错误:〖注册码〗\n
0059517E |. >push dword ptr [ebx+330]
00595184 |. >push 0059530C ; \n
00595189 |. >push 00595358 ; 长度不符,无法注册!
这两处都是对注册名和注册码的长度检测,如果注册名<4位,注册码<16位,均不能注册成功!呵呵下面我门看见了"注册成功了"!但是我看这个跳转有些别扭,于是就往上找,就到了5951BA这个地方,看见了它是指向注册失败处的,可以猜测上面的call就是注册算法咯~~呵呵
0059518E |. >lea eax, dword ptr [ebp-14]
00595191 |. >mov edx, 4
00595196 |. >call 00405108
0059519B |. >mov eax, dword ptr [ebp-14]
0059519E |. >mov cx, word ptr [595330]
005951A5 |. >mov dl, 1
005951A7 |. >call 004379EC
005951AC |. >jmp 00595292
005951B1 |> >mov eax, ebx
005951B3 |. >call 00594EB4 关键call 需要f7跟入的关键算法
005951B8 |. >test al, al 通过测试eax的值确定程序走向
005951BA |. >je 0059527D ?------------------------------ 关键跳转
005951C0 |. >mov eax, ebx
005951C2 |. >call 00594DB0
005951C7 |. >xor esi, esi
005951C9 |> >/lea eax, dword ptr [ebp-11C] 此为写入.lic文件的计算部分,由于时间关系不再跟踪
005951CF |. >|push eax
005951D0 |. >|mov edx, esi
005951D2 |. >|add edx, edx
005951D4 |. >|mov eax, dword ptr [5ED828]
005951D9 |. >|mov eax, dword ptr [eax]
005951DB |. >|mov ecx, 4
005951E0 |. >|call 004052A8
005951E5 |. >|mov eax, dword ptr [ebp-11C]
005951EB |. >|push eax
005951EC |. >|lea eax, dword ptr [ebp-120]
005951F2 |. >|push eax
005951F3 |. >|mov ecx, 8
005951F8 |. >|mov edx, 0B
005951FD |. >|mov eax, dword ptr [ebx+330]
00595203 |. >|call 004052A8
00595208 |. >|mov eax, dword ptr [ebp-120]
0059520E |. >|lea ecx, dword ptr [ebp-118]
00595214 |. >|pop edx
00595215 |. >|call 00513EA8
0059521A |. >|mov edx, dword ptr [ebp-118]
00595220 |. >|lea eax, dword ptr [ebp-114]
00595226 |. >|mov ecx, 0FF
0059522B |. >|call 00405024
00595230 |. >|lea edx, dword ptr [ebp-114]
00595236 |. >|mov eax, esi
00595238 |. >|shl eax, 5
0059523B |. >|sub eax, esi
0059523D |. >|mov ecx, dword ptr [5ED1CC]
00595243 |. >|mov ecx, dword ptr [ecx]
00595245 |. >|lea eax, dword ptr [ecx+eax+A89]
0059524C |. >|mov cl, 1E
0059524E |. >|call 004032B8
00595253 |. >|inc esi
00595254 |. >|cmp esi, 3
00595257 |.^ >\jnz 005951C9 循环写入文件
0059525D |. >mov dl, 1
0059525F |. >mov eax, ebx
00595261 |. >call 00594BA4
00595266 |. >push 0
00595268 |. >mov cx, word ptr [595330]
0059526F |. >mov dl, 2
00595271 |. >mov eax, 00595378 成功注册!感谢您的支持!
00595276 |. >call 004379EC
0059527B |. >jmp short 00595292
0059527D |> >push 0 ; /Arg1 = 00000000 注意这里是从上面的关键call之后跳过来的!
0059527F |. >mov cx, word ptr [595330]
00595286 |. >mov dl, 1
00595288 |. >mov eax, 0059539C 注册失败:注册码无效!
0059528D |. >call 004379EC
00595292 |> >xor eax, eax
00595294 |. >pop edx
00595295 |. >pop ecx
00595296 |. >pop ecx
00595297 |. >mov dword ptr fs:[eax], edx
0059529A |. >push 005952DF
0059529F |> >lea eax, dword ptr [ebp-120]
我们跟入关键call之后发现了如下算法,呵呵
关键算法1:
00594EC4 |. >push ebp
00594EC5 |. >push 00594FB6
00594ECA |. >push dword ptr fs:[eax]
00594ECD |. >mov dword ptr fs:[eax], esp
00594ED0 |. >mov eax, dword ptr [ebx+32C]
00594ED6 |. >call 00405048
00594EDB |. >cmp eax, 4
00594EDE |. >jl short 00594EF0
00594EE0 |. >mov eax, dword ptr [ebx+330]
00594EE6 |. >call 00405048
00594EEB |. >cmp eax, 16
00594EEE |. >je short 00594EF7
00594EF0 |> >xor eax, eax
00594EF2 |. >jmp 00594F99
00594EF7 |> >lea ecx, dword ptr [ebp-4]
00594EFA |. >mov edx, dword ptr [5ED828]
00594F00 |. >mov edx, dword ptr [edx]
00594F02 |. >mov eax, dword ptr [ebx+32C]
00594F08 |. >call 00513EA8 关键call f7 (算法关键 2)
00594F0D |. >lea eax, dword ptr [ebp-8] 申请堆栈空间存放数据
00594F10 |. >push eax 入栈
00594F11 |. >mov eax, dword ptr [ebx+330] eax=ebx+330="0123456….."
00594F17 |. >mov ecx, 4 ecx=4
00594F1C |. >mov edx, 13 edx=13
00594F21 |. >call 004052A8 取实验码后四位
00594F26 |. >mov eax, dword ptr [ebp-4]
00594F29 |. >call 00405048 取循环结果长度
00594F2E |. >mov ecx, eax 长度入ecx
00594F30 |. >xor ebx, ebx ebx清零
00594F32 |. >mov eax, ecx 长度入eax
00594F34 |. >dec eax eax=eax-1
00594F35 |. >test eax, eax 测试eax决定程序走向
00594F37 |. >jl short 00594F4D 小于则跳走
00594F39 |. >inc eax eax=eax+1
00594F3A |. >xor edx, edx edx清零
00594F3C |> >/mov esi, dword ptr [ebp-4] esi初始化
00594F3F |. >|movzx esi, byte ptr [esi+edx-1] 依次取循环结果
00594F44 |. >|imul esi, ecx 每位均与长度相乘
00594F47 |. >|add ebx, esi ebx=ebx+esi
00594F49 |. >|inc edx
00594F4A |. >|dec eax
00594F4B |.^ >\jnz short 00594F3C
00594F4D |> >cmp ebx, 270F ebx与270f比较
00594F53 |. >jle short 00594F63 小于等于则跳
00594F55 |. >mov eax, ebx
00594F57 |. >mov ecx, 2710
00594F5C |. >cdq
00594F5D |. >idiv ecx
00594F5F |. >mov ebx, edx
00594F61 |. >jmp short 00594F71
00594F63 |> >cmp ebx, 2328 由4f53而来 ebx与2328比较
00594F69 >jge short 00594F71 小于等于则跳
00594F6B |. >add ebx, 3E8
00594F71 |> >lea eax, dword ptr [ebp-C]
00594F74 |. >push eax ; /Arg1
00594F75 |. >mov dword ptr [ebp-14], ebx ; |
00594F78 |. >mov byte ptr [ebp-10], 0 ; |
00594F7C |. >lea edx, dword ptr [ebp-14] ; |
00594F7F |. >xor ecx, ecx ; |
00594F81 |. >mov eax, 00594FD0 ; |%4d
00594F86 |. >call 0040AEEC
00594F8B |. >mov eax, dword ptr [ebp-8] 试验码后4位
00594F8E |. >mov edx, dword ptr [ebp-C] 注册码后4位
00594F91 |. >call 00405194 关键比较
00594F96 |. >sete al ?---------------------------注册标志
关键算法 2:
00513F03 |> /8B45 FC /mov eax, dword ptr [ebp-4] ->取得用户名称
00513F06 |. |8A4418 FF |mov al, byte ptr [eax+ebx-1] '取用户名第一个字符
00513F0A |. |24 0F |and al, 0F 与0f与运算结果送al
00513F0C |. |8B55 F8 |mov edx, dword ptr [ebp-8] 取固定序列值 (注册表中关键值)
00513F0F |. |8A5432 FF |mov dl, byte ptr [edx+esi-1] 取序列第一位进dl
00513F13 |. |80E2 0F |and dl, 0F 与0f与运算
00513F16 |. |32C2 |xor al, dl 两个结果进行异或结果入al
00513F18 |. |8845 F3 |mov byte ptr [ebp-D], al eax '[ebp-d]=12ed7e
00513F1B |. |8D45 FC |lea eax, dword ptr [ebp-4] eax'12ed88
00513F1E |. |E8 7D13EFFF |call 004052A0 再次取username
00513F23 |. |8B55 FC |mov edx, dword ptr [ebp-4] ebp-4值入edx=wopasi
00513F26 |. |8A541A FF |mov dl, byte ptr [edx+ebx-1] 计算值入edx
00513F2A |. |80E2 F0 |and dl, 0F0 dl xor f0'dl
00513F2D |. |8A4D F3 |mov cl, byte ptr [ebp-D] ebp-d'cl=02
00513F30 |. |02D1 |add dl, cl dl=cl+dl 72(ascii:r)
00513F32 |. |885418 FF |mov byte ptr [eax+ebx-1], dl eax+ebp-1=dl (ascii:r)
00513F36 |. |46 |inc esi esi =esi+1
00513F37 |. |8B45 F8 |mov eax, dword ptr [ebp-8] 取固定序列
00513F3A |. |E8 0911EFFF |call 00405048 取固定序列长度:23'hex:17
00513F3F |. |3BF0 |cmp esi, eax 比较esi eax
00513F41 |. |7E 05 |jle short 00513F48 小于或等于则跳走至513f48
00513F43 |. |BE 01000000 |mov esi, 1 esi=1
00513F48 |> |43 |inc ebx ebx=ebx+1
00513F49 |. |4F |dec edi edi=edi-1
00513F4A |.^\75 B7 \jnz short 00513F03 loop循环 ↑
--------------------------------------------------------------------------------
【经验总结】
好了总结一下,算法比较简单,就是分别取用户名和固定序列的第一个字符的asc值分离出每位的低高位
将固定序列的高位和注册名的高位异或,将结果与用户名的高位进行连接,然后将结果乘以名称长度-1再累加,结果作为注
册码的后4位,好了,就这么简单!下面干什么?~~~呵呵~~当然是用vb实现咯~~
代码我就不写了,是64位编程斑竹帮俺写的~~~我只是写了点框架而已~~再此多谢斑竹给我的帮助~~真的很感谢你!呵呵
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年11月27日 16:08:14
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!