当前位置:首页 » 操作系统 » aam算法

aam算法

发布时间: 2022-05-10 12:50:18

㈠ 电容器AAM7.3-200-1W的容量如何计算

这是什么电容器呢,电容器的容量通常都会在本体上打印的
东莞市科尼盛电子有限公司
王雷答

㈡ 谢谢你的回答,请问汇编中BCD调整指令如何计算,比如AAD

你这个AX=0106H答案是错的 AX应该是 0060H
因为 ADD这个指令是在做除法前调整 AH, AL寄存器的值,它是把两个数的BCD值组成一个十进制值,组成的公式 AL =AH*10 +AL =9*10+6=96 ;AH=00
96的16进制60H
所以此时AX应该说是 0060H

㈢ 求用matlab实现的AAM算法的代码

正在找这个,麻烦给我发下吧,[email protected] ,谢谢了……

㈣ 谁能帮我在pudn上下载AAM算法代码吗

http://yunpan.cn/cmz3pQnKedhiE (提取码:f4e9)

㈤ 求WPE在武林外传的用法

怎么截获一个游戏的封包? 怎么去检查游戏服务器的ip地址和端口号?

Internet用户使用的各种信息服务,其通讯的信息最终均可以归结为以IP包为单位的信息传送,IP包除了包括要传送的数据信息外,还包含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之间可以通过路由协议来进行路由信息的交换,从而更新路由表。

那么我们所关心的内容只是IP包中的数据信息,我们可以使用许多监听网络的工具来截获客户端与服务器之间的交换数据,下面就向你介绍其中的一种工具:WPE。

WPE使用方法: 执行WPE会有下列几项功能可选择:

SELECT GAME 选择目前在记忆体中您想拦截的程式,您只需双击该程式名称即可。

TRACE 追踪功能。用来追踪撷取程式送收的封包。 WPE必须先完成点选欲追踪的程式名称,才可以使用此项目。 按下Play键开始撷取程式收送的封包。 您可以随时按下 | | 暂停追踪,想继续时请再按下 | | 。 按下正方形可以停止撷取封包并且显示所有已撷取封包内容。 若您没按下正方形停止键,追踪的动作将依照OPTION里的设定值自动停止。 如果您没有撷取到资料,试试将OPTION里调整为Winsock Version 2。 WPE 及 Trainers 是设定在显示至少16 bits 颜色下才可执行。

FILTER 过滤功能。用来分析所撷取到的封包,并且予以修改。

SEND PACKET 送出封包功能。能够让您送出假造的封包。

TRAINER MAKER 制作修改器。

OPTIONS 设定功能。让您调整WPE的一些设定值。

FILTER的详细教学

- 当FILTER在启动状态时 ,ON的按钮会呈现红色。 - 当您启动FILTER时,您随时可以关闭这个视窗。FILTER将会保留在原来的状态,直到您再按一次 on / off 钮。 - 只有FILTER启用钮在OFF的状态下,才可以勾选Filter前的方框来编辑修改。 - 当您想编辑某个Filter,只要双击该Filter的名字即可。

NORMAL MODE:

范例:

当您在 Street Fighter Online 〔快打旋风线上版〕游戏中,您使用了两次火球而且击中了对方,这时您会撷取到以下的封包: SEND-> 0000 08 14 21 06 01 04 SEND-> 0000 02 09 87 00 67 FF A4 AA 11 22 00 00 00 00 SEND-> 0000 03 84 11 09 11 09 SEND-> 0000 0A 09 C1 10 00 00 FF 52 44 SEND-> 0000 0A 09 C1 10 00 00 66 52 44

您的第一个火球让对方减了16滴〔16 = 10h〕的生命值, 而您观察到第4跟第5个封包的位置4有10h的值出现,应该就是这里了。

您观察10h前的0A 09 C1在两个封包中都没改变,可见得这3个数值是发出火球的关键。

因此您将0A 09 C1 10填在搜寻列〔SEARCH〕,然后在修改列〔MODIFY〕的位置4填上FF。如此一来,当您再度发出火球时,FF会取代之前的10,也就是攻击力为255的火球了!

ADVANCED MODE:

范例: 当您在一个游戏中,您不想要用真实姓名,您想用修改过的假名传送给对方。在您使用TRACE后,您会发现有些封包里面有您的名字出现。假设您的名字是Shadow,换算成16进位则是〔53 68 61 64 6F 77〕;而您打算用moon〔6D 6F 6F 6E 20 20〕来取代他。 1) SEND-> 0000 08 14 21 06 01 04 2) SEND-> 0000 01 06 99 53 68 61 64 6F 77 00 01 05 3) SEND-> 0000 03 84 11 09 11 09 4) SEND-> 0000 0A 09 C1 10 00 53 68 61 64 6F 77 00 11 5) SEND-> 0000 0A 09 C1 10 00 00 66 52 44

但是您仔细看,您的名字在每个封包中并不是出现在相同的位置上

- 在第2个封包里,名字是出现在第4个位置上 - 在第4个封包里,名字是出现在第6个位置上

在这种情况下,您就需要使用ADVANCED MODE - 您在搜寻列〔SEARCH〕填上:53 68 61 64 6F 77 〔请务必从位置1开始填〕 - 您想要从原来名字Shadow的第一个字母开始置换新名字,因此您要选择从数值被发现的位置开始替代连续数值〔from the position of the chain found〕。 - 现在,在修改列〔MODIFY〕000的位置填上:6D 6F 6F 6E 20 20 〔此为相对应位置,也就是从原来搜寻栏的+001位置开始递换〕 - 如果您想从封包的第一个位置就修改数值,请选择〔from the beginning of the packet〕

