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

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

2004-11-25 07:38
13232

下面是加密算法;


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


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

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

我?得 int 的?度是以系靳 address bus 的?度??定,不?定是 32 位元。 C++ 我不肯定,如果是 C 就是呃?
2004-11-25 08:01
0
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
对比一下,看来偶的编程风格就是烂啊....
/*                     __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);

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

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


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


很细心  :D
2004-11-26 16:49
0
雪    币: 333
活跃值: (374)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
11
最初由 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

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

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

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

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


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


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


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