WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 2341查看
  • 0回复

主题

好友

604

积分

高级会员

发表于 2009-11-4 11:12:07 |显示全部楼层
作者:romangol

呵呵,见笑了,高手鹿过就好了,新手看

这是一款国产软件,8块钱注册费,随便怎么用都花掉了,还不如支持一下别人的辛苦工作。crack只是为了说明一下明码比较的危险性和写写注册机的分析

拿出OD来,先载入分析,ooops,软件被加密了,拿出PEiD来分析,Aspack2.12,懒了,不想手脱,就用工具解决了

然后再PEiD,Delphi编的,OD载入,查找参考文本字符串,看到“注册成功”,哈哈哈哈,不好意思,来到这个字符串的函数里面004D5168 /. 55         PUSH EBP           // 函数开始

先看看代码。运行几次试试看,说句实话,OD最方便的就是它的直观了,在这个地址上004D51FF |. 0F85 13010000 JNZ 备忘录.004D5318可以很明显的看到,如果不跳转就注册成功了(OD还给你画了箭头的),于是乎,这个地方就可以作为爆破点

倒着往上看,在004D51F7 |. 8B55 FC     MOV EDX,DWORD PTR SS:[EBP-4]下个断点,运行到这里,明码比较就出来了

最后,看注册码算法。
004D5197 |> 8D45 F8     /LEA EAX,DWORD PTR SS:[EBP-8]     // 在这里开始一个循环,估计多半是注册码计算的地方了
004D519A |. 50         |PUSH EAX
004D519B |. 8D55 F4     |LEA EDX,DWORD PTR SS:[EBP-C]
004D519E |. 8B86 08030000 |MOV EAX,DWORD PTR DS:[ESI+308]
004D51A4 |. E8 9F79F7FF   |CALL 备忘录.0044CB48
004D51A9 |. 8B45 F4     |MOV EAX,DWORD PTR SS:[EBP-C]
004D51AC |. E8 A73DF3FF   |CALL 备忘录.00408F58
004D51B1 |. BA 64534D00   |MOV EDX,备忘录.004D5364             ; JYSBKADMBF
004D51B6 |. 0FB6541A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
004D51BB |. 03C2       |ADD EAX,EDX
004D51BD |. B9 3E000000   |MOV ECX,3E
004D51C2 |. 99         |CDQ
004D51C3 |. F7F9       |IDIV ECX
004D51C5 |. 42         |INC EDX
004D51C6 |. B9 01000000   |MOV ECX,1
004D51CB |. B8 78534D00   |MOV EAX,备忘录.004D5378             ; 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
004D51D0 |. E8 D7F5F2FF   |CALL 备忘录.004047AC
004D51D5 |. 8B55 F8     |MOV EDX,DWORD PTR SS:[EBP-8]
004D51D8 |. 8D45 FC     |LEA EAX,DWORD PTR SS:[EBP-4]
004D51DB |. E8 74F3F2FF   |CALL 备忘录.00404554
004D51E0 |. 43         |INC EBX
004D51E1 |. 83FB 0B     |CMP EBX,0B
004D51E4 |.^ 75 B1       \JNZ SHORT 备忘录.004D5197


这里忍不住要做一些猜测,看见
004D51B1 |. BA 64534D00   |MOV EDX,备忘录.004D5364             ; JYSBKADMBF
就觉得应该是一个密钥或者用来做运算的字符串
看见
004D51CB |. B8 78534D00   |MOV EAX,备忘录.004D5378             ; 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
就觉得应该是一张表

运行一下检测我们的猜想,每次运行到如下语句
004D51B6 |. 0FB6541A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
就可以看到依次取的是JYSBKADMBF的每一位字符,用来做如下运算:
004D51BB |. 03C2       |ADD EAX,EDX
004D51BD |. B9 3E000000   |MOV ECX,3E
004D51C2 |. 99         |CDQ
004D51C3 |. F7F9       |IDIV ECX
004D51C5 |. 42         |INC EDX
运行结束之后,注意到EDX的值(即EAX与ECX求余的值)和那张表的关系了么,反正我是撞大运一样的去数了一下,发现果然是用EDX的值来定位选取表中的字符每次得到的字符,就放在[EBP-8]上面,为什么?下面的代码
004D51D5 |. 8B55 F8     |MOV EDX,DWORD PTR SS:[EBP-8]
004D51D8 |. 8D45 FC     |LEA EAX,DWORD PTR SS:[EBP-4]
004D51DB |. E8 74F3F2FF   |CALL 备忘录.00404554
[EBP-8]和[EBP-4]地址明显是两个参数指向的地方,勤奋一点,去那里看看函数运行前后的变化,很容易就发现,每次将[EBP-8]上的字符移到[EBP-4]的上面,而[EBP-4]根据前面找到注册码的地方,可以知道是存放最终注册码的,所以[EBP-8]就是注册码算法每次生成的一位字符的存放地址了

那么我们就可以写出注册算法了hiahia,慢……刚刚的算法里面,每次取的是JYSBKADMBF的一位字符放入EDX,然后和EAX相加,除以ECX求余(恒等于0x3E),可是,EAX的值是什么呢?

运行的时候观察发现EAX是一个16进制数(为什么不是地址或者其他……这个也解释不清,调试多了,就可以看得出地址和数值的差别),用windows计算器转换一下,什么,好眼熟。嘿嘿,原来是机器码吖。OK,所有问题解决,开始写注册机。

/*
    Code by RomanGoliard 9:06 2007-3-9
    KeyGen of Memo 1.0
*/

#include <iostream>

int main()
{
    long machine_code;
    char regcode[20];

    char table[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char key[] = "JYSBKADMBF";
   
    std::cin >> machine_code;
   
    for ( size_t i = 0; i < 10; ++i )
          regcode = table[(machine_code + key) % 0x3e];
   
    std::cout << regcode;
    return 0;
}

结束,希望对初学的人有所帮助。当然,最重要的是,你需要自己去调试。

这款软件在 http://www.wyfei.com可以下载,具体是哪个软件,就不说明了,保护一下作者的权益(虽然网上已经流传了内存注册机)

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-4 00:47 , Processed in 0.063579 second(s), 16 queries .

返回顶部