了解一点TCP/IP协议常识的人都知道,互联网是将信息数据打包之后再传送出去的。每个数据包分为头部信息和数据信息两部分。头部信息包括数据包的发送地址和到达地址等。数据信息包括我们在游戏中相关操作的各项信息。那么在做截获封包的过程之前我们先要知道游戏服务器的IP地址和端口号等各种信息,实际上最简单的是看看我们游戏目录下,是否有一个SERVER.INI的配置文件,这个文件里你可以查看到个游戏服务器的IP地址,比如金庸群侠传就是如此,那么除了这个我们还可以在DOS下使用NETSTAT这个命令,

NETSTAT命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。或者你可以使用木马客星等工具来查看网络连接。工具是很多的,看你喜欢用哪一种了。

NETSTAT命令的一般格式为: NETSTAT [选项]

命令中各选项的含义如下: -a 显示所有socket,包括正在监听的。 -c 每隔1秒就重新显示一遍,直到用户中断它。 -i 显示所有网络接口的信息。 -n 以网络IP地址代替名称,显示出网络连接情形。 -r 显示核心路由表,格式同"route -e"。 -t 显示TCP协议的连接情况。 -u 显示UDP协议的连接情况。 -v 显示正在进行的工作。

三:怎么来分析我们截获的封包?

首先我们将WPE截获的封包保存为文本文件,然后打开它,这时会看到如下的数据(这里我们以金庸群侠传里PK店小二客户端发送的数据为例来讲解):

第一个文件: SEND-> 0000 E6 56 0D 22 7E 6B E4 17 13 13 12 13 12 13 67 1B SEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9B SEND-> 0000 E6 56 1E F1 29 06 17 12 3B 0E 17 1A SEND-> 0000 E6 56 1B C0 68 12 12 12 5A SEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12 SEND-> 0000 E6 56 17 C9 12

第二个文件: SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7E SEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6D SEND-> 0000 83 33 7B 94 4C 63 72 77 5E 6B 72 F3 SEND-> 0000 83 33 7E A5 21 77 77 77 3F SEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77 SEND-> 0000 83 33 72 AC 77

我们发现两次PK店小二的数据格式一样,但是内容却不相同,我们是PK的同一个NPC,为什么会不同呢? 原来金庸群侠传的封包是经过了加密运算才在网路上传输的,那么我们面临的问题就是如何将密文解密成明文再分析了。

因为一般的数据包加密都是异或运算,所以这里先讲一下什么是异或。 简单的说,异或就是"相同为0,不同为1"(这是针对二进制按位来讲的),举个例子,0001和0010异或,我们按位对比,得到异或结果是0011,计算的方法是:0001的第4位为0,0010的第4位为0,它们相同,则异或结果的第4位按照"相同为0,不同为1"的原则得到0,0001的第3位为0,0010的第3位为0,则异或结果的第3位得到0,0001的第2位为0,0010的第2位为1,则异或结果的第2位得到1,0001的第1位为1,0010的第1位为0,则异或结果的第1位得到1,组合起来就是0011。异或运算今后会遇到很多,大家可以先熟悉熟悉,熟练了对分析很有帮助的。

下面我们继续看看上面的两个文件,按照常理,数据包的数据不会全部都有值的,游戏开发时会预留一些字节空间来便于日后的扩充,也就是说数据包里会存在一些"00"的字节,观察上面的文件,我们会发现文件一里很多"12",文件二里很多"77",那么这是不是代表我们说的"00"呢?推理到这里,我们就开始行动吧!

我们把文件一与"12"异或,文件二与"77"异或,当然用手算很费事,我们使用"M2M 1.0 加密封包分析工具"来计算就方便多了。得到下面的结果:

第一个文件: 1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 08 3 SEND-> 0000 F4 44 09 D2 7A 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00 5 SEND-> 0000 F4 44 05 DB 00

第二个文件: 1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 84 3 SEND-> 0000 F4 44 09 D2 56 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 B8 6C 79 F6 05 02 27 35 01 00 00 5 SEND-> 0000 F4 44 05 DB 00

哈,这一下两个文件大部分都一样啦,说明我们的推理是正确的,上面就是我们需要的明文!

接下来就是搞清楚一些关键的字节所代表的含义,这就需要截获大量的数据来分析。

