Ⅰ 汇编语言问题`基础!高分

1
关系运算符的两个操作数必须是数据,或是统一段内的两个存储单元的地址。进行关系运算后的比较操作后,结果是一个数值,若输出为0 ,则是0FFH或者0FFFFH! 请问输出为0 为什么是后面两个。
--?

2
MOV AL, NOT 0FFH
MOV BL,8CH AND 73H
MOV AH ,8CH OR 73H
MOV CH ,8CH XOR 73H

汇编时 计算表达式形成指令为
MOV AL,0----NOT 0FFH=0
MOV BL,0----8CH AND 73H=0
MOV AH ,0FFH--8CH OR 73H=0FFH
MOV CH ,0FFH--8CH XOR 73H=0FFH

请解释一下第二个程序的每个句子的意思 或结果是怎么来的
8CH AND 73H=0
8CH =1000 1100B AND 0111 0011B,对位相乘,可得0000 0000B
其它的,算法雷同。

3
逻辑运算符与8086指令系统中的指令助记符AND 0R 符号完全相同,但是二者是不会混淆的。
作为MASM的运算符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行计算的。
请问汇编过程和程序执行的区别!
--汇编过程,现在都是利用软件进行。
--早期,是人工查表、计算,把一条条指令的助记符,变成一句句的机器码。

--程序执行,是由 CPU 执行机器码。

4请问 指令、机器码、汇编语言的 异同!
--指令,可以写成机器码,也可以写成助记符,是用来控制 CPU 进行各种操作的。
--汇编语言,是指令、伪指令,各种规则、语法的统称。

Ⅱ 混淆字符串后能破解吗

基础知识
物极必反。我们已经研究了阅读Windows内核的方法,现在开始讨论在 我们自己的驱动编码中采用特殊的编码方法,来简单地防止反汇编阅读。这是有趣的一种事态:一方面我们研究如何阅读别人的(尤其是MS的)代码;另一方面, 我们不得不采取措施保护自己的技术不被他人简单地窃取。
我这里要用到的这种方法不同于加壳或者加密。加壳和加密的方法比较单一,从而容易被人以同样单一的方法整体解密,同时内核驱动中进行加密稍显复杂,难以做 得稳定,而且我手头没有成熟的整体加密的代码。实际上代码如果在运行,则一定必须被解密,因此从内存中得到解密的代码并不困难。所以我并不太倾向于使用加 壳或者加密的方案。
刘涛涛的“扭曲变换”是根本的防止逆向解决方案,但是需要付出巨大的努力才得以实现。
下面的一些方法是比较简单的。这样的做法显然不能完全防止逆向,但是能起到一定的“遮掩”作用。好处是随时可以做,而且可以个人根据代码的重要程度,决定哪些部位做,哪些部位不做。无论有多简陋,有胜于无。
刘涛涛的扭曲变换
由于破解技术的发展,实际上大部分商业软件的合法性验证机制都变成了仅具有装饰性,而且一些难以开发的底层软件的技术细节,往往在发行不久就被人理解并发表在网上。这成为许多开发者厌恶的事(当然另一些开发者则乐于此道)。
于是如何让编译后的机器代码更难以理解就成为一个切实有用的研究方向。编译器有效地优化了代码,但这仅仅是将代码变得更简单。一般地说,简单的东西总是比复杂的要容易理解,虽然和源代码的关系变得模糊了。
国内著名技术牛人刘涛涛在网上发表“扭曲变换”的思想。这个思想和“优化”完全相反,主旨不是让代码更简单、效率更高,而是让代码更加复杂——毫无疑问效率也更低。但是相比技术秘密的泄露,效率的损失其实并不那么重要了。
这种复杂性有着无限的潜力。比如,读者计划一次从北京到上海的旅行,最近的直线航行路线当然只有一条。但是如果想要路线更长更复杂的话,则完全有无限种可 能:你可以先从北京抵达纽约,在纽约休息后前往南极,然后北上到达撒哈拉沙漠,最后再前往上海。复杂的代码使破解者无法找到验证相关代码的所在,也使试图 窃取技术的读者一无所获。
刘涛涛的工具可以将编译后的obj文件进行扭曲,链接后生成的可执行文件变得极难阅读,而且可以反复地执行下去:一段代码可以无限地变大变长——功能却是和原来等价的。这真是不可思议的技术。
技术细节
在代码中,出现了直接字符串是非常不妥的一件事。往往这些常数字符串在反汇编的时候会直接被人看见,对反工程者是最好的引导。
以下的代码都会暴露我们的字符串:
char *str = "mystr";
wchar_t buffer[2] = { L"hello,world."};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,L"hello,world");
隐藏这些常数字符串并不能完全防止逆向工程,但是毫无疑问的是,会给逆向工程增加很多麻烦。
隐藏这些字符串的手法是:在写代码的时候并不写字符串的明文,而是书写密文,总是在使用之前解密。这样的手法的后果是,在静态反汇编的时候,反工程者是看不见字符串的。但是,反汇编者显然会在调试的时候看见字符串。
在调试的时候才看见合法的字符串比静态反汇编的时候看见字符串要麻烦许多,因为一般只有对一段代码有兴趣才去调试它。而之所以对那段代码有兴趣,有些时候是因为看见了感兴趣的字符串。全部跟踪调试所有的代码,是艰巨的任务,只有具有重大价值的目标才值得那样去做。
想保护代码,请首先保密常数字符串。
不过有点要注意的是,你不能把所有的字符串都用同样的一招进行加密,至少不能用相同的密钥;否则,也许一个简单的解密程序就把你所有的字符串恢复为明文了。
考虑:
char *str = "mystr";
改为:
char str[] = { 'm' ^ 0x12, 'y' ^ 0x12, 's' ^ 0x12 ,'t' ^ 0x12,'r' ^ 0x12,'/0' ^ 0x12}
如果认为异或是最简单的加密方法,那么0x12就是这里的密钥。现在编译出来的字符串已经面目全非了,当然,要解密这个字符串需要一个函数。
char *dazeEstr(char *str, char key)
{
char *p = str;
while( ((*p) ^= key) != '/0')
{ p++; }
return str;
}
你可以试试静态反汇编下面的代码:
char *str = { 'm' ^ 0x12, 'y' ^ 0x12, 's' ^ 0x12 ,'t' ^ 0x12,'r' ^ 0x12,'/0' ^ 0x12};
dazeEstr(str,0x12);
printf(str);
当然你通过分析一定会知道printf的结果。调试也可以知道结论,但是比直接用眼睛可以看见可是麻烦多了。当然这样写代码也有些让人抓狂,但是,你总是可以先按自己的本来的习惯写完代码,然后把关键的字符串这样处理。
下面是一个宽字符的处理方法。
wchar_t *dazeEstrW(wchar_t *str, wchar_t key)
{
wchar_t *p = str;
while( ((*p) ^= key) != '/0')
{ p++; }
return str;
}
下面的代码:
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,L"hello,world");
其实总是可以改为:
wchar_t buffer[] = { L"hello,world."};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,buffer);
那么加密的写法是:
wchar_t buffer[] = {
L'h' ^ 0x3a,L'e' ^ 0x3a,L'l' ^ 0x3a,L'l' ^ 0x3a,
L'o' ^ 0x3a,L' ^ 0x3a,'L'w' ^ 0x3a,L'o' ^ 0x3a,
L'r' ^ 0x3a,L'l' ^ 0x3a,L'd' ^ 0x3a,L'.' ^ 0x3a,
L'/0' ^ 0x3a};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,dazeEstrW(buffer,0x3a));
比 较明显的缺陷是书写常数字符串的时候变得麻烦。我一直在追寻更简单的写法,但是遗憾的是,我还没有找到。怎么说呢?如果你觉得隐蔽是值得的,那就这样做。 你甚至可以用更复杂的加密算法,只要你能算出密文,然后填写在代码常数中,不过那样修改代码变得太困难了。如果你能写一个预编译工具自动修改代码,确实是 一个好办法,不过对于一种仅仅防止肉眼直观看到字符串的方式,更复杂的加密方法往往没必要,因为无论多复杂的算法,解密算法都很容易在你自己的代码里找到

Ⅲ 汇编语言 and 和 anl 有什么区别

AND ,ANL,都是逻辑运算的“与”运算指令,区别是:
AND 用于80x86汇编语言,ANL用于是51系列单片机汇编语言。
.
80x86汇编语言“与”运算指令举例:
若AL初值为 00011111b ,
执行 AND AL,10010001 结果,AL=00010001b
.
51系列单片机汇编语言“与”运算指令举例:
若P1口存锁器初值为 11111111b, 累加器A内容为00001111b,
执行 ANL P1,A 结果,P1口存锁器内容为00001111b
.
AND、ANL指令,多用于屏蔽目的操作数的某些位。

Ⅳ 是不是每个硬件都对应一个不同的汇编语言

你把这两个概念搞混淆了。汇编语言是一种比机器语言高级的底层语言,他是面向机器的,通常是为特定的计算机或系列计算机专门设计的。因此,不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性。并不是说每个硬件对应着不用的汇编。而是不同的处理器架构对应不同的汇编指令集。不过换汤不换药,只要你掌握了最基础的,别的也是大同小异的。
希望能帮到你~~

Ⅳ 汇编语言中#20H和#20有什么区别或者说什么时候用#20H,什么时候用#20我有点混淆了。

H是16进制标识

Ⅵ 谁可以发我一个C语言代码混淆工具,如opqcp

可以考虑在sdk程序编译时生成汇编中间结果,然后让人看汇编程序,注意编译时去掉debug选项

Ⅶ Android 反汇编出来的从a 到z 是什么,到底是在包名下的才是主要研究的代码,wps里的类是用来混淆的吗

这个是混淆过的

Ⅷ 汇编指令and or

一般汇编语言,嵌入式系统中都是使用16进制表示,即XXXXH这样的表示方式,我们在进行与和或的过程中,首先将16进制数转化为2进制数,即每一位16进制数分解为4位2进制数,不够四位补足四位,例:
MOV AX,3044H
OR AL,08H
AL=44H=01000100B
08H=00001000B =01001100B=4CH
所以最后的结果为:AL=4CH

Ⅸ 什么软件能将C语言的执行文件反汇编为汇编源代码

可以使用Linux下的objmp命令来反汇编。
常用命令:
objmp -x obj:以某种分类信息的形式把目标文件的数据组成输出;<可查到该文件的的所有动态库>
objmp -t obj:输出目标文件的符号表
objmp -h obj:输出目标文件的所有段概括
objmp -j ./text/.data -S obj:输出指定段的信息(反汇编源代码)
objmp -S obj:输出目标文件的符号表,当gcc -g时打印更明显
objmp -j .text -Sl stack1 | more
-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
-l 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用
使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。
-j name 仅仅显示指定section的信息

Ⅹ 为什么这么多商业Android开发者不混淆代码

代码混淆技术基本原理是使反编译工具反编译出来的代码人难以阅读,从而达到防止被逆向破解的目的。PC上的代码混淆技术已经很成熟,有加花指令、多态变形等技术手法,Android代码混淆技术才刚刚起步,目前已知的技术手法如下。
Java类名、方法名混淆
Dalvik字节码包含了大量的调试信息,如类名、方法名、字段名、参数名、变量名等,使用反编译工具可以还原这些信息。由于类名、方法名等通常都会遵循一定的命名规范,破解者很容易根据这些信息来猜测代码功能,阅读起来就跟查看源代码一样。从Android 2.3开始,Google在SDK中加入了一款叫ProGuard的代码混淆工具,ProGuard会删除这些调试信息,并用无意义的字符序列来替换类名、方法名等,使得使用反编译出来的代码难以阅读,提升逆向难度。使用ProGuard混淆过过后,反编译出来的类名和方法名无法阅读,但是反编译出来的功能代码仍然是非常容易阅读的,和源代码差不多,破解者仍通过阅读功能代码来自行标记类名、方法名等,然后逆向破解。[2]
Java代码混淆
通过对功能代码流程进行乱序混淆,实际运行时乱序混淆后的代码流程却和原始代码流程是一样的,但反编译出来的代码流程静态阅读时与原始流程有很大差异,使破解者很难通过静态分析理解代码功能,从而保护代码不被逆向分析。比如,原始的代码流程是1->2->3->4->5->6->7,经过乱序混淆后静态反汇编查看到的代码流程可能变成2->7->5->1->6->4->3,实际运行时代码流程仍然是1->2->3->4->5->6->7。目前使用这种代码混淆技术的Android保护工具有APKProtect。[1]