永发信息网

代码段 bool x=false,y=false,z=false; z=!(x!=y)||(y=

答案:2  悬赏:80  手机版
解决时间 2021-03-08 03:42
  • 提问者网友:疯孩纸
  • 2021-03-07 19:12
代码段
bool x=false,y=false,z=false;
z=!(x!=y)||(y==z)
中,

(x!=y)的结果是true???
为什么
z到底是等于true||true 还是false || true
最佳答案
  • 五星知识达人网友:西风乍起
  • 2021-03-07 20:21
程序不好破解,还有程序中的数据保密性较强。。。一般病毒、黑客和加密程序才这么做吧。。。常规程序好像没有这么写的。。。
而且这种做法只能用汇编来完成,其他高级语言都会分段。
给你举个例子。。。
在C语言中:
char *p = "123";
printf(p);
这两行代码经过编译后,"123"这个数据就会被放置于数据段中,而printf(p)则存在于代码段。程序执行后会在控制台输出"123"。

char p[10];
strcpy(p, "123");
printf(p);
这三行代码经过编译后,p[10]会在内存中开辟空间并将地址放置于数据段中,"123"也将存在于数据段中,strcpy和printf将存在于代码段中。程序执行后会在控制台输出"123"。

在汇编语言中:
.....
mov edi, $ ;这行代码的意思就是将EIP寄存器的内容写入EDI,$代表当前指令的EIP
nop
nop
nop
nop
mov ptr byte [edi], '1'
mov ptr byte [edi+1], '2'
mov ptr byte [edi+3], '3'
mov ptr byte [edi+4], 0
push edi
call ....
...
这几行汇编中存在常量"123",程序运行后在控制台输出"123",但是却没有数据段。当程序执行完一大堆的nop之后,接下去的指令将常量"123"动态的写入从"mov edi, $"指令开始的3个字节的空间,并将原指令替换掉了,所以其常量存在于代码段。

.....
mov edi, $
nop
nop
nop
nop
...
...
push edi
call ....
...
这几行汇编代码中,当程序执行到push edi之前的指令时,相当于在代码段中开辟了N个字节的空间(N = 多少个nop + "mov edi, $“的长度),通过向[edi]中写入数据,即相当于strcpy。而这N个字节的数据储存空间也存在于代码段。

由上面的不难看出,如果数据段要和代码段合并,则必须通过指令动态的在代码段中分配相应的储存空间,分配后写入数据,便会将源指令替换掉。换句话说,这种代码只能执行一次,若第二次执行,操作系统就会发出CPU遇到无效指令的错误。
当然,你也可以把空间分配到永远不可能执行到的指令处,比如:
...
jmp xxxx
_MemoryStart:
mov edi, $
jmp _EntryContinue
nop
nop
nop
...
nop
_MemoryEnd:
...
这样一来,你只需要在程序启动时,使用指令jmp _MemoryStart来分配空间,当程序返回到_EntryContinue的时候把edi的内容保存一下,那么你就可以永久使用[edi]中的空间了。因为在_MemoryStart之前有一个无条件跳转,所以无论在什么情况下代码执行到此处都会自动跳转到xxxx处,除非是用jmp指令直接跳转到_MemoryStart。。。。但是这样你要完全正确的搞定xxxx所指的地址。而且这个程序没有任何的兼容性可言,在WinXP SP1下能正常工作,但在SP2、SP3、Vista、Win7下就有可能无法工作了。
希望能解决您的问题。
全部回答
  • 1楼网友:你哪知我潦倒为你
  • 2021-03-07 20:48
期待看到有用的回答!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