首先我们会发现每个数据包都是"F4 44"开头,第3个字节是变化的,但是变化很有规律。我们来看看各个包的长度,发现什么没有?对了,第3个字节就是包的长度! 通过截获大量的数据包,我们判断第4个字节代表指令,也就是说客户端告诉服务器进行的是什么操作。例如向服务器请求战斗指令为"30",战斗中移动指令为"D4"等。 接下来,我们就需要分析一下上面第一个包"F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89",在这个包里包含什么信息呢?应该有通知服务器你PK的哪个NPC吧,我们就先来找找这个店小二的代码在什么地方。 我们再PK一个小喽罗(就是大理客栈外的那个咯): SEND-> 0000 F4 44 1F 30 D4 75 F6 05 01 01 00 01 00 01 75 09 SEND-> 0010 05 00 8A 19 00 00 00 00 11 00 02 00 00 00 C0 我们根据常理分析,游戏里的NPC种类虽然不会超过65535(FFFF),但开发时不会把自己限制在字的范围,那样不利于游戏的扩充,所以我们在双字里看看。通过"店小二"和"小喽罗"两个包的对比,我们把目标放在"6C 79 F6 05"和"CF 26 00 00"上。(对比一下很容易的,但你不能太迟钝咯,呵呵)我们再看看后面的包,在后面的包里应该还会出现NPC的代码,比如移动的包,游戏允许观战,服务器必然需要知道NPC的移动坐标,再广播给观战的其他玩家。在后面第4个包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00"里我们又看到了"6C 79 F6 05",初步断定店小二的代码就是它了! (这分析里边包含了很多工作的,大家可以用WPE截下数据来自己分析分析)

第一个包的分析暂时就到这里(里面还有的信息我们暂时不需要完全清楚了)

我们看看第4个包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00",再截获PK黄狗的包,(狗会出来2只哦)看看包的格式: SEND-> 0000 F4 44 1A DA 02 0B 4B 7D F6 05 02 27 35 01 00 00 SEND-> 0010 EB 03 F8 05 02 27 36 01 00 00

根据上面的分析,黄狗的代码为"4B 7D F6 05"(100040011),不过两只黄狗服务器怎样分辨呢?看看"EB 03 F8 05"(100140011),是上一个代码加上100000,呵呵,这样服务器就可以认出两只黄狗了。我们再通过野外遇敌截获的数据包来证实,果然如此。

那么,这个包的格式应该比较清楚了:第3个字节为包的长度,"DA"为指令,第5个字节为NPC个数,从第7个字节开始的10个字节代表一个NPC的信息,多一个NPC就多10个字节来表示。

大家如果玩过网金,必然知道随机遇敌有时会出现增援,我们就利用游戏这个增援来让每次战斗都会出现增援的NPC吧。

通过在战斗中出现增援截获的数据包,我们会发现服务器端发送了这样一个包: F4 44 12 E9 EB 03 F8 05 02 00 00 03 00 00 00 00 00 00 第5-第8个字节为增援NPC的代码(这里我们就简单的以黄狗的代码来举例)。 那么,我们就利用单机代理技术来同时欺骗客户端和服务器吧!

好了,呼叫NPC的工作到这里算是完成了一小半,接下来的事情,怎样修改封包和发送封包,我们下节继续讲解吧。

四:怎么冒充"客户端"向"服务器"发我们需要的封包?

这里我们需要使用一个工具,它位于客户端和服务器端之间,它的工作就是进行数据包的接收和转发,这个工具我们称为代理。如果代理的工作单纯就是接收和转发的话,这就毫无意义了,但是请注意:所有的数据包都要通过它来传输,这里的意义就重大了。我们可以分析接收到的数据包,或者直接转发,或者修改后转发,或者压住不转发,甚至伪造我们需要的封包来发送。

下面我们继续讲怎样来同时欺骗服务器和客户端,也就是修改封包和伪造封包。 通过我们上节的分析,我们已经知道了打多个NPC的封包格式,那么我们就动手吧!

首先我们要查找客户端发送的包,找到战斗的特征,就是请求战斗的第1个包,我们找"F4 44 1F 30"这个特征,这是不会改变的,当然是要解密后来查找哦。 找到后,表示客户端在向服务器请求战斗,我们不动这个包,转发。 继续向下查找,这时需要查找的特征码不太好办,我们先查找"DA",这是客户端发送NPC信息的数据包的指令,那么可能其他包也有"DA",没关系,我们看前3个字节有没有"F4 44"就行了。找到后,我们的工作就开始了!

我们确定要打的NPC数量。这个数量不能很大,原因在于网金的封包长度用一个字节表示,那么一个包可以有255个字节,我们上面分析过,增加一个NPC要增加10个字节,所以大家算算就知道,打20个NPC比较合适。

然后我们要把客户端原来的NPC代码分析计算出来,因为增加的NPC代码要加上100000哦。再把我们增加的NPC代码计算出来,并且组合成新的封包,注意代表包长度的字节要修改啊,然后转发到服务器,这一步在编写程序的时候要注意算法,不要造成较大延迟。

上面我们欺骗服务器端完成了,欺骗客户端就简单了,^-^

发送了上面的封包后,我们根据新增NPC代码构造封包马上发给客户端,格式就是"F4 44 12 E9 NPC代码 02 00 00 03 00 00 00 00 00 00",把每个新增的NPC都构造这样一个包,按顺序连在一起发送给客户端,客户端也就被我们骗过了,很简单吧。

以后战斗中其他的事我们就不管了,尽情地开打吧,呵呵。

上面讲的需要一定的编程基础,但是不难,即使你不会编程,相信你继续看下去就会有收获了。

五:怎么用计算机语言去写一个单机代理?

在上一章,我们已经对于代理的原理进行了讲解,大家对于代理已经有了一个初步的认识,现在我教大家如何用计算机语言编写一个自己的代理,我们考虑到简单明了,我们选用VB,因为用VB编写代理只需要很少的代码。

代码如下:

Private Sub Form_Load() DaiLi.LocalPort = "1234" Server.RemotePort = "1234" Server.RemoteHost = "211.100.20.26" DaiLi.Listen End Sub

