• 标 题:飞跃英语Ⅳ(3千字)
  • 作 者:stuman
  • 时 间:2003-2-25 16:08:06
  • 链 接:http://bbs.pediy.com

第二个小东东是个小程序,是破解《飞跃英语Ⅳ》遗留下来的一个东东,价值不大,不过扔掉又可惜,所以就顺便贴上来吧。另外对我来说也是有点纪念意义的。
《飞跃英语Ⅳ》是我最后的一个破解,这套软件包含《我爱背单词2001》、《泛读》、《百部速读》等一系列程序,加密原理都一样,主程序用VB5,接口C写的DLL,另外有一个驻留进程不断和飞跃网站联系核对注册码。如果检测到盗版注册码就在硬盘和注册表里写入标记并要求联网再注册。破解也是有两种方法:1、去掉驻留进程和程序自效验,用已知的注册码注册,或者爆破。2、跳过注册对话框,去掉所有限制(就是根本不注册但有注册版本的功能)。这个软件加密还可以,花了我两个礼拜的时间才分析透,笔记一大叠。由于和作者联系并交流过加密和解密的技巧,所以也就不方便写出来了。
下面的程序和破解无关。因为《泛读》、《百部速读》的文档加密,所以不能添加自己喜欢的文章到软件中读。我跟踪了程序,找到加密原理,它是根据一个密码表进行字节的XOR,所以是可逆的。我写了解码程序,下面的这两个密码表是共享版的,零售版不同,但都能在程序相同的位置上找到。不过后来我嫌他的程序不能放大/缩小窗口、也不能一行一行移动,就自己写了一个功能类似的程序用,下面的程序也就再也没用过了。只贴出来交流一下。用TC2写和编译,是对以前流行TC时代的怀念。

#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>

void main( void )
{
    FILE    *fpIn,    *fpOut;
    char    szInName[100],szOutName[100];
    char    cChar;
    char    szCode1[0x38]={                        //密码表1,解码泛读系列。从W32Dasm的反编译文件中拷贝过来的(1000e030)
            0x17, 0x0E, 0x1A, 0x7B, 0x4F, 0xDF, 0x93, 0x0E,
            0x3A, 0x1A, 0xE8, 0x2E, 0x58, 0xC1, 0x2C, 0x1B,
            0x34, 0x5A, 0xCF, 0x0A, 0x57, 0x19, 0xF9, 0xB1,
            0xDC, 0xAF, 0x17, 0x84, 0x21, 0x2D, 0xBB, 0x9C,
            0x20, 0x9C, 0x22, 0xE8, 0xBD, 0x9C, 0xB7, 0xA7,
            0x16, 0x16, 0x21, 0x1B, 0x21, 0xF4, 0xBC, 0xA5,
            0x86, 0x1B, 0x3A, 0x62, 0x2D, 0xE0, 0xB2, 0x4E};
    char    szCode2[0x38]={                        //密码表2,解码百部速读系列。从W32Dasm的反编译文件中拷贝过来的(1000e068)
            0x7B, 0x3A, 0xE2, 0x17, 0xB3, 0x17, 0x2F, 0xD6,
            0x9E, 0xE2, 0x20, 0x92, 0xBC, 0x5D, 0x90, 0x07,
            0xFC, 0xBE, 0xCF, 0xD2, 0xBB, 0x7D, 0x31, 0x4D,
            0x14, 0x4B, 0x7B, 0x20, 0xE9, 0x91, 0x57, 0x38,
            0x84, 0x38, 0xEA, 0x20, 0x59, 0x38, 0x53, 0x43,
            0xDE, 0x7A, 0xE9, 0xE3, 0xE9, 0x2C, 0x58, 0x41,
            0x22, 0x7F, 0x9E, 0xC6, 0x59, 0x22, 0x4E, 0x4E};
    char    *pCh1,*pCh2;
    char    *szCode;

    szCode=szCode1;                                //定义它则解码泛读系列
//    szCode=szCode2;                                //定义它则解码百部速读系列

    printf("Input in  file name:");                //取原文件
    gets( szInName );
    if (*szInName==0x0)
        exit(0);
    printf("Input out file name:");                //取转化后文件
    gets( szOutName );
    if (*szOutName==0x0)
        exit(0);
    
    fpIn=fopen( szInName,"rb" );                //打开原文件
    if ( ! fpIn )
    {
        printf("Can not open %s\n",szInName);
        exit(0);
    }
    fpOut=fopen( szOutName,"wb" );                //创建转化后文件
    if ( ! fpOut )
    {
        printf("Can not create %s\n",szOutName);
        fclose(fpIn);
        exit(0);
    }

    pCh2=szCode+0x38;                            //pCh2指向密码表最后一个字符的下一位
    while ( true )
    {
        for ( pCh1=szCode; pCh1<pCh2; pCh1++ )//逐字节解码
        {
            if ( feof(fpIn) )                    //如果结束
            {
                fclose(fpIn);
                fclose(fpOut);
                printf("success");
                exit(0);
            }
            cChar=fgetc(fpIn);                    //得到字符
            cChar ^= *pCh1;                        //xor解码
            fputc(cChar,fpOut);                    //写入解码字符
        }
    }
}