首页
社区
课程
招聘
一点难以启齿的问题~
发表于: 2005-8-10 22:42 7831

一点难以启齿的问题~

2005-8-10 22:42
7831
附件:crackme.rar

这个是 BCG 早期的 会员认证 Crackme ~
我好后悔,我要是早点过来,不也能进 BCG 啦~

可惜~
分析下算发吧~

004010C3    .  50               push eax                           ;  取用户名
004010C4    .  E8 67050000      call crackme.00401630
004010C9    .  59               pop ecx                            ;
004010CA    .  8945 D8          mov dword ptr ss:[ebp-28],eax      ;  
004010CD    .  8D95 E4FEFFFF    lea edx,dword ptr ss:[ebp-11C]     ;  edx=注册蚂
004010D3    .  52               push edx
004010D4    .  E8 57050000      call crackme.00401630
004010D9    .  59               pop ecx
004010DA    .  68 EAB04000      push crackme.0040B0EA
004010DF    .  E8 4C050000      call crackme.00401630
004010E4    .  59               pop ecx
004010E5    .  68 0EB14000      push crackme.0040B10E
004010EA    .  E8 41050000      call crackme.00401630
004010EF    .  59               pop ecx
004010F0    .  837D D8 03       cmp dword ptr ss:[ebp-28],3
004010F4    .  7E 7B            jle short crackme.00401171         ;  用户名大于三
004010F6    .  33C9             xor ecx,ecx
004010F8    .  33D2             xor edx,edx
004010FA    .  33DB             xor ebx,ebx
004010FC    .  33C0             xor eax,eax
004010FE    .  837D D8 32       cmp dword ptr ss:[ebp-28],32
00401102    .  7D 69            jge short crackme.0040116D         ;  小雨50,不然给你好看
00401104    >  0FBE840D 48FFFFF>movsx eax,byte ptr ss:[ebp+ecx-B8] ;  依次去用户名
0040110C    .  41               inc ecx
0040110D    .  33C1             xor eax,ecx                        ;  eax=eax+i
0040110F    .  03D8             add ebx,eax                        ;  ebx=ebx+eax
00401111    .  3B4D D8          cmp ecx,dword ptr ss:[ebp-28]      ;  循环取用户名 next i
00401114    .^ 75 EE            jnz short crackme.00401104
00401116    .  69C0 56030000    imul eax,eax,356                   ;  eax=eax*356
0040111C    .  C1E3 08          shl ebx,8       左移8为 等于 乘以 FF
0040111F    .  C1E8 08          shr eax,8       右移8位 (明白但是不知道改怎么解释好!)
00401122    .  90               nop
00401123    .  90               nop
00401124    .  03C3             add eax,ebx                        ;  eax=eax+ebx
00401126    .  8945 C8          mov dword ptr ss:[ebp-38],eax      ;  zhi 写入到 eb--38
00401129    .  FF75 C8          push dword ptr ss:[ebp-38]         ; /Arg3
0040112C    .  68 38B44000      push crackme.0040B438              ; |Arg2 = 0040B438 ASCII "%lX"
00401131    .  8D8D 80FEFFFF    lea ecx,dword ptr ss:[ebp-180]     ; |
00401137    .  51               push ecx                           ; |Arg1
00401138    .  E8 873D0000      call crackme.00404EC4              ; \crackme.00404EC4
0040113D    .  83C4 0C          add esp,0C
00401140    .  8D85 80FEFFFF    lea eax,dword ptr ss:[ebp-180]
00401146    .  50               push eax         看到这里你也知道注册码是什么了吧
00401147    .  8D95 E4FEFFFF    lea edx,dword ptr ss:[ebp-11C]     ; |
0040114D    .  52               push edx                           ; |String1
0040114E    .  E8 339C0000      call <jmp.&KERNEL32.lstrcmpA>      ; \lstrcmpA  好像是以字符输入吧
00401153    .  85C0             test eax,eax

00401155    . /75 0D            jnz short crackme.00401164
00401157    . |68 3CB44000      push crackme.0040B43C              ; /Text = "革命已然成功,加入BCG后更需努力 ^_^"
0040115C    . |56               push esi                           ; |hWnd
0040115D    . |E8 289B0000      call <jmp.&USER32.SetWindowTextA>  ; \SetWindowTextA
00401162    . |EB 18            jmp short crackme.0040117C
00401164    > \68 90B44000      push crackme.0040B490
00401169    .  56               push esi
0040116A       E8               db E8
0040116B       1B               db 1B
0040116C    .  9B               wait
0040116D    .  0000             add byte ptr ds:[eax],al
0040116F    .  EB 0B            jmp short crackme.0040117C
00401171    >  68 C9B44000      push crackme.0040B4C9              ; /Text = "注册名必须在4个字符以上,50个字符以下!"
00401176    .  56               push esi                           ; |hWnd
00401177    .  E8 0E9B0000      call <jmp.&USER32.SetWindowTextA>  ; \SetWindowTextA