Private Sub DaiLi_ConnectionRequest(ByVal requestID As Long) Server.Connect Client.Accept requestIDEnd Sub

Private Sub Client_DataArrival(ByVal bytesTotal As Long) Dim ClientToServer() As Byte Client.GetData ClientToServer Server.SendData ClientToServerEnd Sub

Private Sub Server_DataArrival(ByVal bytesTotal As Long) Dim ServerToClient() As Byte Server.GetData ServerToClient Client.SendData ServerToClientEnd Sub

Form_Load()这个过程表示在程序启动的时候要做的一些初始化操作。 DaiLi.LocalPort = "1234" 设定监听端口 Server.RemotePort = "1234" 设定象游戏服务器连接的端口(和监听端口是相同的) Server.RemoteHost = "211.100.20.26" 设定游戏服务器的IP地址 DaiLi.Listen 监听本地的连接请求 这时你只要将游戏的服务器列表的IP改成127.0.0.1,那么游戏的客户端程序就会来连接我们的代理,我们的代理会调用如下的过程: Private Sub DaiLi_ConnectionRequest(ByVal requestID As Long) Server.Connect 代理客户端向服务器连接 Client.Accept requestID 接受客户端的连接请求 End Sub

当客户端向服务器发送数据时,就会调用下边的过程 Private Sub Client_DataArrival(ByVal bytesTotal As Long) Dim ClientToServer() As Byte 变量定义,请求了一个用于存放数据的空间 Client.GetData ClientToServer 客户端的连接接收这些数据 在这里我们可以添加自己的代码,对封包进行修改,然后再发向服务器。

Server.SendData ClientToServer 服务器的连接把这些数据发向服务器 End Sub

当服务器发送数据给客户端时,会调用下边的过程 Private Sub Server_DataArrival(ByVal bytesTotal As Long) Dim ServerToClient() As Byte 变量定义,请求了一个用于存放数据的空间 Server.GetData ServerToClient 服务器连接接收数据 在这里我们可以添加自己的代码,对封包进行修改,然后再发给客户端。

Client.SendData ServerToClient End Sub

用其他语言编写基本的原理也是差不多的,不过可能稍微要麻烦一些,因为VB本身有一个MSWINSCK.OCX控件,这个控件封装了WINDOWS的网络操作,而且接口很简单,推荐大家使用。

六:如果单机代理被封,我们怎么利用底层的技术来接管游戏的发包?

在WINDOWS系统中,网络通讯的任务是由一个叫WSOCK32.DLL(在SYSTEM目录下)来完成的,每当游戏被运行时,他都会自动的去调用这个动态连接库,因为在WINDOWS系统中对于文件的搜索顺序是 程序目录>系统目录>路径中设置的目录,所以我们就有机会替换掉系统的WSOCK32.DLL使的游戏调用我们的WSOCK32.DLL,这样我们就有了对于游戏封包绝对的控制权,有人问:"我们应该怎么做呢?",我们只要自己编写一个WSOCK32.DLL放到游戏的目录下,就OK了,当然让我们完全自己去编写一个WSOCK32.DLL是不太现实的,因为本身网络通讯要处理很多更底层的东西,比如说从网卡读取BIT流,所以我们选择由我们的WSOCK32.DLL去调用系统的WSOCK32.DLL来完成这个功能。

WSOCK32.DLL有很多的输出函数,函数如下: __WSAFDIsSet accept AcceptEx Arecv Asend bind closesocket closesockinfo connect dn_expand EnumProtocolsA EnumProtocolsW GetAcceptExSockaddrs GetAddressByNameA GetAddressByNameW gethostbyaddr gethostbyname gethostname GetNameByTypeA GetNameByTypeW getnetbyname getpeername getprotobyname getprotobynumber getservbyname getservbyport GetServiceA GetServiceW getsockname getsockopt GetTypeByNameA GetTypeByNameW htonl htons inet_addr inet_network inet_ntoa ioctlsocket listen MigrateWinsockConfiguration NPLoadNameSpaces NSPStartup ntohl ntohs rcmd recv recvfrom rexec rresvport s_perror select send sendto sethostname SetServiceA SetServiceW setsockopt shutdown socket TransmitFile WEP WSAAsyncGetHostByAddr WSAAsyncGetHostByName WSAAsyncGetProtoByName WSAAsyncGetProtoByNumber WSAAsyncGetServByName WSAAsyncGetServByPort WSAAsyncSelect WSACancelAsyncRequest WSACancelBlockingCall WSACleanup WSAGetLastError WSAIsBlocking WSApSetPostRoutine WSARecvEx WSASetBlockingHook WSASetLastError WSAStartup WSAUnhookBlockingHook WsControl WSHEnumProtocols

在这里,不是所有的函数都要修改,因为我们只关心发送和接收的封包,所以我们只要修改send 和recv两个函数,前者是发送封包的后者是接收封包的,我们在这两个函数的处理中加入我们自己的代码,来完成封包的辨认,修改以及转发等功能。

七:怎么来分析客户端的有关资料?

自己作外挂,大多时候要分析封包,不过因为有的功能是由客户端来辨别的,所以分析客户端的程序同样也很重要,分析客户端首先要求你能看懂汇编指令(只要"看懂",要求很低的),其次是要能够熟练的运用一些工具,然后能剩下的也就是运气和游戏公司的漏洞了。(哈,不是每次都能成功的啊)下边我分步教给大家。

