首页
社区
课程
招聘
用C++编写注册机的一点技巧
2004-11-25 07:38 12413

用C++编写注册机的一点技巧

2004-11-25 07:38
12413
下面是加密算法;
0040105D    895424 14             mov dword ptr ss:[esp+14],edx
00401061    894424 20             mov dword ptr ss:[esp+20],eax
00401065    897C24 1C             mov dword ptr ss:[esp+1C],edi
00401069    8DB426 00000000       lea esi,dword ptr ds:[esi]
00401070    8B6C24 38             mov ebp,dword ptr ss:[esp+38]
00401074    8B4424 14             mov eax,dword ptr ss:[esp+14]               ; 三次循环,十二位注册码,注册码加密之后再进行比较
00401078    8D6C05 00             lea ebp,dword ptr ss:[ebp+eax]
0040107C    0FBE75 00             movsx esi,byte ptr ss:[ebp]                 ; 第一位
00401080    56                    push esi
00401081    8B4C24 20             mov ecx,dword ptr ss:[esp+20]
00401085    E8 16010000           call crackme_.004011A0
0040108A    884424 10             mov byte ptr ss:[esp+10],al
0040108E    0FBE75 01             movsx esi,byte ptr ss:[ebp+1]               ; 第二位
00401092    56                    push esi
00401093    8B4C24 20             mov ecx,dword ptr ss:[esp+20]
00401097    E8 04010000           call crackme_.004011A0
0040109C    884424 11             mov byte ptr ss:[esp+11],al
004010A0    0FBE75 02             movsx esi,byte ptr ss:[ebp+2]               ; 注册码第三位
004010A4    56                    push esi
004010A5    8B4C24 20             mov ecx,dword ptr ss:[esp+20]
004010A9    E8 F2000000           call crackme_.004011A0
004010AE    884424 12             mov byte ptr ss:[esp+12],al
004010B2    0FBE6D 03             movsx ebp,byte ptr ss:[ebp+3]               ; 第四位
004010B6    55                    push ebp
004010B7    8B4C24 20             mov ecx,dword ptr ss:[esp+20]
004010BB    E8 E0000000           call crackme_.004011A0
004010C0    0FBEC0                movsx eax,al
004010C3    894424 18             mov dword ptr ss:[esp+18],eax
004010C7    0FBE4424 11           movsx eax,byte ptr ss:[esp+11]              ; 二位
004010CC    0FB64C24 10           movzx ecx,byte ptr ss:[esp+10]              ; 一位
004010D1    03C9                  add ecx,ecx
004010D3    03C9                  add ecx,ecx
004010D5    8BD0                  mov edx,eax
004010D7    C1FA 04               sar edx,4                                   ; 二位右移位
004010DA    0BCA                  or ecx,edx
004010DC    0FB7D3                movzx edx,bx
004010DF    8B6C24 3C             mov ebp,dword ptr ss:[esp+3C]
004010E3    880C2A                mov byte ptr ds:[edx+ebp],cl                ; 移位这后的数----
004010E6    0FBE4C24 12           movsx ecx,byte ptr ss:[esp+12]              ; 三位
004010EB    C1E0 04               shl eax,4                                   ; 二位
004010EE    8BD1                  mov edx,ecx
004010F0    C1FA 02               sar edx,2
004010F3    0BC2                  or eax,edx
004010F5    8D53 01               lea edx,dword ptr ds:[ebx+1]
004010F8    0FB7D2                movzx edx,dx
004010FB    88042A                mov byte ptr ds:[edx+ebp],al                ; -----
004010FE    C1E1 06               shl ecx,6
00401101    0B4C24 18             or ecx,dword ptr ss:[esp+18]                ; 四位
00401105    8D7B 02               lea edi,dword ptr ds:[ebx+2]
00401108    0FB7C7                movzx eax,di
0040110B    880C28                mov byte ptr ds:[eax+ebp],cl                ; ----
0040110E    8B4424 14             mov eax,dword ptr ss:[esp+14]
00401112    83C0 04               add eax,4
00401115    0FB7C0                movzx eax,ax
00401118    894424 14             mov dword ptr ss:[esp+14],eax
0040111C    83C3 03               add ebx,3
0040111F    0FB77424 40           movzx esi,word ptr ss:[esp+40]
00401124    3BC6                  cmp eax,esi
00401126  ^ 0F8C 44FFFFFF         jl crackme_.00401070
0040112C    8B5424 18             mov edx,dword ptr ss:[esp+18]
00401130    8B4424 20             mov eax,dword ptr ss:[esp+20]               ; Stack ss:[0012F858]=00000002
00401134    8B4C24 38             mov ecx,dword ptr ss:[esp+38]
00401138    0FB77424 40           movzx esi,word ptr ss:[esp+40]
0040113D    885424 13             mov byte ptr ss:[esp+13],dl
------------------------
004011A0    0FBE4424 04           movsx eax,byte ptr ss:[esp+4]
004011A5    83F8 41               cmp eax,41
004011A8    7C 0E                 jl short crackme_.004011B8
004011AA    83F8 5A               cmp eax,5A
004011AD    7F 09                 jg short crackme_.004011B8
004011AF    8D50 BF               lea edx,dword ptr ds:[eax-41]
004011B2    0FB6C2                movzx eax,dl
004011B5    C2 0400               retn 4
004011B8    83F8 61               cmp eax,61
004011BB    7C 0E                 jl short crackme_.004011CB
004011BD    83F8 7A               cmp eax,7A
004011C0    7F 09                 jg short crackme_.004011CB
004011C2    8D50 B9               lea edx,dword ptr ds:[eax-47]
004011C5    0FB6C2                movzx eax,dl
004011C8    C2 0400               retn 4
004011CB    83F8 30               cmp eax,30
004011CE    7C 0E                 jl short crackme_.004011DE
004011D0    83F8 39               cmp eax,39
004011D3    7F 09                 jg short crackme_.004011DE
004011D5    8D50 04               lea edx,dword ptr ds:[eax+4]
004011D8    0FB6C2                movzx eax,dl
004011DB    C2 0400               retn 4
004011DE    83F8 2B               cmp eax,2B
004011E1    74 0A                 je short crackme_.004011ED
004011E3    83F8 2F               cmp eax,2F
004011E6    74 0D                 je short crackme_.004011F5
004011E8    33C0                  xor eax,eax
004011EA    C2 0400               retn 4
004011ED    B8 3E000000           mov eax,3E
004011F2    C2 0400               retn 4
004011F5    B8 3F000000           mov eax,3F
004011FA    C2 0400               retn 4
004011FD    8D76 00               lea esi,dword ptr ds:[esi]
00401200    8B5424 04             mov edx,dword ptr ss:[esp+4]
00401204    8915 EC714100         mov dword ptr ds:[4171EC],edx
0040120A    B8 65000000           mov eax,65
0040120F    50                    push eax
00401210    68 30124000           push crackme_.00401230
00401215    6A 00                 push 0
00401217    50                    push eax
00401218    52                    push edx
00401219    FF15 18314100         call dword ptr ds:[413118]
0040121F    33C0                  xor eax,eax
00401221    C2 1000               retn 10
00401224    8DB6 00000000         lea esi,dword ptr ds:[esi]
----------------------------------->下面是c++程序
#include<iostream.h>
#include<fstream.h>
int change(char b)
{
                 if(b >= 0x41 && b <= 0x5a)  //0-->19
                         b=b-0x41;
                 else if(b >= 0x61 && b <= 0x7a)//1a--->33
                         b=b-0x47;
                 else if(b >= 0x30 && b <= 0x39)//34--->43       3e  3f   
                         b=b+0x4;
                 else if(b==0x2b )
                        b=0x3e;
                 else if(b==0x2f)
                        b=0x3f;
                 else
                         b=0;
                 return b;
}
void main()
{
        char str[12];
         int i,j;
         int change(char b);
         int mima[9];
         int mi[9]={0xa8,0xff,0xbc,0x7c,0xe7,0x89,0x94,0x98,0x00};
         int eax,ecx,edx;//就是这里了,
        for(i=0; i<12; i++)
        {
                cout<<"str["<<i<<"]=";
                cin>>str[i];
        }
        for (i=0, j=0; i<12; i+=4, j+=3)
        {
                 str[i]=change(str[i]);
                 str[i+1]=change(str[i+1]);
                 str[i+2]=change(str[i+2]);
                 str[i+3]=change(str[i+3]);
                 cout<<"    "<<str[i]<<endl;
                 cout<<"    "<<str[i+1]<<endl;
                 cout<<"    "<<str[i+2]<<endl;
                 cout<<"    "<<str[i+3]<<endl;

         eax=str[i+1];
                 ecx=str[i];
                 ecx*=4;
                 edx=eax;
                 edx=edx>>4;
                 ecx=ecx|edx;
                 ecx=ecx&0xff;
                 mima[j]=ecx;
                 cout<<mima[j]<<endl;

                 ecx=str[i+2];
                 eax=eax<<4;
                 edx=ecx;
                 edx=edx>>2;
                 eax=eax|edx;
                 eax=eax&0xff;//相当于mov eax,al
                 mima[j+1]=eax;
                 cout<<mima[j+1]<<endl;
                 
                 ecx=ecx<<6;
                 ecx=ecx|str[i+3];
                 ecx=ecx&0xff;
                 mima[j+2]=ecx;
                 cout<<mima[j+2]<<endl;                 
         }

        ofstream fd("try.txt");
        for(j=0; j<9; j++)
        {
                mima[j]=mima[j]^mi[j];
                fd.setf(ios::hex);
                fd<<mima[j]<<",";
        }

}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (19)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-11-25 08:01
2
0
进行这种计算,我通常用 unsigned long  (或是 DWORD, 固定是32 位)
虽然 int 在这里也是 32 位,但总觉得 dword 比较安全

