首页
社区
课程
招聘
OD破解TraceMe及注册机[原创]
发表于: 2006-3-26 16:18 17424

OD破解TraceMe及注册机[原创]

2006-3-26 16:18
17424

我来写个破文
为什么?听说看雪骗到精是可以上传文件的,我就想骗个精
破解挺容易的,适合新手吧,高手要是看了,不妨指点一下

这是我写的第一编破文,是在看雪发的第二个贴(处女贴昨晚发了,是在破解时遇到2个函数,是软件调试论坛的<<问USER32.wsprintfA和KERNEL32.lstrcmp的功能>>,后来肯了半天msdn)
现在还不能上传,被开刀的是<<加密与解密(第二版)>>第四章的TraceMe,能上传的仁兄帮我上传吧,或者我骗到精后再上传

运行TraceMe,输入用户名wenstory,密码123456789,提示”序列号错误,再来一次”,退出
用peid看一下  显示Microsoft Visual C++ 6.0,应该是没壳吧,我还不会脱壳呢
用刚从论坛下载的OllyDbg1.1打开
按CCDebuger的OllyDBG 入门系列说的,在代码处点右键->查找->所有参考文本字串
开什么玩笑,竟然找不到”序列号错误,再来一次”(我也不知道为什么找不到)
试试函数参考的办法吧
在代码处点右键->查找->当前模块中的名称 (标签),在这里找到USER32.GetDlgItemTextA在这个函数上右击,在弹出菜单上选择“在每个参考上设置断点”,
点击查看->断点,可以看到设置了一个断点在004011A3
这样,断点就设置好了
双击断点,来到004011A3处,发现向下有2个地方调用了GetDlgItemTextA函数,应该是获取用户名和密码的

004011A3   .  8B3D A0404000 mov     edi, [<&USER32.GetDlgItemTextA>] ;  USER32.GetDlgItemTextA
004011A9   .  53            push    ebx
004011AA   .  8D4424 4C     lea     eax, [esp+4C]
004011AE   .  6A 51         push    51                               ; /Count = 51 (81.)
004011B0   .  50            push    eax                              ; |Buffer
004011B1   .  6A 6E         push    6E                               ; |ControlID = 6E (110.)
004011B3   .  56            push    esi                              ; |hWnd
004011B4   .  FFD7          call    edi                              ; \GetDlgItemTextA
004011B6   .  8D8C24 9C0000>lea     ecx, [esp+9C]
004011BD   .  6A 65         push    65                               ; /Count = 65 (101.)
004011BF   .  51            push    ecx                              ; |Buffer
004011C0   .  68 E8030000   push    3E8                              ; |ControlID = 3E8 (1000.)
004011C5   .  56            push    esi                              ; |hWnd
004011C6   .  8BD8          mov     ebx, eax                         ; |
004011C8   .  FFD7          call    edi                              ; \GetDlgItemTextA
004011CA   .  8A4424 4C     mov     al, [esp+4C]
004011CE   .  84C0          test    al, al
004011D0   .  74 76         je      short 00401248
004011D2   .  83FB 05       cmp     ebx, 5
004011D5   .  7C 71         jl      short 00401248
004011D7   .  8D5424 4C     lea     edx, [esp+4C]
004011DB   .  53            push    ebx
004011DC   .  8D8424 A00000>lea     eax, [esp+A0]
004011E3   .  52            push    edx
004011E4   .  50            push    eax
004011E5   .  E8 56010000   call    00401340

而且在2次调用GetDlgItemTextA函数后就有个call    00401340,估计这就是计算密码的地方,这时我将断点移004011E3处,会省去很多麻烦(一直按F7会跳进系统空间,苦不堪言,一直按F8会跳过call    00401340,又要重来),不用怕按错进入系统空间
按F9运行
输入用户名wenstory,密码123456789,按check,停在004011E3处了
按F7单步跟进,来到00401340