第一章 8086汇编指令

注:AX,BX,CX...,EAX,EBX,ECX...这些都是CPU用来存储数据的地方。

一、数据传输指令 作用:它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里 ) XLAT 字节查表转换. BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )

2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.

3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI.

4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈. POPF 标志出栈. PUSHD 32位标志入栈. POPD 32位标志出栈.

二、算术运算指令 ADD 加法. ADC 带进位加法. INC 加 1. AAA 加法的ASCII码调整. DAA 加法的十进制调整. SUB 减法. SBB 带借位减法. DEC 减 1. NEC 求反(以 0 减之). CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). AAS 减法的ASCII码调整. DAS 减法的十进制调整. MUL 无符号乘法. IMUL 整数乘法. 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整. DIV 无符号除法. IDIV 整数除法. 以上两条,结果回送: 商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算). AAD 除法的ASCII码调整. CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令 AND 与运算. OR 或运算. XOR 异或运算. NOT 取反. TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移. SAL 算术左移.(=SHL) SHR 逻辑右移. SAR 算术右移.(=SHR) ROL 循环左移. ROR 循环右移. RCL 通过进位的循环左移. RCR 通过进位的循环右移. 以上八种移位指令,其移位次数可达255次. 移位一次时, 可直接用操作码. 如 SHL AX,1. 移位>1次时, 则由寄存器CL给出移位次数. 如 MOV CL,04 SHL AX,CL

四、串指令 DS:SI 源串段寄存器 :源串变址. ES:DI 目标串段寄存器:目标串变址. CX 重复次数计数器. AL/AX 扫描值. D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志 用来控制扫描或比较操作的结束. MOVS 串传送. ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较. ( CMPSB 比较字符. CMPSW 比较字. ) SCAS 串扫描. 把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串. 把源串中的元素(字或字节)逐一装入AL或AX中. ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串. 是LODS的逆过程. REP 当CX/ECX<>0时重复. REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复. REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复. REPC 当CF=1且CX/ECX<>0时重复. REPNC 当CF=0且CX/ECX<>0时重复.

㈥ 求解密这一段密文,我不知道这个是什么加密的算法,求解密!!

你好!
这个密码不是那么好破解的,估计在网络也没有答案

㈦ 汇编语言写一个四位数按位相加。如2415 输出12

编程前,应把算法先想清楚了。

code segment;任意两个五位数相加
assume cs:code,ds:code,ss:code
org 100h;标准COM格式
start:
jmp begin
Tips db 0dh,0ah,09,'? $'
X1 db '23456+98765='
Y1 db '000000. Esc to Quit...',24h
begin:
push cs
pop ds
push ds
pop es
mov ax,3;文本模式
int 10h
Again:mov dx,offset Tips;提示
mov ah,9
int 21h
call input;接收任意两个五位数
call count;求和
;*** 输出十进制的结果 ***
mov dx,offset Y1[-1]
mov ah,9
int 21h
mov ah,0;暂停
int 16h
cmp ah,01;Esc 退出
jnz Again;计算下一题
mov ah,4ch;结束
int 21h
input:cld
mov si,offset X1
mov cx,2
T0:push cx
mov cx,5
T1:mov ah,0;接收数字
int 16h
cmp al,30h;数据校验
jb T1
cmp al,39h
ja T1
mov ah,0eh;数据显示
int 10h
mov [si],al;存入数据区
inc si
loop T1
inc si;跳过加号
pop cx
cmp cx,2
jnz T2
mov ax,0e2bh;输出加号
int 10h
T2:loop T0
ret

count:mov si,offset X1[4]
mov di,offset Y1[5]
xor dx,dx;清进位
mov cx,5;改变此值,可实现超大数相加
T3: call subs_c;逐位累加
dec si
dec di
loop T3
cmp dl,1;校正最高位
jnz T4
or dl,30h
mov [di],dl;有进位,置1
jmp T5
T4: mov byte ptr [di],20h;去掉前导0
T5: ret

subs_c: ;[原创]多位加法核心子程序
mov al,[si];最低位对齐
mov ah,[si+6]
and ax,0f0fh
add al,ah;自加
add al,dl;加后面进位
aam;二化十
mov dl,ah;存进位位
or al,30h
mov [di],al;保存1位和值
ret
code ends
end start

㈧ 人脸识别的发展历史是怎样的

人脸识别是一个被广泛研究着的热门问题,大量的研究论文层出不穷,在一定程度上有泛滥成“灾”之嫌。为了更好地对人脸识别研究的历史和现状进行介绍,本文将AFR的研究历史按照研究内容、技术方法等方面的特点大体划分为三个时间阶段,如表1所示。该表格概括了人脸识别研究的发展简史及其每个历史阶段代表性的研究工作及其技术特点。下面对三个阶段的研究进展情况作简单介绍:

第一阶段(1964年~1990年)