我?得 int 的?度是以系靳 address bus 的?度??定,不?定是 32 位元。 C++ 我不肯定,如果是 C 就是呃?
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hume 2004-11-25 08:44
3
0
对比一下,看来偶的编程风格就是烂啊....
/*                     __Design By Hume[AfO]__
                  (C)CopyRight SyT0z Corporation.
___________________________________________________________*/
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;

void print_sub_key(unsigned int key,unsigned int rbase)
{
    unsigned char bf[64];
    unsigned char *p;

    key+=rbase;
    sprintf((char *)bf,"%lX",key);

    p=bf;
    for(int j=0;j<strlen((char*)bf);j++,p++) {
        
        if(*p==0x38) *p+=0xA;
        else if(*p==0x42) *p+=0xF6;
    }
    printf("%s\n",bf);
}

void __cdecl main(int argc,char *argv[])
{
    char name[1024];
    unsigned char *p;
    unsigned int tkey,tmgc;

    cout<<"Winxxx version xxxx kegen by Hume"<<endl;
    cout<<"your name:";
    cin.getline(name,1024);
    cout<<"your usable keys are:"<<endl;

    strupr(name);
    p=(unsigned char *)name;
    tkey= 0x47694C;
    for(int i=0;i<strlen(name);i++,p++) {
        
        if(i%14==0) tmgc=0x27;
        tkey+=((unsigned char)(*p))*tmgc;

        if((i+3)%14==0)  tmgc*=7;
        else tmgc*=3;
    }

    if(tkey==0xB8DCDD26) {
        cout<<"sorry this name can't generate keys!"<<endl;
   
    }
   
    print_sub_key(tkey,0);
    print_sub_key(tkey,0x14051948);
    print_sub_key(tkey,0x17061954);
    print_sub_key(tkey,0x10051981);
    print_sub_key(tkey,0x4011995);   
    print_sub_key(tkey,0x2061997);

}
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
windless 2004-11-25 11:00
4
0
仔细研究一下。
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fredcc 2004-11-25 11:06
5
0
呵呵 正在破解一个冬冬的注册码 学习.
雪    币: 333
活跃值: (369)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
FlyToTheSpace 12 2004-11-25 14:18
6
0
最初由 riijj 发布
进行这种计算,我通常用 unsigned long (或是 DWORD, 固定是32 位)
虽然 int 在这里也是 32 位,但总觉得 dword 比较安全