有余本人第一次玩算法分析。加上自己编程有不会,马马虎虎用 VB 硬着头皮屑垃~

l=len(user)         取用户名长度

if 50>L>3 then      用户名 在3-50之间

for i=1 to l
m=asc(mid(user,i,1))
m=m+i
key1=key1+m
next i

下面的我就不会翻译了,那位高手用VB 教我一点好了~

现在的 EBX =Key1

shl ebx,8         (假设他运算的结果是十六进制 p1)
现在的 Key2 =eax

   shr eax,8       (假设他运算的结果是十六进制 p2)

   sn=p1+p2          (注册码就是 p1+p2)

丢人吧~
算法都分析出来了,但是不会写程序,晕~。
指点下来~

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

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
支持一下   
2005-8-11 09:33
0
雪    币: 109
活跃值: (498)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
3
最初由 riijj 发布
支持一下


汗~

怎么一点帮助都没告诉我阿

还说支持我~
2005-8-11 11:11
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
如果是那个keyfile的话,网上分析很多的,baidu或者google一下
2005-8-11 11:13
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
5
最初由 cater 发布


汗~

怎么一点帮助都没告诉我阿
........


你不会写程序来实现算法,我没有办法帮你,我不能在这里教你写程序

唯有你找教程看看
2005-8-11 11:21
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
用VB来写这个注册码比较不好写,用刘建英的注册机编写器来写更简单。
.const

.data
szHomePage db "http://www.365hz.net",0
szEmail    db "mailto:ljyljx@163.com",0
szErrMess  db "输入的序列号不正确!",0
lpszStrBuff db 50 dup(0)
lpszStrFormat db "%lX",0


.code
invoke lstrlen,eax
cmp eax,3
jle _endtable
cmp eax,32h
jge _endtable
mov edi,eax
mov esi,1
xor ebx,ebx
_table1:
mov eax,offset hInput1
movzx eax,BYTE ptr [eax+esi-1]
test al,al
jz _Ntable2
xor eax,esi
add ebx,eax
inc esi
jmp _table1
_Ntable2:
imul eax,eax,356h
shl ebx,8
shr eax,8
add eax,ebx
invoke wsprintf,addr lpszStrBuff,addr lpszStrFormat,eax
lea eax,lpszStrBuff
_endtable:
2005-8-11 12:54
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
这个crackme不算是很难,输入用户名和序列号的,没办法,水平有限,难的也搞不了,大家将就一下。先拿od载入,粗跟了一下,大致流程如下:

输入用户名和序列号----》某种算法key=f(name)----》判断---》if(key==序列号)setwindowtext(“革命已然成功”)
else setwindowtext(“革命尚未成功”)



由于od没有串式参考(我是没找到),所以我用wdasm找到“革命已然成功”串的位置,运气好而已,赶上这个crackme里有串式参考,地址是
401157,然后用od打开,到该位置,得到如下代码
00401140 . 8D85 80FEFFFF LEA EAX,DWORD PTR SS:[EBP-180]
00401146 . 50 PUSH EAX ; /String2
00401147 . 8D95 E4FEFFFF LEA EDX,DWORD PTR SS:[EBP-11C] ; |
0040114D . 52 PUSH EDX ; |String1
0040114E . E8 339C0000 CALL ; \lstrcmpA
00401153 . 85C0 TEST EAX,EAX
00401155 . 75 0D JNZ SHORT bcg.00401164
00401157 . 68 3CB44000 PUSH bcg.0040B43C ; /Text = "革命已然



成 功, 加入BCG后更需努力 ^_^"
0040115C . 56 PUSH ESI ; |hWnd
0040115D . E8 289B0000 CALL



;\SetWindowTextA
00401162 . EB 18 JMP SHORT bcg.0040117C
00401164 68 90B44000 PUSH bcg.0040B490
00401169 56 PUSH ESI
0040116A E8 1B9B0000 CALL




很显然[ebp-180](eax)和[ebp-11c](edx)中一个是我们输入的序列号,一个是根据算法生成的序列号,实验得知,eax中的值 就是真实序列号的地址,如果想知道单个name的序列号,那
简单了,直接在40114e下断,然后观察eax和edx的值就可以了,不过我们要进一步,要得到他的算法,进而做出注册机,好,
继续,往上看



