打开exe后对exe前n个字节加密再存回去,然后改名

解决方案 »

  1.   

    exe要如何加密呢?怕别人用?
    这样很容易,用二进制打开文件,在最后增加一些额外的长度,就不能用了。
    自己要用就将原文件的长度恢复,估计就可以了。文件属性可以通过stat的结构来获得,自己可以通过对结构中间的文件属性进行修改,自然就可以修改了。
      

  2.   

    一种简单的加解密算法(加密之星中的)
    /加密文件算法涵数
    BOOL CEDstarDlg::EncryptFile(CString filename,char *password)
    {
    SetFileAttributes(filename,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL);
    CFile m_file;
    if(m_file.Open(filename,CFile::modeReadWrite|CFile::typeBinary))
    {
    char m_buffer[3001];
    m_file.Read(m_buffer,3000);
    //判断文件头八个字符是否为指定字符,
    //是的话,则是加密过的,不用再加密了。
    if(strncmp(m_buffer,"加密之星",8)==0)
    {
    m_file.Close();
    return false;
    }

    //取头3000字节按位于密码相与,
    //并将其存于文件的未尾处。
    int m_len=strlen(password);
    for(int i=0;i<3000;i++)
    m_buffer[i]^=password[i%m_len];
    m_len=m_file.GetLength();
    m_file.SeekToEnd();
    m_file.Write(m_buffer,3000);        //在加密后的文件开头处设置一特征字符串,
    //并将其它一些重要特征字符于一固定字符
    //串PW相与后,再将其存入文件开头处。
    memset(m_buffer,0,3001);
    strcpy(m_buffer,"加密之星");
    int *data=(int *)&m_buffer[8];
    data[0]=m_len;
    data[1]=strlen(password);
    strcpy((char *)&m_buffer[2*sizeof(int)+8],password);
    int temp=(2*sizeof(int)+8)+strlen(password);
    char * PW="xujingzhou";
    int m_PWlen=strlen(PW);
    for(int j=8;j<= temp;j++)
    m_buffer[j]^=PW[j%m_PWlen];
    m_file.SeekToBegin();
    if(m_len<3000)
    m_file.Write(m_buffer,m_len);
    else
        m_file.Write(m_buffer,3000); m_file.Close();

    return true;
    }
    return false;
    }//解密文件算法涵数
    BOOL CEDstarDlg::DecryptFile(CString filename,char *password)
    {
    SetFileAttributes(filename,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL);
     
    CFile m_file;
    if(m_file.Open(filename,CFile::modeReadWrite|CFile::typeBinary))
    {
    char m_buffer[3001];
    memset(m_buffer,0,3001);
    m_file.Read(m_buffer,3000);
    //判断文件头八个字符是否为加密后指定特征字
    //符串,是的话,则是加密过的,可以解密了,
    //否则就不能解密。
    if(strncmp(m_buffer,"加密之星",8)!=0)
    {
    m_file.Close();
    return FALSE;
    }
    //计算出特征字后其它一些重要字节的长度,
            //并将其解密后,与指定密码比较,判断是
            // 否相同。
    int temp=(2*sizeof(int)+8)+strlen(password);
    char * PW="xujingzhou";
    int m_PWlen=strlen(PW);
            for(int j=8;j<=temp;j++)
    m_buffer[j]^=PW[j%m_PWlen];
    int *data=(int *)&m_buffer[8];
    int m_len=data[1];
    if((m_len!=(int)strlen(password)) || (strcmp((char *)&m_buffer[8+2*sizeof(int)],password)!=0))
    {
    m_file.Close();
    return FALSE;
    } //从加密后的文件未尾处取出3000字节,
    //将解密后,重写入文件开头处既可。
    m_len=data[0];
    long m_pos=m_file.Seek(-3000,CFile::end);
    int  m_number=m_file.Read(m_buffer,3000);
    int  m_passlen=strlen(password);
    for(int i=0;i<3000;i++)
    m_buffer[i]^=password[i%m_passlen];
    m_file.SeekToBegin();
    m_file.Write(m_buffer,3000);
    m_file.SetLength(m_len);
    m_file.Close(); return TRUE;
    }
    return FALSE;
    }