00401340  /$  55            push    ebp                ;  保存现场
00401341  |.  8B6C24 0C     mov     ebp, [esp+C]
00401345  |.  56            push    esi
00401346  |.  57            push    edi
00401347  |.  8B7C24 18     mov     edi, [esp+18]      ;  edi为用户名长度
0040134B  |.  B9 03000000   mov     ecx, 3             ;  ecx置3
00401350  |.  33F6          xor     esi, esi           ;  esi清0    esi用于保存运算结果
00401352  |.  33C0          xor     eax, eax
00401354  |.  3BF9          cmp     edi, ecx           ;  将用户名长度与3比较
00401356  |.  7E 21         jle     short 00401379     ;  用户名长度至少4位,少于4位则跳转
00401358  |.  53            push    ebx                ;  用户名长度入栈
00401359  |>  83F8 07       /cmp     eax, 7            ;  405030数组为8位,用于保证下面的ebx取值不要越界
0040135C  |.  7E 02         |jle     short 00401360
0040135E  |.  33C0          |xor     eax, eax          ;  与前2句保证ebx不要越界
00401360  |>  33D2          |xor     edx, edx          ;  edx置0
00401362  |.  33DB          |xor     ebx, ebx          ;  ebx置0
00401364  |.  8A1429        |mov     dl, [ecx+ebp]     ;  取用户名第ecx位
00401367  |.  8A98 30504000 |mov     bl, [eax+405030]  ;  405030的内容应该是数组12,10,19,9,12,11,10,8 ebx取数组第eax位
0040136D  |.  0FAFD3        |imul    edx, ebx          ;  edx为edx(edx的ascii值)乘ebx的值
00401370  |.  03F2          |add     esi, edx          ;  将edx值加到esi
00401372  |.  41            |inc     ecx               ;  ecx自增
00401373  |.  40            |inc     eax               ;  eax自增
00401374  |.  3BCF          |cmp     ecx, edi          ;  用户名从第4位起向后每一位都计算
00401376  |.^ 7C E1         \jl      short 00401359    ;  小于用户名长度时则跳转
00401378  |.  5B            pop     ebx
00401379  |>  56            push    esi                ; /<%ld>
0040137A  |.  68 78504000   push    00405078           ; |Format = "%ld"
0040137F  |.  55            push    ebp                ; |s
00401380  |.  FF15 9C404000 call    [<&USER32.wsprintf>; \wsprintfA
00401386  |.  8B4424 1C     mov     eax, [esp+1C]
0040138A  |.  83C4 0C       add     esp, 0C
0040138D  |.  55            push    ebp                ; /String2
0040138E  |.  50            push    eax                ; |String1
0040138F  |.  FF15 04404000 call    [<&KERNEL32.lstrcm>; \lstrcmpA
00401395  |.  F7D8          neg     eax
00401397  |.  1BC0          sbb     eax, eax
00401399  |.  5F            pop     edi
0040139A  |.  5E            pop     esi
0040139B  |.  40            inc     eax
0040139C  |.  5D            pop     ebp
0040139D  \.  C3            retn
(可以比较一下我现在和昨晚做的注释,顺便提个问题:405030是数组我是猜的,我看到输入不同的用户名这里都不改变,,而且又近着那些提示,有谁能告诉我是如何知道的吗?)
插曲又来了,在<<问USER32.wsprintfA和KERNEL32.lstrcmp的功能>>中我说输入badboy计算得到4601其实是我笔算错误的,算多几次后才发觉是4585

上面的程序看懂就知道密码是怎样生成的了

密码规则:
1   数组k为[12,10,19,9,12,11,10,8]
2   用户名至少4位()
3   密码初始为0
4   从i=3开始到i=name.Length,name[i]的ascii值×k[(i-3)%8]加到密码中

注册机已经做出,使用mfc在.Net下做的
界面
(在word里编辑是图片来的,但我没图片上传权限)
生成密码按钮的代码
void CkeygenForTraceMeDlg::OnBnClickedOk()
{
        UpdateData(true);
        int k[]={12,10,19,9,12,11,10,8};
        int a=name.GetLength();
        int j=0;
        serial=0;
        if(a<4)
                MessageBox("用户名至少4位",MB_OK);
        for(int i=3;i<a;i++)
        {
                serial+=(name[i]*k[j]);
            j++;
                j=j%8;
        }
        UpdateData(false);
}
其中name为第一个编辑框的value   CString name;
Serial为第二个编辑框的value   float serial;

C++程序期待中,因为我懒,想找个人帮我写


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (33)
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
2
两个字----》精彩
2006-3-31 20:39
0
雪    币: 169
活跃值: (245)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
支持原创   整个分析很细很完整!
2006-4-1 19:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很好!!!!!!!!!!!!
2006-4-1 23:28
0
雪    币: 208
活跃值: (42)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
真的拿到一个精华了
好高兴啊
可以上传文件和图片了
继续努力
2006-4-2 00:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习当中
对于算法不是很会,看来还得努力一些
2006-4-2 08:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
晕,发帖重复
2006-4-2 17:09
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持楼主支持楼主支持楼主
2006-4-6 09:13
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主了不起呀,支持你!
2006-4-10 14:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很好  感兴趣
2006-4-10 18:12
0
雪    币: 258
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
支持一个..
2006-4-12 13:10
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
不错,支持
2006-4-12 13:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
dingdingding
2006-4-12 15:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持一下拉拉
2006-4-13 17:46
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
15
2006-4-15 10:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不错,还行!!!!!
2006-4-15 18:24
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习中,支持!
2006-4-18 14:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我是新手,支持一下
2006-4-18 15:25
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 wenstory 发布
真的拿到一个精华了
好高兴啊
可以上传文件和图片了
继续努力


好文章就应该有好奖偿!
2006-4-22 10:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
羡慕ing。。。。。
2006-5-15 16:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不错,不错,现在偶还在加紧时间学汇编..
2006-5-16 11:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
新人报到了哦~~~~,大家关照呀!~~
2006-5-16 14:24
0
雪    币: 10885
活跃值: (3282)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
23
#include <stdio.h>
#include <string.h>
void main()
{

        char *p,s1[100],c;
        unsigned long s[100],temp=0;
           int i=0,k=0;
        printf("Please enter Reg name:");
        c=getchar();
        while(c!='\n')
        {
                s1[i++]=c;
                c=getchar();
        }
        s1[i]='\0';
        if(strlen(s1)<5)
        {
                printf(" The reg name must >4\n");
                return;
        }
        p=s1;
        s[0]=0x0C; //“..... ..序列号错误”对应的asc码
        s[1]=0x0A;//0C 0A 13 09 0C 0B 0A 08 D0 F2 C1 D0 BA C5 B4 ED
        s[2]=0x13;
        s[3]=0x09;
        s[4]=0x0c;
        s[5]=0x0b;
        s[6]=0x0a;
        s[7]=0x08;
        s[8]=0xd0;
        s[9]=0xf2;
        i=3;
        while(i<strlen(s1))
        {
                temp+=*(p+i)*s[k++];
                i++;
                if(k>7)k=0;
        }
        printf("The key is:");
        printf("%ld\n",temp);
}
2006-5-16 16:22
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hjm
24
分析很细很完整!
2006-5-16 17:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
谢谢,学习!
2006-5-16 23:25
0
游客
登录 | 注册 方可回帖
返回
//