这一阶段人脸识别通常只是作为一个一般性的模式识别问题来研究,所采用的主要技术方案是基于人脸几何结构特征(Geometricfeature based)的方法。这集中体现在人们对于剪影(Profile)的研究上,人们对面部剪影曲线的结构特征提取与分析方面进行了大量研究。人工神经网络也一度曾经被研究人员用于人脸识别问题中。较早从事AFR研究的研究人员除了布莱索(Bledsoe)外还有戈登斯泰因(Goldstein)、哈蒙(Harmon)以及金出武雄(Kanade Takeo)等。金出武雄于1973年在京都大学完成了第一篇AFR方面的博士论文,直到现在,作为卡内基-梅隆大学(CMU)机器人研究院的一名教授,仍然是人脸识别领域的活跃人物之一。他所在的研究组也是人脸识别领域的一支重要力量。总体而言,这一阶段是人脸识别研究的初级阶段,非常重要的成果不是很多,也基本没有获得实际应用。

第二阶段(1991年~1997年)

这一阶段尽管时间相对短暂,但却是人脸识别研究的高潮期,可谓硕果累累:不但诞生了若干代表性的人脸识别算法,美国军方还组织了着名的FERET人脸识别算法测试,并出现了若干商业化运作的人脸识别系统,比如最为着名的Visionics(现为Identix)的FaceIt系统。

美国麻省理工学院(MIT)媒体实验室的特克(Turk)和潘特兰德(Pentland)提出的“特征脸”方法无疑是这一时期内最负盛名的人脸识别方法。其后的很多人脸识别技术都或多或少与特征脸有关系,现在特征脸已经与归一化的协相关量(NormalizedCorrelation)方法一道成为人脸识别的性能测试基准算法。

这一时期的另一个重要工作是麻省理工学院人工智能实验室的布鲁内里(Brunelli)和波基奥(Poggio)于1992年左右做的一个对比实验,他们对比了基于结构特征的方法与基于模板匹配的方法的识别性能,并给出了一个比较确定的结论:模板匹配的方法优于基于特征的方法。这一导向性的结论与特征脸共同作用,基本中止了纯粹的基于结构特征的人脸识别方法研究,并在很大程度上促进了基于表观(Appearance-based)的线性子空间建模和基于统计模式识别技术的人脸识别方法的发展,使其逐渐成为主流的人脸识别技术。

贝尔胡米尔(Belhumeur)等提出的Fisherface人脸识别方法是这一时期的另一重要成果。该方法首先采用主成分分析(PrincipalComponent Analysis,PCA,亦即特征脸)对图像表观特征进行降维。在此基础上,采用线性判别分析(LinearDiscriminant Analysis, LDA)的方法变换降维后的主成分以期获得“尽量大的类间散度和尽量小的类内散度”。该方法目前仍然是主流的人脸识别方法之一,产生了很多不同的变种,比如零空间法、子空间判别模型、增强判别模型、直接的LDA判别方法以及近期的一些基于核学习的改进策略。

麻省理工学院的马哈丹(Moghaddam)则在特征脸的基础上,提出了基于双子空间进行贝叶斯概率估计的人脸识别方法。该方法通过“作差法”,将两幅人脸图像对的相似度计算问题转换为一个两类(类内差和类间差)分类问题,类内差和类间差数据都要首先通过主成分分析(PCA)技术进行降维,计算两个类别的类条件概率密度,最后通过贝叶斯决策(最大似然或者最大后验概率)的方法来进行人脸识别。

人脸识别中的另一种重要方法——弹性图匹配技术(Elastic GraphMatching,EGM) 也是在这一阶段提出的。其基本思想是用一个属性图来描述人脸:属性图的顶点代表面部关键特征点,其属性为相应特征点处的多分辨率、多方向局部特征——Gabor变换[12]特征,称为Jet;边的属性则为不同特征点之间的几何关系。对任意输入人脸图像,弹性图匹配通过一种优化搜索策略来定位预先定义的若干面部关键特征点,同时提取它们的Jet特征,得到输入图像的属性图。最后通过计算其与已知人脸属性图的相似度来完成识别过程。该方法的优点是既保留了面部的全局结构特征,也对人脸的关键局部特征进行了建模。近来还出现了一些对该方法的扩展。

局部特征分析技术是由洛克菲勒大学(RockefellerUniversity)的艾提克(Atick)等人提出的。LFA在本质上是一种基于统计的低维对象描述方法,与只能提取全局特征而且不能保留局部拓扑结构的PCA相比,LFA在全局PCA描述的基础上提取的特征是局部的,并能够同时保留全局拓扑信息,从而具有更佳的描述和判别能力。LFA技术已商业化为着名的FaceIt系统,因此后期没有发表新的学术进展。

由美国国防部反毒品技术发展计划办公室资助的FERET项目无疑是该阶段内的一个至关重要的事件。FERET项目的目标是要开发能够为安全、情报和执法部门使用的AFR技术。该项目包括三部分内容:资助若干项人脸识别研究、创建FERET人脸图像数据库、组织FERET人脸识别性能评测。该项目分别于1994年,1995年和1996年组织了3次人脸识别评测,几种最知名的人脸识别算法都参加了测试,极大地促进了这些算法的改进和实用化。该测试的另一个重要贡献是给出了人脸识别的进一步发展方向:光照、姿态等非理想采集条件下的人脸识别问题逐渐成为热点的研究方向。

柔性模型(Flexible Models)——包括主动形状模型(ASM)和主动表观模型(AAM)是这一时期内在人脸建模方面的一个重要贡献。ASM/AAM将人脸描述为2D形状和纹理两个分离的部分,分别用统计的方法进行建模(PCA),然后再进一步通过PCA将二者融合起来对人脸进行统计建模。柔性模型具有良好的人脸合成能力,可以采用基于合成的图像分析技术来对人脸图像进行特征提取与建模。柔性模型目前已被广泛用于人脸特征对准(FaceAlignment)和识别中,并出现了很多的改进模型。

