前几天分析的一个东西

Eddy 发布于2011-5-19 12:48:24 分类: 技术心得 已浏览loading 网友评论0条 我要评论

KeyGen(VC6编写)

#include "stdafx.h"
#include 
#include <string>
#include 
#include 
using namespace std;

//定义密钥结构体
typedef struct
{
    DWORD s0;
    DWORD s1;
    DWORD s2;
    DWORD s3;
    DWORD s4;
    DWORD s5;
    DWORD s6;
    DWORD s7;
    DWORD s8;
    DWORD s9;
    DWORD s10;
    DWORD s11;
    DWORD s12;
    DWORD s13;
} key, *pkey;

//修改自IDA
int __stdcall text_101D950(pkey t, int a2)
{
    int result; // eax@12
    DWORD v3; // [sp+0h] [bp-14h]@1
    signed int v4; // [sp+4h] [bp-10h]@1
    unsigned __int8 v5; // [sp+13h] [bp-1h]@1
    int v6; // [sp+8h] [bp-Ch]@1
    int v7; // [sp+Ch] [bp-8h]@1
    
    v3 = (DWORD)t;
    v4 = 0;
    v5 = 0;//key
    v6 = *(DWORD *)((DWORD)t + 12) & 1;
    v7 = *(DWORD *)((DWORD)t + 16) & 1;
    v4 = 0;
    while ( v4 < 8 )
    {
        if ( *(DWORD *)(v3 + 8) & 1 )
        {
            *(DWORD *)(v3 + 8) = *(DWORD *)(v3 + 44) | ((unsigned int)(*(DWORD *)(v3 + 20) ^ *(DWORD *)(v3 + 8)) >> 1);
            if ( *(DWORD *)(v3 + 12) & 1 )
            {
                *(DWORD *)(v3 + 12) = *(DWORD *)(v3 + 48) | ((unsigned int)(*(DWORD *)(v3 + 24) ^ *(DWORD *)(v3 + 12)) >> 1);
                v6 = 1;
            }
            else
            {
                *(DWORD *)(v3 + 12) = *(DWORD *)(v3 + 36) & (*(DWORD *)(v3 + 12) >> 1);
                v6 = 0;
            }
        }
        else
        {
            *(DWORD *)(v3 + 8) = *(DWORD *)(v3 + 32) & (*(DWORD *)(v3 + 8) >> 1);
            if ( *(DWORD *)(v3 + 16) & 1 )
            {
                *(DWORD *)(v3 + 16) = *(DWORD *)(v3 + 52) | ((unsigned int)(*(DWORD *)(v3 + 28) ^ *(DWORD *)(v3 + 16)) >> 1);
                v7 = 1;
            }
            else
            {
                *(DWORD *)(v3 + 16) = *(DWORD *)(v3 + 40) & (*(DWORD *)(v3 + 16) >> 1);
                v7 = 0;
            }
        }
        v5 = (unsigned __int8)((BYTE)v7 ^ (BYTE)v6) | (unsigned __int8)(2 * v5);
        ++v4;
    }
    a2 ^= v5;
    result = a2;
    if ( !result )
    {
        result = v5;
        a2 ^= v5;
    }
    return result;
}


void main(int argc, char* argv[])
{
    pkey pkey1,pkey2;
    key ss,st;
    //初始化KEY
    ss.s0=0x0102D8FC;
    ss.s1=0x78839F60;
    //关键是下面3个值
    ss.s2=0xFFFFFFD3;
    ss.s3=0xFFB31027;
    ss.s4=0xFFAA1856;

    ss.s5=0x80000062;
    ss.s6=0x40000020;
    ss.s7=0x10000002;
    ss.s8=0x7FFFFFFF;
    ss.s9=0x3FFFFFFF;
    ss.s10=0x0FFFFFFF;
    ss.s11=0x80000000;
    ss.s12=0xC0000000;
    ss.s13=0xF0000000;

    st=ss;
    pkey1=&ss;
    pkey2=&st;

    //穷举来算号
    DWORD i=0;
    //输入SN
    string sn;
        cout<<"SN: ";
    cin>>sn;

    //插入0C01
    string constS("0C01");
    sn.insert(5,constS);
    
    //计算各字符之和
    WORD sum=0;
    for (i=0;i    {
        sum+=(int)sn[i];
    }
    
    //在1、3位置插入计算出来的和,这一段写的很挫,估计也只有我看的懂了
    char *ste= new char[3];
    itoa(LOBYTE(sum),ste,16);
    string is(ste);
    is[0]=toupper(is[0]);
    is[1]=toupper(is[1]);
    sn.insert(1,is);
    sn.erase(2,1);
    sn.insert(3,is);
    sn.erase(3,1);

    //穷举出KEY
    string::size_type ii,len;
    string getkey;
    char *t= new char[2];
    int a1,a2,temp;

    len=sn.size();
    for (ii=0;ii    {
        a1=(int)sn[ii];
        temp=0;
        while(TRUE)
        {
            temp++;
            ss=st;//还原
            a2=text_101D950(pkey1,temp);
            if (a1==a2)
            {
                //cout<
                itoa(temp,t,16);
                getkey+=t;
                break;
            }
        }
        st=ss;
    }

    //转大写
    for (string::size_type index = 0; index != getkey.length(); index++)
    {
        getkey[index]=toupper(getkey[index]);
    }
    
    //加入连字符"-"
    string st2;
    for (index = 0; index < getkey.length(); index = index + 4)
    {
        st2+=getkey.substr(index,4) + "-";
    }
    
    delete ste,t;

    //输出最终结果
    cout<<"Key is: "<"V2"
<    
    cin>>sn;
}

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/technique/780.html     欢迎订阅Eddy Blog

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言