- UID
- 35582
注册时间2007-8-28
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
软件名:ItsPersonal 2.9m(见附件)
功能:记录个人日记的软件,具有密码保护、数据加密、拼写检查、搜索、加入图片、为日记条目加入彩色图标、加入符号、输出为RTF格式的文件、打印全部或部分日记等特性。
查壳:无
语言:Borland Delphi 2.0 [Overlay]
===================================================
OD载入程序后,F9运行
然后输入试练码:
iawen
0123456789
弹出出错对话框,不关闭,F12暂停,然后再打开堆栈调用窗口,找到适当的返回地址
向上找到段首下断:
004AA2B0 /. 55 push ebp
004AA2B1 |. 8BEC mov ebp, esp
004AA2B3 |. 33C9 xor ecx, ecx
004AA2B5 |. 51 push ecx
F8单步:
004AA2E5 |. 8D55 EC lea edx, dword ptr [ebp-14]
004AA2E8 |. 8B45 F4 mov eax, dword ptr [ebp-C]
004AA2EB |. 8B80 AC010000 mov eax, dword ptr [eax+1AC]
004AA2F1 |. E8 FEBCF6FF call 00415FF4 ; 取用户名
004AA2F6 |. 8B45 EC mov eax, dword ptr [ebp-14]
004AA2F9 |. 8D55 FC lea edx, dword ptr [ebp-4]
004AA2FC |. E8 B3CEFFFF call 004A71B4
004AA301 |. 8B45 FC mov eax, dword ptr [ebp-4]
004AA304 |. E8 A395F5FF call 004038AC ; 取用户名长度
004AA309 |. 85C0 test eax, eax ; 测试用户名是否为空
004AA30B |. 0F84 56010000 je 004AA467
004AA311 |. 8D55 F8 lea edx, dword ptr [ebp-8]
004AA314 |. 8B45 F4 mov eax, dword ptr [ebp-C]
004AA317 |. 8B80 B0010000 mov eax, dword ptr [eax+1B0]
004AA31D |. E8 D2BCF6FF call 00415FF4 ; 取假码
004AA322 |. 8B45 F4 mov eax, dword ptr [ebp-C]
004AA325 |. 8B88 D0010000 mov ecx, dword ptr [eax+1D0]
004AA32B |. 8B55 F8 mov edx, dword ptr [ebp-8]
004AA32E |. 8B45 FC mov eax, dword ptr [ebp-4]
004AA331 |. E8 5AF0FFFF call 004A9390 ; 关键CALL
004AA336 |. 84C0 test al, al
004AA338 |. 74 12 je short 004AA34C ; 一跳就错,
跟进call 004A9390
--------------------------------------
………………
004A941C |. B9 20000000 mov ecx, 20
004A9421 |. 8B55 F4 mov edx, dword ptr [ebp-C]
004A9424 |. 8B45 FC mov eax, dword ptr [ebp-4]
004A9427 |. E8 88FEFFFF call 004A92B4 ; 生成真正的注册码???
004A942C |. 8D45 F0 lea eax, dword ptr [ebp-10]
注意堆栈,出现可疑字符:
0012F5E4 012662DC ASCII "0123456789"
0012F5E8 01261814 ASCII "iawen"
0012F5EC 01266308 ASCII "RKS-1654279"
跟进call 004A92B4
------------------------------------
………………
004A92FD |. 8B45 FC mov eax, dword ptr [ebp-4]
004A9300 |. E8 E3D3F5FF call 004066E8 ; 将用户名转为大写
…………
004A9313 |. B9 01000000 mov ecx, 1
004A9318 |> 8B45 F4 /mov eax, dword ptr [ebp-C]
004A931B |. 8A4408 FF |mov al, byte ptr [eax+ecx-1] ; 依次取用户名字符的ASCII码到AL
004A931F |. 3C 20 |cmp al, 20 ; 等于0x20即空格时,跳过进行下一个
004A9321 |. 74 0C |je short 004A932F
004A9323 |. 25 FF000000 |and eax, 0FF ; 将EAX高位清0
004A9328 |. 0FAF45 F0 |imul eax, dword ptr [ebp-10] ; 乘以0x11B4(4532)或0x115F(4447)
004A932C |. 48 |dec eax ; 将乘积减去1
004A932D |. 03F0 |add esi, eax ; 将得到的结果累加到ESI
004A932F |> 41 |inc ecx
004A9330 |. 4A |dec edx
004A9331 |.^ 75 E5 \jnz short 004A9318 ; 下一个
004A9333 |> 8D55 EC lea edx, dword ptr [ebp-14]
004A9336 |. 8BC6 mov eax, esi
004A9338 |. E8 FBD6F5FF call 00406A38 ; 将得到的结果转专10进制表示的ASCII码
004A933D |. 8B4D EC mov ecx, dword ptr [ebp-14]
004A9340 |. 8B45 08 mov eax, dword ptr [ebp+8]
004A9343 |. BA 88934A00 mov edx, 004A9388 ; ASCII "RKS-"
004A9348 |. E8 ABA5F5FF call 004038F8 ; 将固定字符拼接到头部
这就是算法的主体了,呵呵,用C来表示如下:
int len=strlen(strName);
int sum=0;
for(int i=0;i<len;i++){
if(strName>='a' && strName<='z')
strName-=32;
int tmp=strName*num1-1;
sum+=tmp;
}
sprintf(strCode,"RKS-%d",sum);
>>>>>>>>>返回
继续单步:
004A9456 |. 8B55 E4 mov edx, dword ptr [ebp-1C]
004A9459 |. 8B45 F0 mov eax, dword ptr [ebp-10]
004A945C |. E8 5BA5F5FF call 004039BC
观察寄存器:
EAX 01266320 ASCII "RKS-1685899"
ECX 00000000
EDX 01266350 ASCII "0123456789"
====================>可以做内存注册机了!
如果细心,应该会发现这个软件是一个用户名对应两个注册码
调用注册码生成函数时,其区别在于对ECX所传递的值:0x10<--------->0x20
而表现在算法上就是:
对用户名每个字符处理时所乘的固定值不同:
0x11B4(4532)<================>0x115F(4447)
eax=00000049
明码比较:
而且注册码就保存在当前目录的IP.INI文件中
程序运行界面:
附件的内容很完整,含编译好的算法注册机及源码,还有内存注册机,呵呵:
ip32_4803.rar
(878.8 KB, 下载次数: 19)
|
评分
-
查看全部评分
|