首页
社区
课程
招聘
nop掉一个MessageBox的疑惑
发表于: 2009-12-18 09:40 11379

nop掉一个MessageBox的疑惑

2009-12-18 09:40
11379
附件是本人自己写的一个CrackMe 然后按钮里面有一个MessageBox,现在想把MessageBox nop掉,可是我nop掉之后  在注册码一栏输入 产生的机器码,程序就会崩溃,而原始的CrackMe不会崩溃,请问是为什么,很疑惑。(备注:不修改MessageBox的后续的代码流程之类,要悄悄的把MessageBox nop掉,轰轰烈烈滴 不要! 而且不要产生什么副作用,eg 崩溃等

说一下我nop的方法,把call MessageBox前的 四个参数(4个push 语句)给nop掉,然后 nop掉 call call MessageBox这句。

说一下这个CrackMe 启动后开了2个线程,相互锁定,反动态调试用的,但是这个按钮里面的代码没有任何的加密。

另外:想学习一下nop掉一般API的一般方法是什么(请分 有返回值的API函数和没返回值的API函数讨论),谢谢~~
简陋的解决了问题,不具有一般性,简陋分析参考 : http://hi.baidu.com/blueapple%5Fc/blog/item/d73cab2ba5272e26d52af134.html


*************在CrackMe区发CM了,所以删除CrackMe的源代码和注册机*********************

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (34)
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
0040266E   /0F85 2D060>jnz     00402CA1     ; 改jmp
2009-12-18 10:01
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
首先说句对不起,我忘记说了,我的意思是不改变MessageBox后续的流程,因为这个是我自己的CrackMe,我还要对后续的代码加密,还要写注册机,所以。。。不好意思我忘记说了
2009-12-18 10:15
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
哥....您真会玩 自己写CM 自己写keygen.........
2009-12-18 10:27
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
我真的不是闲的蛋疼,我要写一个小软件,我想尽量做到简单防破解,呵呵  所以先写个CrackMe练练手,呵呵~
2009-12-18 10:34
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
应该是返回值问题了,message对内存、栈应该有影响的。
2009-12-18 10:44
0
雪    币: 4580
活跃值: (992)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
感觉像是堆栈平衡问题
2009-12-18 10:58
0
雪    币: 120
活跃值: (10)
能力值: ( 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
2009-12-18 12:31
0
雪    币: 260
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
问题结束啦?
2009-12-18 12:41
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不是堆栈平衡问题,你试试在注册码那输入机器码,还不一样出错?
2009-12-18 12:46
0
雪    币: 120
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
保存成文件就不会了
那是另外的问题了
2009-12-18 12:49
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
现在想把MessageBox nop掉,可是我nop掉之后  在注册码一栏输入 产生的机器码,程序就会崩溃,而原始的CrackMe不会崩溃。

保存也照样崩溃,楼主说的就是 在注册码一栏输入 产生的机器码,程序就会崩溃,其实只要是那个长度一样就崩溃。
楼主那样nop是对的,没什么堆栈不平衡。
2009-12-18 12:56
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
造成区别的原因是一个有经过messagebox和一个没经过messagebox,内存、堆栈数据不一样。
2009-12-18 12:58
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
有经过messagebox的0040266E会跳,没经过messagebox的0040266E不跳。
2009-12-18 12:59
0
雪    币: 120
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我这是没问题的。。。。
看来跟机器和系统也有关系。。。
2009-12-18 13:00
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
这个“另外” 能详细点吗?分析下原因也行   我想要达成的目的是 悄悄的nop掉 MessageBox,而且不产生副作用(崩溃 等); 类似我那个简陋的方法,呵呵~
2009-12-18 13:02
0
雪    币: 120
活跃值: (10)
能力值: ( 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 );
以下省略。。。。
2009-12-18 13:05
0
雪    币: 120
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
楼主的这程序内存什么的处理不够好。。。需要优化。。。。
我这第2种改法在OD调试的时候会自动退出,保存后再调正常。。。
2009-12-18 13:12
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=达文西;728713]现在想把MessageBox nop掉,可是我nop掉之后  在注册码一栏输入 产生的机器码,程序就会崩溃,而原始的CrackMe不会崩溃。

保存也照样崩溃,楼主说的就是 在注册码一栏输入 产生的机器码,程序就会崩溃,其实只要是那个长度一样就崩溃。
楼主那样nop是对的,没什么堆栈不平衡。[/QUOTE]

达文西很聪明,理解我的意思, 另外 你讲的 有经过messagebox的0040266E会跳,没经过messagebox的0040266E不跳。  看源代码会明白
好吧我公布源代码和注册机给大家  说明一下,把CrackMe.exe(必须这个名字,名字不一致的请 Rename) 和注册机放同一个目录中,注册机会读CrackMe.exe的MD5码 作为注册码的一小部分验证。
2009-12-18 13:17
0
雪    币: 120
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
00401FE1   .  2BC6          sub     eax, esi
00401FE3   .  3D E8030000   cmp     eax, 3E8
00401FE8   .  77 2A         ja      short 00402014
2009-12-18 13:18
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
21
这样? 那你用我的注册机  试试 能否显示一个注册成功的  MessageBox?
2009-12-18 13:18
0
雪    币: 223
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
(*^__^*) 嘻嘻…… 学习一下
2009-12-18 13:42
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
没事,把参数和CALL都NOP掉就没事了

NOP前


NOP后


NOP后的看附件
上传的附件:
2009-12-18 13:52
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢,下载学习下
2009-12-18 13:58
0
雪    币: 120
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
1111111111111

上传的附件:
  • 1.jpg (11.22kb,49次下载)
2009-12-18 13:59
0
游客
登录 | 注册 方可回帖
返回
//