iawen 发表于 2007-12-31 00:19:20

ItsPersonal 2.9m算法分析与注册机源码

软件名:ItsPersonal 2.9m(见附件)
功能:记录个人日记的软件,具有密码保护、数据加密、拼写检查、搜索、加入图片、为日记条目加入彩色图标、加入符号、输出为RTF格式的文件、打印全部或部分日记等特性。
查壳:无
语言:Borland Delphi 2.0

===================================================
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
004AA2E8|.8B45 F4       mov   eax, dword ptr
004AA2EB|.8B80 AC010000 mov   eax, dword ptr
004AA2F1|.E8 FEBCF6FF   call    00415FF4                         ;取用户名
004AA2F6|.8B45 EC       mov   eax, dword ptr
004AA2F9|.8D55 FC       lea   edx, dword ptr
004AA2FC|.E8 B3CEFFFF   call    004A71B4
004AA301|.8B45 FC       mov   eax, dword ptr
004AA304|.E8 A395F5FF   call    004038AC                         ;取用户名长度
004AA309|.85C0          test    eax, eax                         ;测试用户名是否为空
004AA30B|.0F84 56010000 je      004AA467
004AA311|.8D55 F8       lea   edx, dword ptr
004AA314|.8B45 F4       mov   eax, dword ptr
004AA317|.8B80 B0010000 mov   eax, dword ptr
004AA31D|.E8 D2BCF6FF   call    00415FF4                         ;取假码
004AA322|.8B45 F4       mov   eax, dword ptr
004AA325|.8B88 D0010000 mov   ecx, dword ptr
004AA32B|.8B55 F8       mov   edx, dword ptr
004AA32E|.8B45 FC       mov   eax, dword ptr
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
004A9424|.8B45 FC       mov   eax, dword ptr
004A9427|.E8 88FEFFFF   call    004A92B4         ;生成真正的注册码???
004A942C|.8D45 F0       lea   eax, dword ptr

        注意堆栈,出现可疑字符:
        0012F5E4   012662DCASCII "0123456789"
        0012F5E8   01261814ASCII "iawen"
        0012F5EC   01266308ASCII "RKS-1654279"


跟进call    004A92B4
------------------------------------
………………
004A92FD|.8B45 FC       mov   eax, dword ptr
004A9300|.E8 E3D3F5FF   call    004066E8      ;将用户名转为大写
…………
004A9313|.B9 01000000   mov   ecx, 1
004A9318|>8B45 F4       /mov   eax, dword ptr
004A931B|.8A4408 FF   |mov   al, byte ptr       ;依次取用户名字符的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          ;乘以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
004A9336|.8BC6          mov   eax, esi
004A9338|.E8 FBD6F5FF   call    00406A38                         ;将得到的结果转专10进制表示的ASCII码
004A933D|.8B4D EC       mov   ecx, dword ptr
004A9340|.8B45 08       mov   eax, dword ptr
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
004A9459|.8B45 F0       mov   eax, dword ptr
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文件中


程序运行界面:


附件的内容很完整,含编译好的算法注册机及源码,还有内存注册机,呵呵:

网络断魂 发表于 2007-12-31 00:37:59

学习了,我挺你,占个沙发

pw2000 发表于 2007-12-31 10:53:23

下载学习,谢谢!

backboy 发表于 2007-12-31 12:04:32

很详细,学习一下!:victory:

backboy 发表于 2007-12-31 12:14:05

原帖由 iawen 于 2007-12-31 00:19 发表 https://www.chinapyg.com/images/common/back.gif
软件名:ItsPersonal 2.9m(见附件)
功能:记录个人日记的软件,具有密码保护、数据加密、拼写检查、搜索、加入图片、为日记条目加入彩色图标、加入符号、输出为RTF格式的文件、打印全部或部分日记等特性。
查壳: ...
呵呵,真的好全,这才是算法菜鸟的真正要的东西!再次感谢,加分!

51357l 发表于 2007-12-31 13:47:52

谢谢,学习一下下。。。

(_鬼谷子 发表于 2007-12-31 17:42:51

三刻又,我也来学习一下下。楼主的破文写得相当好。是菜鸟的一大福荫。
页: [1]
查看完整版本: ItsPersonal 2.9m算法分析与注册机源码