能力值:
( LV2,RANK:10 )
|
-
-
2 楼
0040266E /0F85 2D060>jnz 00402CA1 ; 改jmp
|
能力值:
( LV9,RANK:610 )
|
-
-
3 楼
首先说句对不起,我忘记说了,我的意思是不改变MessageBox后续的流程,因为这个是我自己的CrackMe,我还要对后续的代码加密,还要写注册机,所以。。。不好意思我忘记说了
|
能力值:
( LV6,RANK:80 )
|
-
-
4 楼
哥....您真会玩 自己写CM 自己写keygen.........
|
能力值:
( LV9,RANK:610 )
|
-
-
5 楼
我真的不是闲的蛋疼,我要写一个小软件,我想尽量做到简单防破解,呵呵 所以先写个CrackMe练练手,呵呵~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
应该是返回值问题了,message对内存、栈应该有影响的。
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
感觉像是堆栈平衡问题
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
就是堆栈平衡问题
这么做:
1.
004024D5 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
004024D7 . 8B46 20 mov eax, dword ptr [esi+20] ; |
004024DA . 68 70764000 push 00407670 ; |Title = "wocaocaocaocaocaocao"
004024DF . 68 5C764000 push 0040765C ; |Text = "有本事",B0,"盐襫op掉?,BD,"?,A1,""
004024E4 . 50 push eax ; |hOwner
004024E5 . 897424 28 mov dword ptr [esp+28], esi ; |
004024E9 . FF15 64524000 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
把上面的这几句都nop掉
2.
004024E9 FF15 64524000 call dword ptr [<&USER32.MessageBoxA>>; user32.MessageBoxA
改为:
004024E9 83C4 10 add esp, 10
004024EC 90 nop
004024ED 90 nop
004024EE 90 nop
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
问题结束啦?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
不是堆栈平衡问题,你试试在注册码那输入机器码,还不一样出错?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
保存成文件就不会了
那是另外的问题了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
现在想把MessageBox nop掉,可是我nop掉之后 在注册码一栏输入 产生的机器码,程序就会崩溃,而原始的CrackMe不会崩溃。
保存也照样崩溃,楼主说的就是 在注册码一栏输入 产生的机器码,程序就会崩溃,其实只要是那个长度一样就崩溃。
楼主那样nop是对的,没什么堆栈不平衡。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
造成区别的原因是一个有经过messagebox和一个没经过messagebox,内存、堆栈数据不一样。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
有经过messagebox的0040266E会跳,没经过messagebox的0040266E不跳。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
我这是没问题的。。。。
看来跟机器和系统也有关系。。。
|
能力值:
( LV9,RANK:610 )
|
-
-
16 楼
这个“另外” 能详细点吗?分析下原因也行 我想要达成的目的是 悄悄的nop掉 MessageBox,而且不产生副作用(崩溃 等); 类似我那个简陋的方法,呵呵~
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
看作者的代码:
v51 = -1;
v52 = sub_4045C6;
v53 = a1;
v5 = a2;
v37 = *(HWND *)(a2 + 32);
v54 = a2;
MessageBoxA(v37, "有本事把我nop掉呀!", "wocaocaocaocaocaocao", 0); // 这句nop掉会影响下文??第2种做法才有点影响
byte_4071B4 = 96;
sub_401C60(0, 0, 0, 0);
sub_401CA0(0, 0, 0, 0);
sub_401C50(10);
v3 = 0;
v2 = 0;
v4 = 0;
do
v3 += sub_401C50(v4++);
while ( v4 < 786 );
sub_401C50(v3);
v6 = 0;
do
v2 += sub_401C50(v6++);
while ( v6 < 45 );
sub_401C50(v2);
v7 = 45;
do
v2 += sub_401C50(v7++);
while ( v7 < 786 );
以下省略。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
楼主的这程序内存什么的处理不够好。。。需要优化。。。。
我这第2种改法在OD调试的时候会自动退出,保存后再调正常。。。
|
能力值:
( LV9,RANK:610 )
|
-
-
19 楼
[QUOTE=达文西;728713]现在想把MessageBox nop掉,可是我nop掉之后 在注册码一栏输入 产生的机器码,程序就会崩溃,而原始的CrackMe不会崩溃。
保存也照样崩溃,楼主说的就是 在注册码一栏输入 产生的机器码,程序就会崩溃,其实只要是那个长度一样就崩溃。
楼主那样nop是对的,没什么堆栈不平衡。[/QUOTE]
达文西很聪明,理解我的意思, 另外 你讲的 有经过messagebox的0040266E会跳,没经过messagebox的0040266E不跳。 看源代码会明白
好吧我公布源代码和注册机给大家 说明一下,把CrackMe.exe(必须这个名字,名字不一致的请 Rename) 和注册机放同一个目录中,注册机会读CrackMe.exe的MD5码 作为注册码的一小部分验证。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
00401FE1 . 2BC6 sub eax, esi
00401FE3 . 3D E8030000 cmp eax, 3E8
00401FE8 . 77 2A ja short 00402014
|
能力值:
( LV9,RANK:610 )
|
-
-
21 楼
这样? 那你用我的注册机 试试 能否显示一个注册成功的 MessageBox?
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
(*^__^*) 嘻嘻…… 学习一下
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
没事,把参数和CALL都NOP掉就没事了
NOP前
NOP后
NOP后的看附件
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
谢谢,下载学习下
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
1111111111111
|
|
|