总体而言,这一阶段的人脸识别技术发展非常迅速,所提出的算法在较理想图像采集条件、对象配合、中小规模正面人脸数据库上达到了非常好的性能,也因此出现了若干知名的人脸识别商业公司。从技术方案上看, 2D人脸图像线性子空间判别分析、统计表观模型、统计模式识别方法是这一阶段内的主流技术。

第三阶段(1998年~现在)

FERET’96人脸识别算法评估表明:主流的人脸识别技术对光照、姿态等由于非理想采集条件或者对象不配合造成的变化鲁棒性比较差。因此,光照、姿态问题逐渐成为研究热点。与此同时,人脸识别的商业系统进一步发展。为此,美国军方在FERET测试的基础上分别于2000年和2002年组织了两次商业系统评测。

基奥盖蒂斯(Georghiades)等人提出的基于光照锥 (Illumination Cones) 模型的多姿态、多光照条件人脸识别方法是这一时期的重要成果之一,他们证明了一个重要结论:同一人脸在同一视角、不同光照条件下的所有图像在图像空间中形成一个凸锥——即光照锥。为了能够从少量未知光照条件的人脸图像中计算光照锥,他们还对传统的光度立体视觉方法进行了扩展,能够在朗博模型、凸表面和远点光源假设条件下,根据未知光照条件的7幅同一视点图像恢复物体的3D形状和表面点的表面反射系数(传统光度立体视觉能够根据给定的3幅已知光照条件的图像恢复物体表面的法向量方向),从而可以容易地合成该视角下任意光照条件的图像,完成光照锥的计算。识别则通过计算输入图像到每个光照锥的距离来完成。

以支持向量机为代表的统计学习理论也在这一时期内被应用到了人脸识别与确认中来。支持向量机是一个两类分类器,而人脸识别则是一个多类问题。通常有三种策略解决这个问题,即:类内差/类间差法、一对多法(one-to-rest)和一对一法(one-to-one)。

布兰兹(Blanz)和维特(Vetter)等提出的基于3D变形(3D Morphable Model)模型的多姿态、多光照条件人脸图像分析与识别方法是这一阶段内一项开创性的工作。该方法在本质上属于基于合成的分析技术,其主要贡献在于它在3D形状和纹理统计变形模型(类似于2D时候的AAM)的基础上,同时还采用图形学模拟的方法对图像采集过程的透视投影和光照模型参数进行建模,从而可以使得人脸形状和纹理等人脸内部属性与摄像机配置、光照情况等外部参数完全分开,更加有利于人脸图像的分析与识别。Blanz的实验表明,该方法在CMU-PIE(多姿态、光照和表情)人脸库和FERET多姿态人脸库上都达到了相当高的识别率,证明了该方法的有效性。

2001年的国际计算机视觉大会(ICCV)上,康柏研究院的研究员维奥拉(Viola)和琼斯(Jones)展示了他们的一个基于简单矩形特征和AdaBoost的实时人脸检测系统,在CIF格式上检测准正面人脸的速度达到了每秒15帧以上。该方法的主要贡献包括:1)用可以快速计算的简单矩形特征作为人脸图像特征;2)基于AdaBoost将大量弱分类器进行组合形成强分类器的学习方法;3)采用了级联(Cascade)技术提高检测速度。目前,基于这种人脸/非人脸学习的策略已经能够实现准实时的多姿态人脸检测与跟踪。这为后端的人脸识别提供了良好的基础。

沙苏哈(Shashua)等于2001年提出了一种基于商图像[13]的人脸图像识别与绘制技术。该技术是一种基于特定对象类图像集合学习的绘制技术,能够根据训练集合中的少量不同光照的图像,合成任意输入人脸图像在各种光照条件下的合成图像。基于此,沙苏哈等还给出了对各种光照条件不变的人脸签名(Signature)图像的定义,可以用于光照不变的人脸识别,实验表明了其有效性。

巴斯里(Basri)和雅各布(Jacobs)则利用球面谐波(Spherical Harmonics)表示光照、用卷积过程描述朗博反射的方法解析地证明了一个重要的结论:由任意远点光源获得的所有朗博反射函数的集合形成一个线性子空间。这意味着一个凸的朗博表面物体在各种光照条件下的图像集合可以用一个低维的线性子空间来近似。这不仅与先前的光照统计建模方法的经验实验结果相吻合,更进一步从理论上促进了线性子空间对象识别方法的发展。而且,这使得用凸优化方法来强制光照函数非负成为可能,为光照问题的解决提供了重要思路。

FERET项目之后,涌现了若干人脸识别商业系统。美国国防部有关部门进一步组织了针对人脸识别商业系统的评测FRVT,至今已经举办了两次:FRVT2000和FRVT2002。这两次测试一方面对知名的人脸识别系统进行了性能比较,例如FRVT2002测试就表明Cognitec, Identix和Eyematic三个商业产品遥遥领先于其他系统,而它们之间的差别不大。另一方面则全面总结了人脸识别技术发展的现状:较理想条件下(正面签证照),针对37437人121,589 幅图像的人脸识别(Identification)最高首选识别率为73%,人脸验证(Verification)的等错误率(EER[14])大约为6%。FRVT测试的另一个重要贡献是还进一步指出了目前的人脸识别算法亟待解决的若干问题。例如,FRVT2002测试就表明:目前的人脸识别商业系统的性能仍然对于室内外光照变化、姿态、时间跨度等变化条件非常敏感,大规模人脸库上的有效识别问题也很严重,这些问题都仍然需要进一步的努力。

