玩游戏开了外挂,外挂的原理是修改传送数据,那么,用服务器玩游戏是怎么辨别哪些人开挂了呢?

各种BUG的利用原理包括如何制作外挂_3
各种BUG的利用原理包括如何制作外挂_3
製作外挂的可行性
  首先,让我们来看一下网络游戏的工作原理:
  网络游戏是这样工作的:
1.由服务器记录保存所有用户资料,所有信息的修改都是服务器完成的
2.服务器接受客户机的请求发送必要的信息给客户机,以使玩家正常游戏
3.服务器接收客户机的信息反馈,并根据反馈信息,对游戏帐号作相应修改
  从以上简单的介绍,我们可以看出,网络游戏可以认为是这样工作的:
  由客户机电脑操作服务器器电脑,对游戏帐号信息进行修改!
  要操纵本地的电脑是很容易的,因此,要显示所有已经从服务器得到的信息是完全可能的,这就可以做到以下功能:
   1、游戏没有黑夜,因为地图在本地,全部显示是完全可以做到的!
2.自动加血是没有问题的,因为血的多少也已经发到本地电脑,完全可以用外挂检测到,并在必要时加血,加血本身只是一个鼠标动作,完全可以交给外挂去做。类似的,自动加魔法,自动加气,自动回城、自动打怪、自动採矿卖钱然后再自动回去採、自动练级等等都可以做到!
3.卖东西的过程很经典:你卖东西时,实际就是告诉服务器电脑,你已经将一个东西卖了,真实过程是:你向服务器发送了一个具体物品的封包,如果这个封包正确,服务器就向你的游戏帐号加一定数量的钱,然后再反馈给你一些信息,假如封包不正确,自然就卖不到钱,因此,我们可以利用外挂不断向服务器发送封包,只要正确,那么服务器就认为我们再卖东西,即使我们什么都没有卖,服务器也不断给我们钱,这就是所谓的刷钱。如果封包没有加密,那么这个功能是非常容易实现的,如果封包加密,其实同样可以做到,只是要解密而已,稍微複杂些而已!类似的,就可以实现买东西用假钱(不用钱)。攻击、防御增加,原理都是类似的!
  以上的讲解,大家应该明白,其实外挂是每个游戏都可能出现的,只要有人想做,那么就没有做不出外挂的游戏!除非这个游戏不能玩!!
