- UID
- 2
注册时间2004-12-1
阅读权限255
最后登录1970-1-1
总坛主
TA的每日心情 | 开心 2024-12-1 11:04 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
|
【破文标题】批量文件改名工具 2.0.0算法分析+ASM注册函数
【破文作者】飘云/P.Y.G
【官方主页】https://www.chinapyg.com
【作者博客】http://blog.piaoyunsoft.com
【破解平台】WinXp SP3
【破解工具】PEiD0.94、OD
【作者邮箱】[email protected]
【软件名称】批量文件改名工具 2.0.0
【软件大小】499 K
【原版下载】http://www.newhua.com/soft/90436.htm
【破解过程】
PEID 探测-->Borland Delphi 6.0 - 7.0
很好,,无壳~
OD载入~~ 输入信息:
Email:[email protected]
注册码:123456789
在OD下断来到(如果找不到这个算法位置,说明您目前还不适合看本文):
004AE490 push ebp
004AE491 mov ebp, esp
004AE493 add esp, -10
004AE496 xor ecx, ecx
004AE498 mov dword ptr [ebp-10], ecx
004AE49B mov dword ptr [ebp-C], ecx
004AE49E mov dword ptr [ebp-8], edx
004AE4A1 mov dword ptr [ebp-4], eax
004AE4A4 xor eax, eax
004AE4A6 push ebp
004AE4A7 push 004AE5B8
004AE4AC push dword ptr fs:[eax]
004AE4AF mov dword ptr fs:[eax], esp
004AE4B2 mov eax, dword ptr [ebp-4]
004AE4B5 call 004AE344 ; 关键CALL F7进
004AE4BA test al, al
004AE4BC je 004AE59D ; 关键跳
004AE4C2 mov byte ptr [4B7CA5], 1
004AE4C9 mov edx, 004AE5CC ; ※注册成功※
004AE4CE mov eax, dword ptr [ebp-4]
.
.
.
.
{----------------------关键CALL:call 004AE344--------------------}
004AE344 push ebp
004AE345 mov ebp, esp
004AE347 add esp, -10
004AE34A xor edx, edx
004AE34C mov dword ptr [ebp-C], edx
004AE34F mov dword ptr [ebp-10], edx
004AE352 mov dword ptr [ebp-4], eax
004AE355 xor eax, eax
004AE357 push ebp
004AE358 push 004AE3B0
004AE35D push dword ptr fs:[eax]
004AE360 mov dword ptr fs:[eax], esp
004AE363 lea edx, dword ptr [ebp-C]
004AE366 mov eax, dword ptr [ebp-4]
004AE369 mov eax, dword ptr [eax+30C]
004AE36F call 0045DD80
004AE374 mov eax, dword ptr [ebp-C]
004AE377 push eax
004AE378 lea edx, dword ptr [ebp-10]
004AE37B mov eax, dword ptr [ebp-4]
004AE37E mov eax, dword ptr [eax+308]
004AE384 call 0045DD80
004AE389 mov eax, dword ptr [ebp-10] ; 指向邮箱
004AE38C pop edx
004AE38D call 004AE1A4 ; 算法CALL1 -->F7进去
004AE392 mov byte ptr [ebp-5], al ; 关键赋值
004AE395 xor eax, eax
004AE397 pop edx
004AE398 pop ecx
004AE399 pop ecx
004AE39A mov dword ptr fs:[eax], edx
004AE39D push 004AE3B7
004AE3A2 lea eax, dword ptr [ebp-10]
004AE3A5 mov edx, 2
004AE3AA call 00404834
004AE3AF retn
004AE3B0 jmp 00404190
004AE3B5 jmp short 004AE3A2
004AE3B7 mov al, byte ptr [ebp-5]
004AE3BA mov esp, ebp
004AE3BC pop ebp
004AE3BD retn
{----------------------算法CALL1:call 004AE1A4---------------------}
004AE1A4 push ebp
004AE1A5 mov ebp, esp
004AE1A7 add esp, -14
004AE1AA xor ecx, ecx
004AE1AC mov dword ptr [ebp-10], ecx
004AE1AF mov dword ptr [ebp-8], edx
004AE1B2 mov dword ptr [ebp-4], eax
004AE1B5 mov eax, dword ptr [ebp-4]
004AE1B8 call 00404CC0
004AE1BD mov eax, dword ptr [ebp-8]
004AE1C0 call 00404CC0
004AE1C5 xor eax, eax
004AE1C7 push ebp
004AE1C8 push 004AE243
004AE1CD push dword ptr fs:[eax]
004AE1D0 mov dword ptr fs:[eax], esp
004AE1D3 mov byte ptr [ebp-B], 0
004AE1D7 mov eax, dword ptr [ebp-4] ; 指向邮箱
004AE1DA call 00404AD0 ; 邮箱长度
004AE1DF test al, al
004AE1E1 jbe short 004AE201
004AE1E3 mov byte ptr [ebp-11], al
004AE1E6 mov byte ptr [ebp-A], 1 ; 1
004AE1EA /xor eax, eax
004AE1EC |mov al, byte ptr [ebp-A]
004AE1EF |mov edx, dword ptr [ebp-4] ; 指向邮箱地址
004AE1F2 |mov al, byte ptr [edx+eax-1] ; 逐位
004AE1F6 |add byte ptr [ebp-B], al ; 字节累加
004AE1F9 |inc byte ptr [ebp-A]
004AE1FC |dec byte ptr [ebp-11]
004AE1FF \jnz short 004AE1EA
004AE201 lea ecx, dword ptr [ebp-10]
004AE204 mov dl, byte ptr [ebp-B] ; 取出累加结果(单字节哦~~~)
004AE207 mov eax, 004AE25C ; 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
004AE20C call 004A0028 ; 算法CALL2
004AE211 mov eax, dword ptr [ebp-10] ; 真码
004AE214 mov edx, dword ptr [ebp-8] ; 假码
004AE217 call 00404C1C
004AE21C sete byte ptr [ebp-9] ; 标志位
004AE220 xor eax, eax
004AE222 pop edx
004AE223 pop ecx
004AE224 pop ecx
004AE225 mov dword ptr fs:[eax], edx
004AE228 push 004AE24A
004AE22D lea eax, dword ptr [ebp-10]
004AE230 call 00404810
004AE235 lea eax, dword ptr [ebp-8]
004AE238 mov edx, 2
004AE23D call 00404834
004AE242 retn
004AE243 jmp 00404190
004AE248 jmp short 004AE22D
004AE24A mov al, byte ptr [ebp-9] ; 标志位传到al~~ 作为注册标志
004AE24D mov esp, ebp
004AE24F pop ebp
004AE250 retn
{----------------------算法CALL2:call 004A0028---------------------}
004A0028 push ebp
004A0029 mov ebp, esp
004A002B add esp, -18
004A002E push ebx
004A002F xor ebx, ebx
004A0031 mov dword ptr [ebp-18], ebx
004A0034 mov dword ptr [ebp-C], ecx
004A0037 mov byte ptr [ebp-5], dl
004A003A mov dword ptr [ebp-4], eax
004A003D mov eax, dword ptr [ebp-4]
004A0040 call 00404CC0
004A0045 xor eax, eax
004A0047 push ebp
004A0048 push 004A0112
004A004D push dword ptr fs:[eax]
004A0050 mov dword ptr fs:[eax], esp
004A0053 mov eax, dword ptr [ebp-C]
004A0056 call 00404810
004A005B xor eax, eax
004A005D mov al, byte ptr [ebp-5] ; 前面邮箱的累加结果
004A0060 xor eax, 12BFD54 ; 异或 0x12BFD54
004A0065 mov edx, dword ptr [4B60F4] ; 指向一个全局变量
004A006B mov dword ptr [edx], eax ; 给变量赋初始值
004A006D xor eax, eax
004A006F mov dword ptr [ebp-10], eax
004A0072 /mov eax, dword ptr [ebp-4] ; 指向密码表
004A0075 |call 00404AD0
004A007A |call 004030E8 ; ★重要CALL-->获取一个数[与上面的全局变量值有关,进去看]
004A007F |inc eax
004A0080 |mov edx, dword ptr [ebp-4] ; 指向密码表
004A0083 |mov al, byte ptr [edx+eax-1] ; 根据eax的结果从密码表中查表获取字符传送到al
004A0087 |mov byte ptr [ebp-11], al
004A008A |cmp byte ptr [ebp-11], 2D ; -
004A008E |je short 004A0072
004A0090 |cmp byte ptr [ebp-11], 30 ; 0
004A0094 |je short 004A0072
004A0096 |cmp byte ptr [ebp-11], 4F ; O
004A009A |je short 004A0072
004A009C |cmp byte ptr [ebp-11], 20 ; 空格
004A00A0 |je short 004A0072
004A00A2 |cmp byte ptr [ebp-11], 2E ; .
004A00A6 |je short 004A0072 ; 对获取的字符进行过滤~~如果为上面五种字符则跳过,重新选取,直到符合条件为止
004A00A8 |lea eax, dword ptr [ebp-18]
004A00AB |mov dl, byte ptr [ebp-11] ; 下面是保存符合条件的字符
004A00AE |call 004049F8
004A00B3 |mov edx, dword ptr [ebp-18]
004A00B6 |mov eax, dword ptr [ebp-C]
004A00B9 |call 00404AD8
004A00BE |mov eax, dword ptr [ebp-C]
004A00C1 |mov eax, dword ptr [ebp-C]
004A00C4 |mov eax, dword ptr [eax] ; 符合条件的字符的个数~~
004A00C6 |call 00404AD0
004A00CB |cmp eax, 13 ; 符合条件的字符串一共是0x13位~
004A00CE \jnz short 004A0072
004A00D0 mov eax, dword ptr [ebp-C]
004A00D3 call 00404D28
004A00D8 mov byte ptr [eax+4], 2D ; KEY[4]替换成-
004A00DC mov eax, dword ptr [ebp-C]
004A00DF call 00404D28
004A00E4 mov byte ptr [eax+9], 2D ; KEY[9]替换成 -
004A00E8 mov eax, dword ptr [ebp-C]
004A00EB call 00404D28
004A00F0 mov byte ptr [eax+E], 2D ; KEY[E]替换成 -
004A00F4 xor eax, eax ; 上面替换之后的就是注册码了~
004A00F6 pop edx
004A00F7 pop ecx
004A00F8 pop ecx
004A00F9 mov dword ptr fs:[eax], edx
004A00FC push 004A0119
004A0101 lea eax, dword ptr [ebp-18]
004A0104 call 00404810
004A0109 lea eax, dword ptr [ebp-4]
004A010C call 00404810
004A0111 retn
004A0112 jmp 00404190
004A0117 jmp short 004A0101
004A0119 pop ebx
004A011A mov esp, ebp
004A011C pop ebp
004A011D retn
{----------------------重要CALL:call 004030E8---------------------}
004030E8 push ebx
004030E9 xor ebx, ebx
004030EB imul edx, dword ptr [ebx+4B4008], 808>; 和全局变量的值相乘后 保存到edx
004030F5 inc edx ; edx+1
004030F6 mov dword ptr [ebx+4B4008], edx ; 继续保存回去
004030FC mul edx ; edx * eax,结果放在edx中
004030FE mov eax, edx ; 保存最终结果,也就是要输出的
00403100 pop ebx
00403101 retn
【算法总结】
1.按字节方式累加邮箱ASCII
2.累加结果 XOR 12BFD54h
3.将XOR的结果作为下一步第一轮的初始值
4.对3步的结果进行查表处理
5.将指定位置的字符串替换成分隔符'-'(注意:不是插入)
6.最终注册码形式:1111-2222-3333-4444
注册信息保存在:[HKEY_LOCAL_MACHINE\SOFTWARE\wuzhihui\ChangeFn]
【算法函数】
.data
szConstTable db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',0
.code
;=================================================
;注册算法:
;1.按字节方式累加邮箱ASCII
;2.累加结果 XOR 12BFD54h
;3.将XOR的结果作为下一步第一轮的初始值
;4.对3步的结果进行查表处理
;5.将指定位置的字符串替换成分隔符'-'(注意:不是插入)
;6.最终注册码形式:1111-2222-3333-4444
;注册信息保存在:[HKEY_LOCAL_MACHINE\SOFTWARE\wuzhihui\ChangeFn]
;=================================================
KeyGen proc uses ecx edx lpEmail:DWORD
LOCAL @szKey[256]:BYTE
LOCAL @bEmaiByte:BYTE
LOCAL @dwTemp:DWORD
invoke RtlZeroMemory,addr @szKey,sizeof @szKey
xor ecx,ecx
xor edx,edx
xor esi,esi
;=============================
;对Email进行计算
invoke lstrlen,lpEmail ;获取Email长度
mov edx,eax ;保存长度
mov cl, 1
mov esi,lpEmail
@@:
xor eax, eax
mov al, cl
mov al, byte ptr [esi+eax-1]
add @bEmaiByte, al
inc cl
dec edx
jnz @B
;=============================
;=============================
;主要获取可视字符过程、查表
mov al,@bEmaiByte
xor eax,12BFD54h
mov @dwTemp, eax
xor esi,esi
@@:
invoke lstrlen,addr szConstTable
xor ebx, ebx
imul edx, dword ptr [@dwTemp], 8088405h
inc edx
mov dword ptr [@dwTemp], edx
mul edx
mov eax,edx
inc eax
mov al,byte ptr [szConstTable+eax-1]
cmp al, 2Dh
je @B
cmp al, 30h
je @B
cmp al, 4Fh
je @B
cmp al, 20h
je @B
cmp al, 2Eh
je @B
mov byte ptr[@szKey+esi],al
inc esi
invoke lstrlen,addr @szKey
cmp eax, 13h
jnz @B
;=============================
;插入分隔符
mov byte ptr [@szKey+4h],2Dh
mov byte ptr [@szKey+9h],2Dh
mov byte ptr [@szKey+0Eh],2Dh
;输出最终注册码
lea eax,@szKey
ret
KeyGen endp
【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢! |
评分
-
查看全部评分
|