飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4293|回复: 6

[原创] ItsPersonal 2.9m算法分析与注册机源码

[复制链接]

该用户从未签到

发表于 2007-12-31 00:19:20 | 显示全部楼层 |阅读模式
软件名: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文件中


程序运行界面:
SpxImage08.gif

附件的内容很完整,含编译好的算法注册机及源码,还有内存注册机,呵呵: ip32_4803.rar (878.8 KB, 下载次数: 19)

评分

参与人数 1威望 +80 飘云币 +40 收起 理由
backboy + 80 + 40 您的贴子很精彩,希望能再次分享!

查看全部评分

PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-31 00:37:59 | 显示全部楼层
学习了,我挺你,占个沙发
PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-31 10:53:23 | 显示全部楼层
下载学习,谢谢!
PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-31 12:04:32 | 显示全部楼层
很详细,学习一下!:victory:
PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-31 12:14:05 | 显示全部楼层
原帖由 iawen 于 2007-12-31 00:19 发表
软件名:ItsPersonal 2.9m(见附件)
功能:记录个人日记的软件,具有密码保护、数据加密、拼写检查、搜索、加入图片、为日记条目加入彩色图标、加入符号、输出为RTF格式的文件、打印全部或部分日记等特性。
查壳: ...

呵呵,真的好全,这才是算法菜鸟的真正要的东西!再次感谢,加分!
PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-31 13:47:52 | 显示全部楼层
谢谢,学习一下下。。。
PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-31 17:42:51 | 显示全部楼层
三刻又,我也来学习一下下。楼主的破文写得相当好。是菜鸟的一大福荫。
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表