封包的组成
一个封包,包含有如下元素,也就是组成部分吧!
1.需要传输的数据(主要的和最重要的部分就是这个,外挂修改的也是这部分)
2.序列号(每个封包必须有自己的序列号,以便到了接收端后可以按照序列号重新组装)
3.IP地址,一般都有这一部分,通过网络解析才知道封包从那裡来,到那裡去!
当然封包的内容不止这些,但是,我们瞭解这些就够了。
注意:在传输中,所有数据都是16位或者32位的,所以截获的封包看起来总是怪怪的!
面给一个封包的基本格式,给大家看看(下面是基本封包格式,如果您可以背下来他们的格式,这对您修改游戏是非常有用的!强烈建议您看一些关于封包格式的文章,您就可以很容易地把封包看清楚,很快知道哪个才是真正的数据):
Source Port (16) | Destination Port (16)
Sequence Number (32)
Acknowledgment Number (32)
Data Offset(4) | Reserved
(6)|UGR|ACK|PSH|RST|SYN|FIN|Window(16)
Checksum (16) | Urgent Pointer (16)
Options (0 or more 32 bit words + padding)
稍微注意以下,您可以看到,每行的长度都是32字节!
大家看到了吗?data就是数据,那是最关键的部分,我们使用WPE修改的就是那一部分!
关于封包,是网络方面的知识,要写出来,估计可以出一本书了,这裡不再详细讲解,如果您要详细学习请您参考相关资料。
游戏外挂教材
做自己喜欢的!------ 明天你来自己做外挂
随着网络游戏的日益火爆,很多玩家都投身到游戏中。目前很多玩家都依赖于一些游戏的外挂程序来进行游戏。那麽做一个游戏的外挂程序是否是一件很困难的事呢?回答是"否",诚然编写一些程序是需要一些基本知识的,所以我们想以最简单的语言来给你讲授编写外挂程序的一些技巧,一些方法,并提供给你一些基本的辅助工具,即使你是一个菜鸟,看了我们的教程,并技巧地使用我们提供给你的工具,你完全能够编写出一个完全属于你自己的外挂。在本教程内,我们提供了金庸群侠传,以及网络三国这两个游戏的修改实际例子,因为这两款游戏都是对封包进行过加密运算的,如果你对这两个游戏的修改有了一定的瞭解后,相信你在其他游戏中也能非常好地做出属于自己的外挂。我们提供了金庸打增援20个NPC和网络三国在中自动吃药,自动发镖这两个实际的例子,让你上手更容易。我们也会本教程内附上这两个软件以提供给你使用和学习。我们会在教程内讲授给你怎麽去破解封包的加密算法,怎麽利用我们提供给你工具来伪造和发送封包。本教程除了文字教程外,我们还会提供金庸群侠和三国的外挂程序,另外还提供6个外挂製作工具,以供你使用。希望在以后的游戏中,每一个玩家都能够在游戏中成长起来,不但游戏玩的出色,修改游戏也同样出色,做一个真正的游戏DIY。
要想在修改游戏中做到百战百胜,是需要相当丰富的计算机知识的。有很多计算机高手就是从玩游戏,修改游戏中,逐步对计算机产生浓厚的兴趣,逐步成长起来的。不要在羡慕别人能够做到的,因为别人能够做的你也能够!我相信你们看了本教程后,会对游戏有一个全新的认识,呵呵,因为我是个好老师!(别拿鸡蛋砸我呀,救命啊!#¥%……*)
  不过要想从修改游戏中学到知识,增加自己的计算机水平,可不能只是靠修改游戏呀!
要知道,修改游戏只是一个验证你对你所瞭解的某些计算机知识的理解程度的场所,只能给你一些发现问题、解决问题的机会,只能起到帮助你提高学习计算机的兴趣的作用,而决不是学习计算机的捷径。
一:什麽叫外挂?
现在的网络游戏多是基于Internet上客户/服务器模式,服务端程序运行在游戏服务器上,游戏的设计者在其中创造一个庞大的游戏空间,各地的玩家可以通过运行客户端程序同时登录到游戏中。简单地说,网络游戏实际上就是由游戏开发商提供一个游戏环境,而玩家们就是在这个环境中相对自由和开放地进行游戏操作。那麽既然在网络游戏中有了服务器这个概念,我们以前传统的修改游戏方法就显得无能为力了。记得我们在单机版的游戏中,随心所欲地通过内存搜索来修改角色的各种属性,这在网络游戏中就没有任何用处了。因为我们在网络游戏中所扮演角色的各种属性及各种重要资料都存放在服务器上,在我们自己机器上(客户端)只是显示角色的状态,所以通过修改客户端内存裡有关角色的各种属性是不切实际的。那麽是否我们就没有办法在网络游戏中达到我们修改的目的?回答是"否"。我们知道Internet客户/服务器模式的通讯一般採用TCP/IP通信协议,数据交换是通过IP数据包的传输来实现的,一般来说我们客户端向服务器发出某些请求,比如移动、战斗等指令都是通过封包的形式和服务器交换数据。那麽我们把本地发出消息称为SEND,意思就是发送数据,服务器收到我们SEND的消息后,会按照既定的程序把有关的信息反馈给客户端,比如,移动的坐标,战斗的类型。那麽我们把客户端收到服务器发来的有关消息称为RECV。知道了这个道理,接下来我们要做的工作就是分析客户端和服务器之间往来的数据(也就是封包),这样我们就可以提取到对我们有用的数据进行修改,然后模拟服务器发给客户端,或者模拟客户端发送给服务器,这样就可以实现我们修改游戏的目的了。
目前除了修改游戏封包来实现修改游戏的目的,我们也可以修改客户端的有关程序来达到我们的要求。我们知道目前各个服务器的运算能力是有限的,特别在游戏中,游戏服务器要计算游戏中所有玩家的状况几乎是不可能的,所以有一些运算还是要依靠我们客户端来完成,这样又给了我们修改游戏提供了一些便利。比如我们可以通过将客户端程序脱壳来发现一些程序的判断分支,通过跟踪调试我们可以把一些对我们不利的判断去掉,以此来满足我们修改游戏的需求。
在下几个章节中,我们将给大家讲述封包的概念,和修改跟踪客户端的有关知识。大家准备好了吗?
游戏数据格式和存储:
在进行我们的工作之前,我们需要掌握一些关于计算机中储存数据方式的知识和游戏中储存数据的特点。本章节是提供给菜鸟级的玩家看的,如果你是高手就可以跳过了,呵呵!  如果,你想成为无坚不摧的剑客,那麽,这些东西就会花掉你一些时间;如果,你只想作个江湖的游客的话,那麽这些东西,瞭解与否无关紧要。是作剑客,还是作游客,你选择吧!
现在我们开始!首先,你要知道游戏中储存数据的几种格式,这几种格式是:字节(BYTE)、字(WORD)和双字(DOUBLE
WORD),或者说是8位、16位和32位储存方式。字节也就是8位方式能储存0~255的数字;字或说是16位储存方式能储存0~65535的数;双字即32位方式能储存0~的数。
为何要瞭解这些知识呢?在游戏中各种参数的最大值是不同的,有些可能100左右就够了,比如,金庸群侠传中的角色的等级、随机遇敌个数等等。而有些却需要大于255甚至大于65535,像金庸群侠传中角色的金钱值可达到数百万。所以,在游戏中各种不同的数据的类型是不一样的。在我们修改游戏时需要寻找准备修改的数据的封包,在这种时候,正确判断数据的类型是迅速找到正确地址的重要条件。
在计算机中数据以字节为基本的储存单位,每个字节被赋予一个编号,以确定各自的位置。这个编号我们就称为地址。
在需要用到字或双字时,计算机用连续的两个字节来组成一个字,连续的两个字组成一个双字。而一个字或双字的地址就是它们的低位字节的地址。
现在我们常用的Windows
9x操作系统中,地址是用一个32位的二进制数表示的。而在平时我们用到内存地址时,总是用一个8位的16进制数来表示它。
二进制和十六进制又是怎样一回事呢?
简单说来,二进制数就是一种只有0和1两个数码,每满2则进一位的计数进位法。同样,16进制就是每满十六就进一位的计数进位法。16进制有0--F十六个数字,它为表示十到十五的数字採用了A、B、C、D、E、F六个数字,它们和十进制的对应关係是:A对应于10,B对应于11,C对应于12,D对应于13,E对应于14,F对应于15。而且,16进制数和二进制数间有一个简单的对应关係,那就是;四位二进制数相当于一位16进制数。比如,一个四位的二进制数1111就相当于16进制的F,1010就相当于A。
瞭解这些基础知识对修改游戏有着很大的帮助,下面我就要谈到这个问题。由于在计算机中数据是以二进制的方式储存的,同时16进制数和二进制间的转换关係十分简单,所以大部分的修改工具在显示计算机中的数据时会显示16进制的代码,而且在你修改时也需要输入16进制的数字。你清楚了吧?
在游戏中看到的数据可都是十进制的,在要寻找并修改参数的值时,可以使用Windows提供的计算器来进行十进制和16进制的换算,我们可以在开始菜单裡的程序组中的附件中找到它。
现在要瞭解的知识也差不多了!不过,有个问题在游戏修改中是需要注意的。在计算机中数据的储存方式一般是低位数储存在低位字节,高位数储存在高位字节。比如,十进制数41715转换为16进制的数为A2F3,但在计算机中这个数被存为F3A2。
看了以上内容大家对数据的存贮和数据的对应关係都瞭解了吗?
怎麽用计算机语言去写一个单机代理?
在上一章,我们已经对于代理的原理进行了讲解,大家对于代理已经有了一个初步的认识,现在我教大家如何用计算机语言编写一个自己的代理,我们考虑到简单明瞭,我们选用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
当客户端向服务器发送数据时,就会调用下边的过程 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,把偏移地址存到DX. LDS
传送目标指针,把指针内容装入DS. 例: LDS SI,把段地址:偏移地址存到DS:SI. LES
传送目标指针,把指针内容装入ES. 例: LES DI,把段地址:偏移地址存到ESI. LFS
传送目标指针,把指针内容装入FS. 例: LFS DI,把段地址:偏移地址存到FSI. LGS
传送目标指针,把指针内容装入GS. 例: LGS DI,把段地址:偏移地址存到GSI. LSS
传送目标指针,把指针内容装入SS. 例: LSS DI,把段地址:偏移地址存到SSI.
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 源串段寄存器 :源串变址. ESI 目标串段寄存器:目标串变址. 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时重複.
五、程序转移指令 1&无条件转移指令 (长转移) JMP 无条件转移指令 CALL 过程调用
RET/RETF过程返回. 2&条件转移指令 (短转移,-128到+127的距离内) ( 当且仅当(SF
XOR OF)=1时,OP1循环控制指令(短转移) LOOP CX不为零时循环. LOOPE/LOOPZ
CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCXZ CX为零时转移. JECXZ
ECX为零时转移. 4&中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回
5&处理器控制指令 HLT 处理器暂停, 直到出现中断或复位信号才继续. WAIT
当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器. LOCK 封锁总线. NOP 空操作. STC
置进位标志位. CLC 清进位标志位. CMC 进位标志取反. STD 置方向标志位. CLD 清方向标志位. STI 置中断允许位.
CLI 清中断允许位.
六、伪指令 DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. UME
建立段寄存器寻址. ENDS 段结束. END 程序结束.
当然不是所有的指令都能用的上的,我在这裡全部写出来是为了让大家认识一下,方便大家以后的学习,我归纳了一下常用的指令,这些指令大家一定要熟练掌握才可以啊。
MOV 数据传送指令 PUSH,POP 堆栈指令 CMP 比较指令 LEA 取地址指令 XOR 异或指令
JE,JZ,JMP...(所有的转移指令)
一些工具的使用
用到的工具包括Fi2.9,Wasm8.9 ,UltraEdit
一、 Fi2.9
因为现在软件为了保护,另外也为了减少程序的大小,都採用了加壳技术。有人问了"壳是什麽呢",在自然界中,我想大家对"壳"这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件裡也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为"壳"了。
现在我们已经知道"壳"是用来保护程序的,那我们要分析游戏程序,必须先把他的这层壳退掉,我们称之为"脱壳",这个很容易的,因为现在网上有很多的脱壳软件可以脱壳,不过在脱壳前我们必须先知道程序用什麽加的"壳",Fi就是这样一个软件,操作很简单,将要分析的软件和Fi放在同一个目录,然后直接运行Fi,在按回车就OK了。
二、Wasm8.9 这是一个用来反彙编程序的软件(反彙编,就是把机器代码转变为彙编代码)。操作很简单, 图一(打开文件)
图二(简单介绍)??首先打开文件,进行反彙编操作,然后选择"串式参考"找到在程序中出现的内容,定位到该地址,进行分析,分析完成,进行修改,加亮当前要修改的指令,然后看"当前指令在文件中的地址偏移",记下这个值。
三UltraEdit 是一个功能强大的编辑软件,能直接修改程序的16进制指令代码。
下边以金庸的随地逃为例进行解析。
首先将金庸的Loginp.exe文件和Fi放在同一个目录,然后运行Fi,可以看到屏幕如图??可以看到程序用UPX加过壳了,所以首先进行脱壳(由于该文件用UPX加壳后进行了修改,用现成的工具无法脱壳,鉴于会员当前水平的考虑,这个文件的脱壳方法以后讲给大家听,我们直接提供一个脱过壳的文件给会员用于会员的学习),脱过壳之后,运行Wasm进行反彙编,然后点"串式参考",找到"次处非逃离点"如图
程序如下(请打开MagicWin)
:1B8EC cmp word ptr [eax+000047EC],
65AD&---此处比较是否为逃离点 :77 jne
&---不是就跳走
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:|:0061636D(C)|:BC3 mov eax, ebx:
E8D4D1FFFF call 0061355&----一个随机处理判断是否逃跑成功:
84C0 test al, al:40 je 006163CC
&----不成功就跳走:C mov [ebx+53],
2 B81E000000 mov eax, CC9DEFF call
0 mov dword ptr [esp], eax:0061639F DB0424
fild dword ptr [esp]: DB2DDC656100 fld tbyte ptr
[006165DC]: DEC9 fmulp st(1), st(0):006163AA D
fadd dword ptr [6163B0 DB2DDC656100 fld tbyte ptr
[006165DC]: DEC1 faddp st(1), st(0): DD9BF8D06500
fstp qword ptr [ebx+]:006163BE 9B wait:006163BF C6435201
mov [ebx+52], 01: 8BC3 mov eax, ebx: E
call 6163CA EB3F jmp 0061640B
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:|:0061638A(C)|:006163CC A11CA36700 mov eax, dword ptr
[0067A31C]: 8B00 mov eax, dword ptr [eax]: 33C9 xor
* Possible StringData Ref from Data Obj
-&"AAAAA"|: BA5C666100 mov edx,
6163DA E83D9BF7FF call 6163DF 8A
mov al, byte ptr [ebx+F9 add al, F9:
2C02 sub al, 02: 7320 jnb 6163EB 33C9 xor ecx,
ecx:006163ED 33D2 xor edx, edx:006163EF B0DE mov al, DE:
E8C6AE0100 call 006312BC: EB13 jmp 0061640B
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:|:0061637F(C)|: A11CA36700 mov eax, dword ptr
[0067A31C]:006163FD 8B00 mov eax, dword ptr [eax]:006163FF 33C9 xor
* Possible StringData Ref from Data Obj -&"
TCP/IP基础-TCP 与 UDP
& Net School
我们在前面讨论 OSI 和 TCP/IP
分层协定概念的时候﹐已经指出﹕不管协定设计者如何定义层级﹐各层级协定大致分成两类﹕网路群组﹑和使用者群组。前面介绍的 ARP
等协定﹐可以算是网路群组的范围﹐假如您对前述概念都有一定认识﹐已经知道了一个封包如何从一个节点传递到另一个节点。然而﹐这仅是
TCP/IP 协定的一半而已﹐要完全了解 TCP/IP 的精髓﹐在 IP 协定的更上一个层级﹐属于使用者群组协定之一﹕TCP
协定﹐是不可不知道的。只有当我们同时把 IP 协定和 TCP
协定理解进来﹐才能完整的描述电脑与电脑之间的资料传送过程﹔也只有如此﹐我们才有把握进行日常的 TCP/IP 网路管理。TCP 与 IP
这对孪生兄弟﹐是每一个网路管理人员必须溷熟的朋友。下面﹐我们将一起探讨在 TCP/IP
协定中举足轻重的传送层﹐是如何影响我们日常的网路资料传输的。
传送层的功能
在前面讨论网际网路层的时候﹐我们知道﹕网际网路层协定只提供路由资讯的判断﹐以确定封包的传送路径。但事实上 IP
协定只确保封包交换设备之间的传输﹐并没有提供一套机制来确保数据的传输。在低层的通讯裡﹐封包可能在传送过程中发生错误﹐诸如网路硬体的损坏﹑网路负荷过重等等﹐导致封包被丢弃或损坏。由于封包路由的多样性和複杂性﹐以及影响路由因素众多及其不可预测性﹐封包之抵达常是不依序的﹐或是会发生重複传送的情形。因此﹐我们必须提供一套网路技术﹐以达成更可靠和有效的传送。
封包的体积是有限的﹐然而﹐网路程式之间交换的数据往往会超过这个体积限制﹔那麽﹐我们必须有另一套机制将程式送来的资料进行规划﹐以符合
封包的传送要求。在高层的程式裡﹐除非利用非可靠和非连线型(connectionless)的资料传送方式﹐否则,程式设计者必须对每一个一个应用程式处理侦错和修复的动作﹐这无疑增加了程式设计和修改的难度﹐而且也做成许多重複的处理动作。因此﹐我们也有必要找出一个可靠的资料流传送方法﹐以建立单独且适用于所有应用程式的资料传送协定。这样就可以将应用程式与网路内部协定隔离﹐同时提供一致的资料流传送界面。
传送层的设计可以说是应上述要求而生的﹐它的主要功能有﹕
接管由上层协定传来的资料﹐并以 IP 封包可以接受的格式进行“封装”工作。
进行资料传送和回应的确认﹐以及处理资料流的检测和控制。
对不同的连线进行追踪及转换。
在 TCP/IP 协定组中,关于传送层的协定就是 TCP 和 UDP 了﹐我们将在下面详细讨论。简而言之﹐TCP
提供的是一个可靠的资料流传送服务﹔相对而言﹐UDP
提供的是一个非可靠的非连线型(connectionless)的资料流传送服务。
可靠性传送服务的特性
在应用程式对 TCP 的可靠性传送服务之主要要求有五个﹕
资料流导向。处理程式之间的大量资料传送﹐确保双方的位元资料流之统一性。
虚拟电路连接。建立和回应资料流传送的连线请求﹐并验证传送期间的资料﹐同时对通讯进行侦错。
缓冲处理。如果程式送出的资料太小﹐协定将等到收集到一定大小的资料包之后才进行传送﹐然而协定允许“push”机制强行送出。
非结构化资料流。应用程式在建立连线之前﹐要先了解资料流动内容与格式﹐方能使用资料流服务。
全双工连线。允许双向性的资料传送﹐各自被视为互不相关的独立资料流。然而﹐它提供了返回资料流中携带传送控制资讯的机制。
TCP 协定在进行传输的时侯,必须依靠 IP 协定传送封包。相对于 TCP , IP
协定属于不可靠协定﹐因为两个协定必需同时困绑工作,因此只要其一能做到可靠传输就可以了。要详细的描述 TCP
如何提供可靠性传送是非常複杂的﹐但大部分可靠性协定都採用一定的确认机制来保证传送之可靠性。这种技术需要接收端以确认信息(Acknowledgement)
回应发送端﹐肯定资料无误的到达﹐同时双方保留传送的封包记录﹐以作下一笔资料的确认依据。此外﹐还利用定时器的机制﹐以在传送逾时后重新发送封包,以确保资料的完整性。
TCP/IP基础-TCP 与 UDP
& Net School
我们在前面讨论 OSI 和 TCP/IP
分层协定概念的时候﹐已经指出﹕不管协定设计者如何定义层级﹐各层级协定大致分成两类﹕网路群组﹑和使用者群组。前面介绍的 ARP
等协定﹐可以算是网路群组的范围﹐假如您对前述概念都有一定认识﹐已经知道了一个封包如何从一个节点传递到另一个节点。然而﹐这仅是
TCP/IP 协定的一半而已﹐要完全了解 TCP/IP 的精髓﹐在 IP 协定的更上一个层级﹐属于使用者群组协定之一﹕TCP
协定﹐是不可不知道的。只有当我们同时把 IP 协定和 TCP
协定理解进来﹐才能完整的描述电脑与电脑之间的资料传送过程﹔也只有如此﹐我们才有把握进行日常的 TCP/IP 网路管理。TCP 与 IP
这对孪生兄弟﹐是每一个网路管理人员必须溷熟的朋友。下面﹐我们将一起探讨在 TCP/IP
协定中举足轻重的传送层﹐是如何影响我们日常的网路资料传输的。
传送层的功能
在前面讨论网际网路层的时候﹐我们知道﹕网际网路层协定只提供路由资讯的判断﹐以确定封包的传送路径。但事实上 IP
协定只确保封包交换设备之间的传输﹐并没有提供一套机制来确保数据的传输。在低层的通讯裡﹐封包可能在传送过程中发生错误﹐诸如网路硬体的损坏﹑网路负荷过重等等﹐导致封包被丢弃或损坏。由于封包路由的多样性和複杂性﹐以及影响路由因素众多及其不可预测性﹐封包之抵达常是不依序的﹐或是会发生重複传送的情形。因此﹐我们必须提供一套网路技术﹐以达成更可靠和有效的传送。
封包的体积是有限的﹐然而﹐网路程式之间交换的数据往往会超过这个体积限制﹔那麽﹐我们必须有另一套机制将程式送来的资料进行规划﹐以符合
封包的传送要求。在高层的程式裡﹐除非利用非可靠和非连线型(connectionless)的资料传送方式﹐否则,程式设计者必须对每一个一个应用程式处理侦错和修复的动作﹐这无疑增加了程式设计和修改的难度﹐而且也做成许多重複的处理动作。因此﹐我们也有必要找出一个可靠的资料流传送方法﹐以建立单独且适用于所有应用程式的资料传送协定。这样就可以将应用程式与网路内部协定隔离﹐同时提供一致的资料流传送界面。
传送层的设计可以说是应上述要求而生的﹐它的主要功能有﹕
接管由上层协定传来的资料﹐并以 IP 封包可以接受的格式进行“封装”工作。
进行资料传送和回应的确认﹐以及处理资料流的检测和控制。
对不同的连线进行追踪及转换。
在 TCP/IP 协定组中,关于传送层的协定就是 TCP 和 UDP 了﹐我们将在下面详细讨论。简而言之﹐TCP
提供的是一个可靠的资料流传送服务﹔相对而言﹐UDP
提供的是一个非可靠的非连线型(connectionless)的资料流传送服务。
可靠性传送服务的特性
在应用程式对 TCP 的可靠性传送服务之主要要求有五个﹕
资料流导向。处理程式之间的大量资料传送﹐确保双方的位元资料流之统一性。
虚拟电路连接。建立和回应资料流传送的连线请求﹐并验证传送期间的资料﹐同时对通讯进行侦错。
缓冲处理。如果程式送出的资料太小﹐协定将等到收集到一定大小的资料包之后才进行传送﹐然而协定允许“push”机制强行送出。
非结构化资料流。应用程式在建立连线之前﹐要先了解资料流动内容与格式﹐方能使用资料流服务。
全双工连线。允许双向性的资料传送﹐各自被视为互不相关的独立资料流。然而﹐它提供了返回资料流中携带传送控制资讯的机制。
TCP 协定在进行传输的时侯,必须依靠 IP 协定传送封包。相对于 TCP , IP
协定属于不可靠协定﹐因为两个协定必需同时困绑工作,因此只要其一能做到可靠传输就可以了。要详细的描述 TCP
如何提供可靠性传送是非常複杂的﹐但大部分可靠性协定都採用一定的确认机制来保证传送之可靠性。这种技术需要接收端以确认信息(Acknowledgement)
回应发送端﹐肯定资料无误的到达﹐同时双方保留传送的封包记录﹐以作下一笔资料的确认依据。此外﹐还利用定时器的机制﹐以在传送逾时后重新发送封包,以确保资料的完整性。
TCP/IP基础-TCP 与 UDP
& Net School
我们在前面讨论 OSI 和 TCP/IP
分层协定概念的时候﹐已经指出﹕不管协定设计者如何定义层级﹐各层级协定大致分成两类﹕网路群组﹑和使用者群组。前面介绍的 ARP
等协定﹐可以算是网路群组的范围﹐假如您对前述概念都有一定认识﹐已经知道了一个封包如何从一个节点传递到另一个节点。然而﹐这仅是
TCP/IP 协定的一半而已﹐要完全了解 TCP/IP 的精髓﹐在 IP 协定的更上一个层级﹐属于使用者群组协定之一﹕TCP
协定﹐是不可不知道的。只有当我们同时把 IP 协定和 TCP
协定理解进来﹐才能完整的描述电脑与电脑之间的资料传送过程﹔也只有如此﹐我们才有把握进行日常的 TCP/IP 网路管理。TCP 与 IP
这对孪生兄弟﹐是每一个网路管理人员必须溷熟的朋友。下面﹐我们将一起探讨在 TCP/IP
协定中举足轻重的传送层﹐是如何影响我们日常的网路资料传输的。
传送层的功能
在前面讨论网际网路层的时候﹐我们知道﹕网际网路层协定只提供路由资讯的判断﹐以确定封包的传送路径。但事实上 IP
协定只确保封包交换设备之间的传输﹐并没有提供一套机制来确保数据的传输。在低层的通讯裡﹐封包可能在传送过程中发生错误﹐诸如网路硬体的损坏﹑网路负荷过重等等﹐导致封包被丢弃或损坏。由于封包路由的多样性和複杂性﹐以及影响路由因素众多及其不可预测性﹐封包之抵达常是不依序的﹐或是会发生重複传送的情形。因此﹐我们必须提供一套网路技术﹐以达成更可靠和有效的传送。
封包的体积是有限的﹐然而﹐网路程式之间交换的数据往往会超过这个体积限制﹔那麽﹐我们必须有另一套机制将程式送来的资料进行规划﹐以符合
封包的传送要求。在高层的程式裡﹐除非利用非可靠和非连线型(connectionless)的资料传送方式﹐否则,程式设计者必须对每一个一个应用程式处理侦错和修复的动作﹐这无疑增加了程式设计和修改的难度﹐而且也做成许多重複的处理动作。因此﹐我们也有必要找出一个可靠的资料流传送方法﹐以建立单独且适用于所有应用程式的资料传送协定。这样就可以将应用程式与网路内部协定隔离﹐同时提供一致的资料流传送界面。
传送层的设计可以说是应上述要求而生的﹐它的主要功能有﹕
接管由上层协定传来的资料﹐并以 IP 封包可以接受的格式进行“封装”工作。
进行资料传送和回应的确认﹐以及处理资料流的检测和控制。
对不同的连线进行追踪及转换。
在 TCP/IP 协定组中,关于传送层的协定就是 TCP 和 UDP 了﹐我们将在下面详细讨论。简而言之﹐TCP
提供的是一个可靠的资料流传送服务﹔相对而言﹐UDP
提供的是一个非可靠的非连线型(connectionless)的资料流传送服务。
已投稿到:

我要回帖

更多关于 云服务器 的文章

 

随机推荐