我?得 int 的?度是以系靳 address bus 的?度??定,不?定是 32 位元。 C++ 我不肯定,如果是 C 就是呃?


用unsigned long 我试过,但编译时总是出错,所以只好用了int 。
我是用Visual C++ 6.0 编译的。
雪    币: 489
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NoneName 1 2004-11-25 17:56
7
0
如果原汇编代码用DWORD(无符号),你用INT进行*/等操作时就有可能因为符号位出错.
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
一真 2004-11-26 09:14
8
0
都是高人!但怎么写入程序啊?
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-11-26 16:33
9
0
在vc6里对于有符号整数移位和无符号整数移位是不一样的.
编个程序如下:
int main(int argc, char* argv[])
{
        long a = 55;
        unsigned long b =0xaa;

        a = a << 2;
        b = b << 2;

        a = a >> 2;
        b = b >> 2;

        return 0;
}
再看看反汇编后的代码:
12:       a = a << 2;
00401036   mov         eax,dword ptr [ebp-4]
00401039   shl         eax,2
0040103C   mov         dword ptr [ebp-4],eax
13:       b = b << 2;
0040103F   mov         ecx,dword ptr [ebp-8]
00401042   shl         ecx,2
00401045   mov         dword ptr [ebp-8],ecx
14:
15:       a = a >> 2;
00401048   mov         edx,dword ptr [ebp-4]
0040104B   sar         edx,2
0040104E   mov         dword ptr [ebp-4],edx
16:       b = b >> 2;
00401051   mov         eax,dword ptr [ebp-8]
00401054   shr         eax,2
00401057   mov         dword ptr [ebp-8],eax