总体而言,目前非理想成像条件下(尤其是光照和姿态)、对象不配合、大规模人脸数据库上的人脸识别问题逐渐成为研究的热点问题。而非线性建模方法、统计学习理论、基于Boosting[15]的学习技术、基于3D模型的人脸建模与识别方法等逐渐成为备受重视的技术发展趋势。

总而言之, 人脸识别是一项既有科学研究价值,又有广泛应用前景的研究课题。国际上大量研究人员几十年的研究取得了丰硕的研究成果,自动人脸识别技术已经在某些限定条件下得到了成功应用。这些成果更加深了我们对于自动人脸识别这个问题的理解,尤其是对其挑战性的认识。尽管在海量人脸数据比对速度甚至精度方面,现有的自动人脸识别系统可能已经超过了人类,但对于复杂变化条件下的一般人脸识别问题,自动人脸识别系统的鲁棒性和准确度还远不及人类。这种差距产生的本质原因现在还不得而知,毕竟我们对于人类自身的视觉系统的认识还十分肤浅。但从模式识别和计算机视觉等学科的角度判断,这既可能意味着我们尚未找到对面部信息进行合理采样的有效传感器(考虑单目摄像机与人类双眼系统的差别),更可能意味着我们采用了不合适的人脸建模方法(人脸的内部表示问题),还有可能意味着我们并没有认识到自动人脸识别技术所能够达到的极限精度。但无论如何,赋予计算设备与人类似的人脸识别能力是众多该领域研究人员的梦想。相信随着研究的继续深入,我们的认识应该能够更加准确地逼近这些问题的正确答案。

㈨ aam library怎么编译

该项目实现了完整的aam算法,但是诡异的是,原本在googlde code上的http://code.google.com/p/aam-library/
该项目现在竟然无法访问(PS,难道是因为效果太好了,被闭源了?)

由于OpenCV出现比较晚,因此aam是基于opencv1.0用C++编写的。在aam的reamde里面,作者提到了需要用opencv1.0并且需要修改opencv的几处代码才能正确使用aam。

现在尝试想将aam移植到Android,然而android的opencv是2.2以上的,最新版本是2.3。这个确实让人头疼了。

抱着试试看的态度直接现在VS2008里面用OPENCV2.3来编译aam,运行完全没有问题!

于是马上兴奋地进入aam的移植工作…

㈩ 汇编程序:从键盘输入两个十进制数然后把这两个数相加,并将结果显示在屏幕上

data segment

num1 db 0;3 p(?)

num2 db 0;3 p(?)

data ends

code segment 'code'

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov si,offset num1

输入一组数

mov ah,01h

int 21h

sub al,'0';;

mov dl,al

mov cl,3

shl al,cl

shl dl,1

add al,dl

mov [si],al

mov ah,01h

int 21h

sub al,'0'

add [si],al

mov ah,01h

int 21h

mov bx,offset num2

再输入一组数

mov ah,01h

int 21h

sub al,'0'

mov dl,al

mov cl,3

shl al,cl

shl dl,1

add al,dl

mov [bx],al

mov ah,01h

int 21h

sub al,'0'

add [bx],al

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

把两组数求和

mov al,[bx]

add al,[si];al=sum

xor ah,ah

mov cl,100

div cl

mov bx,ax

test al,al

jz @f

add al,'0'

mov dl,al

mov ah,02h

int 21h

@@:

mov al,bh

xor ah,ah

mov cl,10

div cl

mov bx,ax

add al,'0'

mov dl,al

mov ah,02h

int 21h

add bh,'0'

mov dl,bh

mov ah,02h

int 21h

mov ah,4ch

int 21h

code ends

end start

input example:

12 34<Enter>

or

02 08<Enter>

(10)aam算法扩展阅读:

十进制转二进制代码:

void dectobin( int n ){

int result=0,k=1,i,temp;

temp = n;

while(temp){

i = temp%2;

result = k * i + result;

k = k*10;

temp = temp/2;

}

printf("%d ", result);

}

算法分析:

在实现模2取余后需要逆序输出,这个地方通过不断乘以10来实现后一位比前一位的位数多10,不需要再通过数组或者逆序函数来实现。

热点内容
赛尔编程 发布:2024-10-08 22:30:12 浏览:160
威驰车有哪些配置 发布:2024-10-08 22:19:32 浏览:564
手游源码全套 发布:2024-10-08 21:39:41 浏览:474
大众账号密码是多少 发布:2024-10-08 21:22:18 浏览:890
价格厚道香港多ip服务器 发布:2024-10-08 21:22:16 浏览:283
android适配values 发布:2024-10-08 21:18:36 浏览:240
数控折弯机如何编程 发布:2024-10-08 20:34:40 浏览:61
pod内部修改配置如何生效 发布:2024-10-08 20:25:33 浏览:237
重庆服务器托管市场低价云主机 发布:2024-10-08 20:23:39 浏览:364
运维接触源码 发布:2024-10-08 19:55:44 浏览:486