00401104 > 0FBE840D 48FFF>MOVSX EAX,BYTE PTR SS:[EBP+ECX-B8] ;从该地址



; 取值(其实就是我们输入的name)
0040110C . 41 INC ECX ;用户名字符的位置
0040110D . 33C1 XOR EAX,ECX ;用户名第i个字符与位置i xor
0040110F . 03D8 ADD EBX,EAX ;垒加
00401111 . 3B4D D8 CMP ECX,DWORD PTR SS:[EBP-28] ;[ebp-28]是用户名



;的长度,规定要大于4小于50
00401114 .^75 EE JNZ SHORT bcg.00401104
00401116 . 69C0 56030000 IMUL EAX,EAX,356
0040111C . C1E3 08 SHL EBX,8
0040111F . C1E8 08 SHR EAX,8
00401122 . 90 NOP
00401123 . 90 NOP
00401124 . 03C3 ADD EAX,EBX



从上边可以看出,这其实就是f的算法,最后把key的值存在eax,不过这里是16进制的数,而非ascii,所以要进行转换,代码我就不列了,
我跟过,是用eax的值不断的对10h取mod,把各位分离出来,然后,若0~9,则加30,若a~f,则加A然后加fd就得到最后的ascii的key了当然我们也可以做个简单的修改,让程序自己告诉我们key,看第一片代码,401164,在ctrl+g到那里,呵呵,这里原来是“革命失败”的地方,ok,就改这里,还记得刚才,哪个寄存器放着正确的key吗?对了,是eax,我们只要在401164那里选择2进制编辑,填充68 B0 F7 12 00就好了,
其实就是PUSH EAX了,我不用解释了吧?效果如图



下面给出注册算法
#include



void main()
{
printf("input your name:");
char a[50];
int i=0x0, size;
long b=0x0, buf ;
gets(a);
while(a!='\0')
{
i++;
}
size=i;
if(size<4 || size>50)
{
printf("the sizeof name must be");
gets(a);
}
for(i=0; i {
a=a^(i+1);
b=a+b;
}
buf=a[i-1];
buf=buf*0x356;
b=b<<8;
buf=buf>>8;
buf=buf & 0x00ffffff;
b=b+buf;



printf("key=%X\n", b);
}

网上拉来的,将就着看吧~
2005-8-12 09:24
0
雪    币: 109
活跃值: (498)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
8
在这里还是要谢谢大家拉~

不过注册机我已经做好了~
唉~

我的第一次算法分析和注册机编写~

对于左移 用乘法就搞定了
对于右移 除法搞定!

嘿嘿~

至于 其他语言编写,我会加紧学习的,我也知道VB没有前途的~
临时用下好啦~

Dim m As String

Private Sub Command1_Click()
l = Len(Text1.Text)

If 50 > l And l > 3 Then

For i = 1 To l
m = Mid(Text1.Text, i, 1)
a = Asc(m)
a = a Xor i
key1 = key1 + a
Next i
p1 = key1 * 2 ^ 8
t = i - 1

p2 = Int(a * 854 / 2 ^ 8)
sn = Hex(p1 + p2)
Text2.Text = sn
Else
MsgBox "请检查用户名是否在 3-50 之间!", vbOKOnly, "注意"
End If
End Sub

附件:VB keygen(以及VB 代码).rar
2005-8-12 11:34
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
还以为是每月来一次的问题。
现在BCG也比较落后了,进了也没啥。
2005-8-12 15:56
0
雪    币: 109
活跃值: (498)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
10
最初由 CoreWar 发布
还以为是每月来一次的问题。
现在BCG也比较落后了,进了也没啥。


啊?
怎么能这么说啊~
2005-8-12 16:17
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
     
2005-8-13 07:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
顶,这个爆破太easy了,用W32Dasm两分钟搞定
2005-8-18 19:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
yx_cwy
2A7A7
2005-10-18 14:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
高手......努力学习
2005-11-4 09:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
用VC比较好写,见注册机代码

#include "stdio.h"
#include "string.h"

void main()
{
        char name[50];
        printf("input your name:");
        scanf("%s",name);

        int ecx=0,ebx=0,eax=0;

        for (int i=0;i<strlen(name);i++)
        {
                eax=name[ecx];
                ecx++;
                eax=eax^ecx;
                ebx=ebx+eax;
        }
        eax=eax*0x356;
        ebx=ebx<<8;
        eax=eax>>8;
    eax=eax+ebx;
        printf("\nYour regcode is:%lX\n\n",eax);
}
2005-11-5 18:44
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
收到,学习.........
2005-11-6 11:45
0
游客
登录 | 注册 方可回帖
返回
//