可以看出,左移时都是shl,而右移时有符号数是sar,而无符号数是shr.
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-11-26 16:49
10
0
最初由 MengLong 发布
在vc6里对于有符号整数移位和无符号整数移位是不一样的.
编个程序如下:
int main(int argc, char* argv[])
{
long a = 55;
........


很细心  :D
雪    币: 333
活跃值: (369)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
FlyToTheSpace 12 2004-11-26 18:17
11
0
最初由 MengLong 发布
在vc6里对于有符号整数移位和无符号整数移位是不一样的.
编个程序如下:
int main(int argc, char* argv[])
{
long a = 55;
........


谢谢指点!:) :)

你的程序不是用VC6编的吧!
因为我用将你给出的代码,在VC6下面编译出来,
再反汇编,并没找到你给出的汇编指令的地方,

00401036  |.  FF15 04404000       call dword ptr ds:[<&KERNEL32.GetVersion>]      ;  kernel32.GetVersion
0040103C  |.  33D2                xor edx,edx
0040103E  |.  8AD4                mov dl,ah
00401040  |.  8915 A4524000       mov dword ptr ds:[4052A4],edx
00401046  |.  8BC8                mov ecx,eax
00401048  |.  81E1 FF000000       and ecx,0FF
0040104E  |.  890D A0524000       mov dword ptr ds:[4052A0],ecx
00401054  |.  C1E1 08             shl ecx,8
00401057  |.  03CA                add ecx,edx
00401059  |.  890D 9C524000       mov dword ptr ds:[40529C],ecx

雪    币: 333
活跃值: (369)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
FlyToTheSpace 12 2004-11-26 18:53
12
0
请教一下 MengLong 你的程序在VC6下面编译时是怎么配制的呀!
你给出的代码,我在VC6下面编译,用Debug版 编译出来就是149k
用Release 版的,编出来也到了24k,
想要找到那几条关键的指令也是不容易呀!如果变了形也是不知道的呀!:( :(
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-11-26 19:01
13
0
用vc6的调试器,打开反汇编窗口你就可以看到了
vc6的调试器还是很实用的.:D
雪    币: 333
活跃值: (369)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
FlyToTheSpace 12 2004-11-26 19:31
14
0
还是没看到呀!用vc6的调试器,反汇编
跟用ollydbg反汇编也都是一样的呀!:(
没办法,还是找不到喔!
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-11-26 20:32
15
0
呵呵,看来你没用过vc6的调试器.
我抓个图给你看:
第一步:要先在编辑器里下好断点,然后按F5.或点go.程序会在断点处停下.
第二步:选上view->dubmugw windows_->disassenmbly
       然后就可以看见了.

      图在附件中附件:桌面.rar
雪    币: 85519
活跃值: (198845)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2004-11-26 21:05
16
0
支持!!!
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-11-26 22:27
17
0
在原始码的窗口,左边的地方,用鼠标按一下,会有一个红色的圆形记号,表示这一行设了断点

以 debug 编译,运行程序会断在那行
雪    币: 16
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
great1234 2004-11-27 15:05
18
0
最初由 riijj 发布
在原始码的窗口,左边的地方,用鼠标按一下,会有一个红色的圆形记号,表示这一行设了断点

以 debug 编译,运行程序会断在那行


断不断在那跟debug无关,用release编译也可以断下,关键是编译开关
雪    币: 333
活跃值: (369)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
FlyToTheSpace 12 2004-11-28 06:55
19
0
最初由 great1234 发布


断不断在那跟debug无关,用release编译也可以断下,关键是编译开关


这是有关系的呀!如果用release版,那么你设下来的断点就是无效的,
断点是断不下来的,vc6,还这样提醒过哩!
我刚才试过。必需要用debug。:) :)
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
MengLong 6 2004-11-28 17:30
20
0
release版和debug版加载的dll是不一样的.
游客
登录 | 注册 方可回帖
返回