能力值:
(RANK:10 )
|
-
-
2 楼
最初由 iamcrackin 发布 任务一:去掉NAG 任务二:跟出算法
你他妈的从看雪论坛滚出去吧,你这个垃圾。
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
楼上兄弟……
void tem(char *InPutBuf)
{
//处理输入的注册码
//注册码必须为数字。如果输入的注册码种有非数字的,过滤掉
char *pSNIn,*pSNOut;
pSNIn=pSNOut=InPutBuf;
char tmp;
while(*pSNIn)
{
if((*pSNIn >'9') || (*pSNIn <'0'))
{
pSNIn++;
continue;
}
*pSNOut=*pSNIn-'0';
pSNOut++;
pSNIn++;
}
}
void reg2(unsigned char *pSN)
{
tem((char *)pSN);
int SNLen=strlen((char *)pSN);
if (SNLen==0)
return;
DWORD eax=0,ebx=0;
for(int i=0;i<SNLen;i++)
{
eax = (eax << 3) + ((eax << 1) + pSN[i]);
}
if(eax==0x3039)
printf("ss");//Registered
}
|
能力值:
( LV10,RANK:170 )
|
-
-
4 楼
Done!
No-Nag.
ps:2楼应该还在精神病院接受治疗的啊,怎么跑出来了?看雪兄先来封下号吧。。
|
能力值:
(RANK:10 )
|
-
-
5 楼
郁闷 呵呵 你们2个就吵吧
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
这个的NAG要怎么去掉啊,,,高手交下
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
BY LEON
004013E8 /$ 55 push ebp
004013E9 |. 8BEC mov ebp, esp
004013EB |. 56 push esi
004013EC |. 8B75 08 mov esi, dword ptr [ebp+8] //取注册码位数放进ESI
004013EF |. 8BFE mov edi, esi // ESI的值传递给edi
004013F1 |. 33C0 xor eax, eax // eax清0
004013F3 |> 8A06 /mov al, byte ptr [esi] // 取第1个注册码放进al
004013F5 |. 46 |inc esi esi+1
004013F6 |. 84C0 |test al, al //与自己做异或运算
004013F8 |. 75 09 |jnz short 00401403 //不等于就跳到00401403
004013FA |. 90 |nop
004013FB |. 90 |nop
004013FC |. 90 |nop
004013FD |. 90 |nop
004013FE |. 8807 |mov byte ptr [edi], al
00401400 |. 5E |pop esi
00401401 |. 5D |pop ebp
00401402 |. C3 |retn //返回到 0040141D
00401403 |> 3C 39 |cmp al, 39 // 比较和39所对应的ASCII码
00401405 |.^ 7F EC |jg short 004013F3 // 大于往上跳,取第2个注册码继续,依次循环。
00401407 |. 2C 30 |sub al, 30 //减去30
00401409 |.^ 72 E8 |jb short 004013F3 // 小于往上跳,取第2个注册码,依次循环
0040140B |. 8807 |mov byte ptr [edi], al //把al存起来
0040140D |. 47 |inc edi edi+1
0040140E \.^ EB E3 \jmp short 004013F3 直接跳到004013F3
00401410 /$ 55 push ebp
00401411 |. 8BEC mov ebp, esp
00401413 |. 56 push esi
00401414 |. 8B75 0C mov esi, dword ptr [ebp+C]
00401417 |. 56 push esi ; /Arg1
00401418 |. E8 CBFFFFFF call 004013E8 ; \nagoya.004013E8
0040141D |. 83C4 04 add esp, 4 esp+4
00401420 |. 56 push esi ; /String //压进了01,02,03,04,05,06等字符,就是注册码位数有几个,把第1个变成01,第2个成02,如注册码:123,压的字符就是01,02,03,注册码是:789456,压的注册码就是01,02,03,04,05,06 0x是根据注册码位数定的。
00401421 |. E8 0B010000 call <jmp.&KERNEL32.lstrlen> ; \lstrlenA // 再取注册码位数放进eax
00401426 |. 85C0 test eax, eax //与自己做异或运算,等于就往失败去了
00401428 |. 74 19 je short 00401443 //如果跳就完了
上面这段程序是要验证注册码为数字。不然跳到失败。
0040142A |. 90 nop
0040142B |. 90 nop
0040142C |. 90 nop
0040142D |. 90 nop
0040142E |. 8BC8 mov ecx, eax //把假注册码位数放进ecx,做LOOP的计数器(前面00401421说了,eax=注册码位数)。
00401430 |. 33C0 xor eax, eax //eax清0
00401432 |. 33DB xor ebx, ebx //ebp清0
00401434 |> /D1E0 /shl eax, 1 //算术左移动1位 =MUL eax,2 //相当于eax*2
00401436 |. |8BD8 |mov ebx, eax //把eax放入ebx
00401438 |. |D1E0 |shl eax, 1 //算术左移动1位 =MUL eax,2 //相当于eax*2
0040143A |. |D1E0 |shl eax, 1 //算术左移动1位 =MUL AL,2 //相当于eax*2
0040143C |. |021E |add bl, byte ptr [esi] //bl加01,就是前面压进的字符一个一个加,ebx+1,第2次加02
0040143E |. |03C3 |add eax, ebx //ebx+eax结果放进eax
00401440 |. |46 |inc esi esi+1
00401441 |.^\E2 F1 \loopd short 00401434 //从00401434的地方开始循环每次ecx-1,到0停止,把本次的计算结果设为B
00401443 |> 8B75 08 mov esi, dword ptr [ebp+8]
00401446 |. 8906 mov dword ptr [esi], eax //这里运算的结果是1E240,把运算结果存起来
00401448 |. 5E pop esi
00401449 |. 5D pop ebp
0040144A \. C3 retn //跳到00401247
注册码是:注册码是数字,然后按照注册码的位数前加0,变成0x的形式,把bl+0x的值给bl(ebx),ebx+eax的值给eax,循环(注册码有几个循环几次),把本次计算结果设成B,B和16位的3039(十进制的12345)比较,相等就向成功,不然就失败。
万能注册码是12345,这个程序根本没有对用户名进行计算。
00401247 |. 83C4 08 add esp, 8 //esp+8
0040124A |. A1 25214000 mov eax, dword ptr [402125]
0040124F |. 3D 39300000 cmp eax, 3039 //比较是不是等于十进制的12345
00401254 |. 74 0B je short 00401261 //等于跳到成功
00401256 |. 90 nop
00401257 |. 90 nop
00401258 |. 90 nop
00401259 |. 90 nop
0040125A E8 08020000 call 00401467 //不等于失败的对话框就出来了。
0040125F |.^ EB 95 jmp short 004011F6
00401261 |> E8 E5010000 call 0040144B //成功的对话框。
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
4楼的去掉NAG后,固定注册码12345就不存在了...
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
NAG 怎去除。
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
OD一开就可以看到这个!这里创建了程序窗口。
0040109D |. 6A 00 PUSH 0 ; /lParam = NULL
0040109F |. FF35 74204000 PUSH DWORD PTR DS:[402074] ; |hInst = NULL
004010A5 |. 6A 00 PUSH 0 ; |hMenu = NULL
004010A7 |. 6A 00 PUSH 0 ; |hParent = NULL
004010A9 |. 68 00800000 PUSH 8000 ; |Height = 8000 (32768.)
004010AE |. 68 00800000 PUSH 8000 ; |Width = 8000 (32768.)
004010B3 |. 6A 6E PUSH 6E ; |Y = 6E (110.)
004010B5 |. 68 B4000000 PUSH 0B4 ; |X = B4 (180.)
004010BA |. 68 0000CF00 PUSH 0CF0000 ; |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU|WS_THICKFRAME|WS_CAPTION
004010BF |. 68 84204000 PUSH nagoya.00402084 ; |Exercise 2
004010C4 |. 68 8F204000 PUSH nagoya.0040208F ; |ASMCLASS32
004010C9 |. 6A 00 PUSH 0 ; |ExtStyle = 0
004010CB |. E8 E9030000 CALL <JMP.&USER32.CreateWindowExA> ; \CreateWindowExA
看手册:http://www.pediy.com/tutorial/chap6/Chap6-1-2.htm 可以找到触发NAG窗口的程序
0040115F |> \6A 00 PUSH 0 ; /lParam = NULL
00401161 |. 68 5E134000 PUSH nagoya.0040135E ; |DlgProc = nagoya.0040135E
00401166 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401169 68 B3204000 PUSH nagoya.004020B3 ; NagScreen
0040116E |. FF35 74204000 PUSH DWORD PTR DS:[402074] ; |hInst = NULL
00401174 |. E8 4C030000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
鼠标停到 0040115F |> \6A 00 PUSH 0 ; /lParam = NULL
OD会提示你在 0040113D 调用了NAG显示,在这里做处理,使本应显示NAG窗口的位置,显示为NAG退出后的结果,也就是真是窗口,继续看NAG窗口那段代码。
0040115F |> \6A 00 PUSH 0 ; /lParam = NULL
00401161 |. 68 5E134000 PUSH nagoya.0040135E ; |DlgProc = nagoya.0040135E
00401166 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401169 68 B3204000 PUSH nagoya.004020B3 ; NagScreen
0040116E |. FF35 74204000 PUSH DWORD PTR DS:[402074] ; |hInst = 00400000
00401174 |. E8 4C030000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401179 83F8 02 CMP EAX,2 ; 确定 被点击
0040117C 74 1F JE SHORT nagoya.0040119D ; 跳往处理事件 0040119D
0040119D |> 6A 00 PUSH 0 ; /ExitCode = 0
0040119F |. |E8 6F030000 CALL <JMP.&USER32.PostQuitMessage> ; \PostQuitMessage
004011A4 |. |B8 00000000 MOV EAX,0
004011A9 |. |EB 4B JMP SHORT nagoya.004011F6 ; NAG窗口关后将执行的命令。
在这个CrackME中干掉NAG就是要 0040113D 不触发NAG窗口而是直接去触发NAG窗口关闭后的动作,也就是改为:
0040113D /0F84 B3000000 JE nagoya.004011F6
搞定。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
Ollydbg载入
0040115F 6A 00 PUSH 0
把PUSH 0改为jmp 004013E1
可是原来code 为12345
改后name为12345了
没搞明白
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
2楼的估计是个疯子 呵呵
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
要去nag改一步就可以:
0040113D JE 004011F6 ; 以前的代码为je short 0040115f
在没去nag之前,注册时检测code,code必须为12345开头后面可以接其非1-9的字符,name不用检测
在没去nag之后,注册时检测name,name必须为12345开头后面可以接其非1-9的字符,code不用检测
算法都是一样,仔细的上面几位也解释了,主要如下:
0040142E MOV ECX,EAX ; ECX=EAX
00401430 XOR EAX,EAX ; EAX=0,CF=0;(自身xor运算结果为0,CF=0)
00401432 XOR EBX,EBX ; EBX=0,CF=0;(自身xor运算结果为0,CF=0)
00401434 /SHL EAX,1 ; SHL EAX<<0x1 //移出的数据进入标志位CF
00401436 |MOV EBX,EAX ; EBX=EAX
00401438 |SHL EAX,1 ; SHL EAX<<0x1 //移出的数据进入标志位CF
0040143A |SHL EAX,1 ; SHL EAX<<0x1 //移出的数据进入标志位CF
0040143C |ADD BL,BYTE PTR DS:[ESI]
0040143E |ADD EAX,EBX ; EAX=EAX+EBX;
00401440 |INC ESI ; ESI++
00401441 \LOOPD SHORT 00401434 ;
简单表示为公式:y=10*y+key[i],根据
0040124F CMP EAX,3039
00401254 JE SHORT 00401261
我们知道,公式的结果y必须为0x3039(十进制12345),所以结果为为12345开头,后面可以接其非1-9的字符(因为后面的非1-9的字符程序会除掉)
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
0040115F |> \6A 00 PUSH 0 ; NOP
00401161 |. 68 5E134000 PUSH nagoya.0040135E ; NOP
00401166 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; NOP
00401169 |. 68 B3204000 PUSH nagoya.004020B3 ; NOP
0040116E |. FF35 74204000 PUSH DWORD PTR DS:[402074] ; NOP
00401174 |. E8 4C030000 CALL <JMP.&USER32.DialogBoxParamA> ; NOP
00401179 |. 83F8 02 CMP EAX,2 NOP
0040117C /74 1F JE SHORT nagoya.0040119D NOP掉就去NAG!哈哈~~~
0040117D 90 NOP
0040117E |. 90 NOP
0040117F |. 90 NOP
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
看不明白,学习中
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
我要发 CM 啊,可是可恶的 20 贴,什么时候才到期啊
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
无言的感谢!
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
感谢10楼提供的方法
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
0040113D jz short loc_40115F nag消除
00401254 jz short loc_401261 注册消除
|