fliflashwind4.22 CF怎么拨入

| | | 当前位置:
UC-7408, UC-7408 Plus
UC-7408, UC-7408 Plus
基于RISC架构,可实现数据采集的嵌入式工业计算机,配备8个串口,8个DI/DO通道,2个网口,PC
UC-7408是专为嵌入式应用而设计的嵌入式工业计算机,具备8个RS-232/422/485串口,双10/100 M 以太网络端口,PCMCIA作无线通讯,以及扩充用的CompactFlash接口。
随机预先***Linux操作系统,让软件工程师可选择自行开发应用程序,或者是轻松且免费地使用开放程序代码。这意味着为针对桌上型PC所写的软件不需要作任何程序代码的修正就可以轻易地透过GNU cro compiler移到UC-7408平台上。
8-ch数字输入,8-ch数字输出
UC-7408具备8个RS-232/422/485串口,增加8-ch数字输入,8-ch数字输出,使UC-7408成为专为数据提取而设计的嵌入式工业计算机。
UC-7408嵌入式工业计算机具备8-ch数字输入,8-ch数字输出,让数字I/O设备可以轻松连接以太网络。UC-7408可作为数字输入/输出的相关信号控制。经由UC-7408的数字输入信道,可以连接并侦测外部数字I/O设备的数字输出讯号变化,而经由UC-7408的数字输出信道传送数字讯号,将可轻易控制外部数字I/O设备。
配备数字输入/输出装置及RS-232/422/485串口的UC-7408将能进一步的简化系统,轻松进行整合性的控制, 是专为数据提取及协议转换而设计的嵌入式工业计算机。
应用 * 具备8个RS-232/422/485串口可作数据提取 * 数字输入/输出的相关信号控制 * 协议转换 * 可透过Web Browser进行远程访问监控 * 需保障网络安全的设备连网控制应用
目标市场 * 工业自动化 * 大楼自动化 * 交通自动化 * 环境监控 * 医疗自动化
- Intel Xscale IXP-422 266 MHz Proce or
- 内建128 MB RAM, 32 MB Flash Disk
- 8个RS-232/422/485串口
- 8-ch数字输入,8-ch数字输出
- 2个10/100 M 以太网络端口
- 具备CompactFlash接口,PCMCIA接口支持符合IEEE802.11b/802.11g标准的无线通讯网卡
- 随机预先***Linux操作系统
- DIN-Rail或壁挂式***
- 坚固耐用、无风扇设计
硬件规格
CPU:IXP -422 266 MHz
DRAM:128 MB o oard
Flash:板载32 MB
DI/DO:D/I x 8, D/O x 8, TTL (3.3V)
PCMCIA:Cardbus card and 16-bit PCMCIA 2.1/ JEIDA 4.2 card
Storage Expa ion:CompactFlash x 1 with full function
Co ole端口:RS-232 x 1, RJ45, 支持PPP功能
其他:实时时钟(RTC)、蜂鸣器、看门狗时钟
OS:内建嵌入式Linux或Windows CE 5.0
网络通信
LAN:10/100 M x 2, RJ45
保护:内建1.5 KV磁隔离保护
串口通信
串口:RS-232/422/485 x 8, 软件选择, RJ45
保护:内建15 KV ESD全信号保护
数据位:5、6、7、8
停止位:1、1.5、2
校验位:None、Even、Odd、Space、Mark
流量控制:RTS/CTS、XON/XOFF、RS-485 ADDCTM
速率:50 ~ 921.6 K , 支持任意波特率
系统:Ready x 1, Co ole x 1
网口:10/100 M x 2
串口:TxD/RxD x 8
电源要求
电源输入:12 ~ 48V
电源功耗:628 mA@12 VDC, 8 W
机械特性
尺寸 (WxDxH):197 x 125 x 44 mm (7.8 x 4.9 x 1.7 in)
重量:870 g
材质:SECC 金属片, 1 mm
***:壁挂或导轨***
工作环境
操作温度:-10 ~ 60C (14 ~ 140F), 5 to 95% RH
存储温度:-20 ~ 80C (-4 ~ 176F), 5 to 95% RH
硬件规格
防震:1G @ IEC-68-2-6, sine wave, 5-500 Hz,
1 Oct./min, 1 hr/axis.
防冲击:5G @ IEC-68-2-27, half sine wave, 30 ms
安规认证
EMC:FCC Part 15, CISPR 22 Cla A
CE Cla A:EN55022 Cla A, EN61000-3-2 Cla A,
EN61000-3-3, EN55024
安全:TÜV:IEC/EN60950
UL/cUL:UL60950, CAN/CSA-C22.2 No. 60950-00
保修期:5 年
软件规格
Kernel 版本:2.4.18
Boot Loader:Redboot
协议栈:TCP, UDP, IPv4, SNMP V1/V3, ICMP, IGMP, ARP,
HTTP, CHAP, PAP, SSH 1.0/ 2.0, SSL, DHCP, NTP, NFS,
SMTP, Telnet, FTP, PPP, PPPoE
文件系统:JFFS2 (板载flash)
系统工具:bash, busybox, tinylogin, telnet, ftp, scp
支持的服务和进程:
telnetd: Telnet服务器后台程序
ftpd: FTP服务器后台程序 hd: 安全shell服务器
Apache: Web服务器后台程序, 支持PHP和XML
MySQL: Database服务器和客户端
Open***: Virtual private network服务管理程序
iptables: 防火墙服务管理程序 d: 串口拨入/拨出的后台程序以及PPPoE mpd: mpd代理后台程序
inetd: TCP服务器管理程序
应用程序开发环境:
Moxa Linux API Library
Linux Tool Chain: Gcc, Glibc, GDB
Windows Tool Chain: Gcc, Glibc, I ight (基于Windows
的调试工具)
UC Finder: 用于在Windows和Linux环境
下搜索UC的IP的工具
设备驱动:
PCMCIA CardBus (su orts 802.11b/g wirele LAN Card), CF
Card, 看门狗时钟(WDT), UART, 实时时钟(RTC), 蜂鸣器
Moxa 2G NPort Real TTY Driver
Windows CE 5.0
Boot Loader:Redboot
协议栈:TCP, UDP, IPv4, SNMP, ICMP, IGMP, ARP, HTTP,
CHAP, PAP, SSL, DHCP, SNTP, SMTP, Telnet, FTP, PPP
文件系统:TFAT (板载flash)
系统工具:Windows command shell, telnet, ftp,
web-based administration manager
支持的服务和进程:
Telnet Server: 允许管理员通过标准的telent客户端进
行远程管理
FTP Server: 用于同网络上的远程计算机实现资料
Web Server (httpd): WinCE IIS, offer ASP, ISAPI Secure
Socket Layer su ort, SSL 2, SSL 3, and Tra ort
Layer Security (TLS/SSL 3.1) public key-based protocols,
and Web Administration ISAPI Exte io .
Dial-up Networking Service: RAS client API 和 PPP,
支持Exte ible Authentication Protocol (EAP) 和RAS
scripting
应用程序开发环境:
Moxa WinCE 5.0 SDK
C Libraries and Run-times
Component Services (COM and DCOM)
Microsoft Foundation Cla es (MFC)
Microsoft .NET Compact Framework
XML, including DOM, XQL, XPATH, XSLT, SAX2
SOAP Toolkit
Wi ock 2.2
设备驱动:
PCMCIA CardBus, CF Card, 看门狗时钟 (WDT) API,
UART, 实时时钟(RTC), 蜂鸣器 可选型号
产品编号
UC-7408-LX
基于RISC架构,可实现数据采集的智能通讯服务器,配备8个串口,8个DI/DO通道,2个网口,PCMCIA,CompactFlash,Linux 2.4操作系统
UC-7408-LX Plus
基于RISC架构,可实现数据采集的智能通讯服务器,配备8个串口,8个DI/DO通道,2个网口,PCMCIA,CompactFlash,Linux 2.6操作系统
UC-7408-CE
基于RISC架构,可实现数据采集的智能通讯服务器,配备8个串口,8个DI/DO通道,2个网口,PCMCIA,CompactFlash,WinCE 5.0操作系统
快速导航
相关案例
2010 Moxa Inc. All rights reserved.ICP备案: 沪ICP备05025720号Hacking… Internet / Soho… Internet / Enjoy My Life… #8230;
2007年09月21日
在网游市场透明化的今天,
吸引了很多拥有
能力的渠道商、资源提供商、甚至是网吧联盟、乃至异业经济实体甚至是有经济能力的个人。通常运营商和开发公司签署的都是国家范围的产品代理运营协议,早期的
市场都是由运营商来圈定范围,然后架设服务器和销售渠道,庞大的地区运营投入使得很多优秀的产品和运营商一度陷入困境,而一些获得阶段性成功的运营商把眼光瞄准更广大的全国市场时,也开始为
等等问题而头疼。我们所指的
是一种网游运营模式,由
向游戏运营商提出申请并获得在一定时间、一定区域、一定权限内的自主运营其产品的授权,同时获得相应的技术支持和约定的利润分成。由于本地化服务、推广、销售及服务器架设等内容的运营成本相对较低,利润空间相对较大,
已逐渐得到一些大厂商和许多
的认可和青睐。而作为联结生产商和消费者之间的纽带,地域渠道已经成为整个市场不可或缺的重要组成部分,从某种意义上说,游戏运营商就是生产商,而
是运营中承上启下的重要环节,区域内的游戏玩家才最终消费者。所以,我们把与游戏运营商合作,作为区域运营商,利用我们自身的地域、资源、
等优势进行区域化的
和推广,这种新的双向合作模式称区域运营。
归类于:
— FireFox.FST @ 8:45 am
2007年02月02日
CMD下的网络安全配置
自带的关于网络的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,还有不太熟悉的 tstat,pathping, lookup,finger,route,netsh… #8230;
这些命令又可分成三类:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。
在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过,很多shell不能再次重定向输出输出,所以不能在这种环境下交互地使用ftp等命令行工具。解决的办法是,一般交互式的工具都允许使用脚本(或者叫应答文件)。比如ft -s:filename。netsh也是这样:netsh -f filename。
netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服务器,TCP/IP协议,IPX协议,路由等。我们不是管理员,一般没必要了解这么多,只需用netsh来了解目标主机的网络配置信息。
1,TCP/IP配置
echo interface i gt echo how config gt gt netsh -f del 由此你可以了解该主机有多个网卡和IP,是否是动态分配IP(DHCP),内网IP是多少(如果有的话)。
这个命令和ipconfig /all差不多。
注意,以下命令需要目标主机启动remoteacce 服务。如果它被禁用,请先通过导入注册表解禁,然后
net tart remoteacce 2,ARP
echo interface i gt echo how i et gt gt netsh -f del 这个比ar -a命令多一点信息。
3,TCP/UDP连接
echo interface i gt echo how tcpco gt gt echo how udpco gt gt netsh -f del 这组命令和netstat -an一样。
4,网卡信息
如果netsh命令都有其他命令可代替,那它还有什么存在的必要呢?下面这个就找不到代替的了。
echo interface i gt echo how interface gt gt netsh -f del netsh的其他功能,比如修改IP,一般没有必要使用(万一改了IP后连不上,就叫天不应叫地不灵了),所以全部略过。
首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了。TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。
XP系统用i eccmd,2000下用i ecpol。遗憾的是,它们都不是系统自带的。i eccmd在xp系统***盘的SUPPORT\TOOLS\SUPPORT.CAB中,i ecpol在2000 Resource Kit里。而且,要使用i ecpol还必须带上另外两个文件:i ecutil.dll和text2pol.dll。三个文件一共119KB。
IPSec可以通过组策略来控制,但我找遍MSDN,也没有找到相应的安全模板的语法。已经配置好的IPSec策略也不能被导出为模板。所以,组策略这条路走不通。IPSec的设置保存在注册表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理论上可以通过修改注册表来配置IPSec。但很多信息以二进制形式存放,读取和修改都很困难。相比之下,上传命令行工具更方便。
关于i ecpol和i eccmd的资料,网上可以找到很多,因此本文就不细说了,只是列举一些实用的例子。
在设置IPSec策略方面,i eccmd命令的语法和i ecpol几乎完全一样,所以只以i ecpol为例:
1,防御rpc-dcom攻击
i ecpol - myfirewall -r rpc-dcom -f *+0:135:tc *+0:135:ud *+0:137:ud *+0:138:ud *+0:139:tc *+0:445:tc *+0:445:ud - BLOCK -w reg -x
这条命令关闭了本地主机的TCP135,139,445和udp135,137,138,445端口。
具体含义如下:
- myfirewall 指定策略名为myfirewall
-r rpc-dcom 指定规则名为rpc-dcom
-f #8230 #8230 建立7个筛选器。*表示任何地址(源);0表示本机地址(目标);+表示镜像(双向)筛选。详细语法见i ecpol -?
- BLOCK 指定筛选操作是阻塞。注意,BLOCK必须是大写。
-w reg 将配置写入注册表,重启后仍有效。
-x 立刻激活该策略。
2,防止被ping
i ecpol - myfirewall -r antiping -f *+0::icm - BLOCK -w reg -x
如果名为myfirewall的策略已存在,则antiping规则将添加至其中。
注意,该规则同时也阻止了该主机ping别人。
3,对后门进行IP限制
假设你在某主机上***了DameWare Mini Remote Control。为了保护它不被别人暴破密码或溢出,应该限制对其服务端口6129的访问。
i ecpol - myfw -r dwmrc_block_all -f *+0:6129:tc - BLOCK -w reg
i ecpol - myfw -r dwmrc_pa _me -f 123.45.67.89+0:6129:tc - PASS -w reg -x
这样就只有123.45.67.89可以访问该主机的6129端口了。
如果你是动态IP,应该根据IP分配的范围设置规则。比如:
i ecpol - myfw -r dwmrc_block_all -f *+0:6129:tc - BLOCK -w reg
i ecpol - myfw -r dwmrc_pa _me -f 123.45.67.*+0:6129:tc - PASS -w reg -x
这样就允许123.45.67.1至123.45.67.254的IP访问6129端口。
在写规则的时候,应该特别小心,不要把自己也阻塞了。如果你不确定某个规则的效果是否和预想的一样,可以先用计划任务留下后路。例如:
c:\> et tart chedule
Task Scheduler 服务正在启动 ..
Task Scheduler 服务已经启动成功。
c:\time /t
c:\at 12:39 i ecpol - myfw -y -w reg
新加了一项作业,其作业 ID = 1
然后,你有5分钟时间设置一个myfw策略并测试它。5分钟后计划任务将停止该策略。
如果测试结果不理想,就删除该策略。
c:\i ecpol - myfw -o -w reg
注意,删除策略前必须先确保它已停止。不停止它的话,即使删除也会在一段时间内继续生效。持续时间取决于策略的刷新时间,默认是180分钟。
如果测试通过,那么就启用它。
c:\i ecpol - myfw -x -w reg
最后说一下查看IPSec策略的办法。
对于XP很简单,一条命令搞定–i eccmd how filters
而i ecpol没有查询的功能。需要再用一个命令行工具netdiag。它位于2000系统***盘的SUPPORT\TOOLS\SUPPORT.CAB中。(已经上传了三个文件,也就不在乎多一个了。^_^)
netdiag需要RemoteRegistry服务的支持。所以先启动该服务:
net tart remoteregistry
不启动RemoteRegistry就会得到一个错误:
[FATAL] Failed to get ystem informatio of thi machine.
netdiag这个工具功能十分强大,与网络有关的信息都可以获取!不过,输出的信息有时过于详细,超过命令行控制台cmd.exe的输出缓存,而不是每个远程cmd hell都可以用more命令来分页的。
查看i ec策略的命令是:
netdiag /debug /test:i ec
然后是一长串输出信息。IPSec策略位于最后。
软件***
一个软件/工具的***过程,一般来说只是做两件事:拷贝文件到特定目录和修改注册表。只要搞清楚具体的内容,那么就可以自己在命令行下实现了。(不考虑***后需要注册激活等情况)
WinPcap是个很常用的工具,但必须在窗口界面下***。在网上也可以找到不用GUI的版本(但还是有版权页),其实我们完全可以自己做一个。
以WinPca 3.0a 为例。通过比较***前后的文件系统和注册表快照,很容易了解整个***过程。
除去反***的部分,关键的文件有三个:wpcap.dll,packet.dll和 f.sys。前面两个文件位于system32目录下,第三个在system32\drivers下。而注册表的变化是增加了一个系统服务NPF。注意,是系统服务(即驱动)不是Win32服务。
作为系统服务,不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主键,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主键。而后者默认只有SYSTEM身份才可以修改。幸运的是,并不需要手动添加它,wi cap被调用时会自动搞定。甚至完全不用手动修改注册表,所有的事wi cap都会自己完成,只需要将三个文件复制到合适的位置就行了。
作为范例,还是演示一下如何修改注册表:利用前面说过的inf文件来实现。
[Version]
Signature=$WINDOWS NT$
[DefaultI tall.Services]
AddService=NPF,,wi cap_svr
[wi cap_svr]
Di layName=Netgrou Packet Filter
ServiceType=0×1
StartType=3
ErrorControl=1
ServiceBinary=%12%\ f.sys
将上面这些内容保存为_wpcap_.inf文件。
再写一个批处理_wpcap_.bat:
rundll32.exe etupapi,I tallHinfSectio DefaultI tall 128 %CD%\_wpcap_.inf
del _wpcap_.inf
if /i %CD%==%SYSTEMROOT%\system32 goto COPYDRV
copy acket.dll %SYSTEMROOT%\system32\
copy wpcap.dll %SYSTEMROOT%\system32\
del acket.dll
del wpcap.dll
:COPYDRV
if /i %CD%==%SYSTEMROOT%\system32\driver goto END
copy f.sy %SYSTEMROOT%\system32\drivers\
del f.sys
然后用winrar将所有文件(5个)打包为自解压的exe,并将『高级自解压选项』-『解压后运行』设置为_wpcap_.bat,命令行的wi cap***包就制作完成了。
注意,批处理最后一行没有回车符。否则会因为正在运行而无法删除自己。
所有的软件***,基本上可以套用这个思路。但也有例外的,那就是系统补丁的***。
由于系统补丁有可能要替换正在被执行或访问的文件,所以用copy命令是不行的。
幸好,Windows补丁包支持命令行***。
比如:
KB824146.exe - -z -q
- 不保留备份
-z 不重起
-q 安静模式
如果有一堆补丁要打,那么用RAR打包成自解压文件,外加一个批处理。
for %%f i (KB??????.exe) do %%f - -z -q
for %%f i (KB??????.exe) do del %%f
Windows脚本
很多事用脚本来做是很简洁的。下面给出几个常用脚本的echo版。
1,显示系统版本
@echo for each i getobject _ gt .v @echo (winmgmts:\\.\root\cimv2:win32_operatingsystem).i tances_ gt gt .v @echo wscript.echo .caption^^&am .version:next gt gt .v cscript //nologo .v am del .v 2,列举进程
@echo for each i getobject _ gt .v @echo (winmgmts:\\.\root\cimv2:win32_proce quot;).i tances_ gt gt .v @echo wscript.echo .handle^&am vbtab^&am .name^&am vbtab^&am .executablepath:next gt gt .v cscript //nologo .v am del .v 3,终止进程
@echo for each i getobject _ gt k.v @echo (winmgmts:\\.\root\cimv2:win32_proce quot;).i tances_ gt gt k.v @echo if .handle=wscript.arguments(0) the wscript.echo .terminate:end if:next gt gt k.v 要终止PID为123的进程,使用如下语法:
cscript k.v 123
如果显示一个0,表示终止成功。
然后:
del k.v 4,重启系统
@echo for each o i getobject _ gt;rb.v @echo (winmgmts:{(shutdown)}!\\.\root\cimv2:win32_operatingsystem).i tances_ gt gt;rb.v @echo os.win32shutdown(2):next gt gt;rb.v am cscript //nologo rb.v am del rb.v 5,列举自启动的服务
@echo for each c i getobject(winmgmts:\\.\root\cimv2:win32_service).i tances_ gt c.v @echo if c.startmode=Auto" the wscript.echo c.name^&am quot - quot;^&am c.pathname gt gt c.v @echo ext gt gt c.v am cscript //nologo c.v am del c.v 6,列举正在运行的服务
@echo for each c i getobject(winmgmts:\\.\root\cimv2:win32_service).i tances_ gt c.v @echo if c.state=Ru ing" the wscript.echo c.name^&am quot - quot;^&am c.pathname gt gt c.v @echo ext gt gt c.v am cscript //nologo c.v am del c.v 7,显示系统最后一次启动的时间
@echo for each o i getobject _ gt t.v @echo (winmgmts:\\.\root\cimv2:win32_operatingsystem).i tances_ gt gt t.v @echo wscript.echo os.lastbootuptime:next gt gt t.v am cscript //nologo t.v am del t.v 归类于:
— FireFox.FST @ 8:44 pm
2007年01月24日
SEO工具,站长必备
搜索引擎抓取内容模拟器
可以模拟蜘蛛抓取指定网页Text,Link,Keywords及Description信息
相似页面检测工具
检验两个页面的相似度.如果相似度达80%以上,将可能受到惩罚
Google Sitema 在线创建
在线创建 Google Sitema 网站地图文件
Google Sitema Builder .Net
Google Sitema 创建软件, 可以很方便的创建网站的Sitema 综合查询工具
网站收录查询
同时查询Google,百度,Yahoo等8个搜索引擎的收录状况
关键词排名查询
可以同时在3个搜索引擎中查询指定网页指定关键词的排名情况.
搜索引擎优化监视器(SEO Monitor)
一个仅321K的小软件,可以同时查询多个搜索引擎,多个关键词的排名情况.并自动记录历史排名情况.
Google各服务器关键词排名查询
查询在Google各个服务器中,指定网页指定关键词的排名情况,可以作为一个升降的参考
关键词工具
Google Adwords关键词工具
查询指定关键词的扩展匹配,搜索量,趋势和受欢迎度.
百度相关搜索
按热门程序排序,列出指定关键词相关的扩展匹配及热门程度
关键词密度分析工具
分析指定关键词在指定页面中出现的次数,及相应的百分比密度
关键词热门排行及指数
百度排行榜
百度指数
Yahoo排行榜
搜狗指数
搜搜龙虎榜
Google工具
Google Sitema Google推出的一项免费服务,一个杰出的SEO工具
Google Analytics
Google推出的免费分析服务.在市场营销和内容优化上提供很多专业报表.对搜索引擎营销有很大帮助.
Google Dance 查询工具
不仅可以查询Dance情况,还可以通过E-mail及时获得每月google dance通知
查看在GOOGLE各服务器上的PR值
利用这个工具,可以判断PR是否更新,预测更新后的PR值
Google PR历史更新时间表
看看Google 2000看至今更新PR的具体时间和周期时长
链接工具
链接广泛度检测工具
反向链接查询工具.同时支持Google,百度,Yahoo等8个搜索引擎
查询Google中链接的工具.可以抓取文本标题和链接.中文标题显示的是乱码
Yahoo新推出的链接检查工具,可以查询网站中所有被检索的页面以及反向链接情况
同时查询Google,Yahoo,MSN中的链接数量
无效链接检查工具
检查指定页面内的链接.包括链接有效性检查,链接文字,链接类型
W3C GLink Checker
其他工具
国外主要搜索引擎和人工目录的关系表
一个Flash,解析国外主流搜索引擎与人工目录的关系,对海外推广很有帮助
网站历史查询工具
美国互联网档案馆(The Internet Archive)保存了自1996年开始,借助Alexa搜索引擎获取的网站资料
分类目录收录查询
检查网站是否登录多个重要分类目录
Alexa世界排名查询
归类于:
— FireFox.FST @ 11:07 pm
2007年01月22日
GOOGLE 排名监测工具下载
查询关键字使用频率工具
蜘蛛模似器
关键词密度检查
链接流行度 Link Popularity Checker
PR值查询工具
检查Google Dance
Google链接广泛度检测器(Google Backlink Checker)
搜索引擎抓取页面数量统计器(Search Engine Saturation)
链接广泛度检测器(Link Popularity Check)
相似页面检测器(Similar Page Checker)
AdWords关键字工具 查询特定关键词的常见查询及扩展匹配
百度特定关键词的常见查询、扩展匹配及查询热度
关键字使用频率工具(英文)特定关键词的常见查询及被查询次数
网易关键字搜索热度
搜狐关键字搜索热度
域名批量查询
IP转换成域名
归类于:
— FireFox.FST @ 4:51 pm
2007年01月21日
社会工程学翻译资料
1 社会工程学的定义 社会工程学是通过操纵合法用户获取机密信息的一种方法。一个社会工程学工程师通常使用***、互联网来欺骗,让人们暴露敏感的信息或让他们做一些违反某些规定的事情。社会工程学工程师利用人们的自然倾向,信任他或她的话,通过这种方法,胜于利用计算机的安全漏洞。人们普遍同意,用户是脆弱的一环的说法,用户的脆弱使得社会工程学成为可能。
一个现代社会工程学攻击的例子是利用包含恶意程序(比如,利用被害者的计算机发送大量垃圾邮件)的电子邮件。恶意邮件的泛滥,使软件提供商关闭了自动执行邮件附件的功能。现在,用户必须明确,才能激活附件。然而许多用户,依然无视他们收到的是什么附件,而直接打开,因此攻击奏效了。
或许最简单,但依然有效的攻击是欺骗用户,让用户以为是管理员,并且询问用户的密码来达到不同的目的。互联网用户经常收到一些信息,询问密码或信用卡信息,谎称是为了设立他们的账户或者恢复操作或者一些其他的良性操作。这叫做钓鱼攻击。应该尽早的、经常的提醒用户不要泄露敏感信息,密码等给声称是管理员的人。实际上,计算机系统的管理员很少需要知道用户的密码来完成管理任务。尽管如此,根据一个信息安全调查,仍有90%的办公人员用密码和一支笔作交换。 社会工程也同样适用于面对面的实际接触,来获取接近计算机系统的机会。
培训用户学习安全策略规定并确保他们遵守之,是防范社会工程学攻击的主要办法。
Kevin Mitnick是当今最有名的社会工程学工程师之一。
2 社会工程学基础
第一部分:黑客的战术
一个真实的故事
几年前的一天早晨,一群陌生人步入一个大型船舶公司,然后拿着可以访问整个公司网络的密码走了出来。他们是如何做到的呢?他们只与少量的人有接触,从公司里不同员工那里一点一滴的获取信息。首先,他们在打算踏进公司大门之前,研究了这个公司两天。比如,他们打***给人事部门,了解到了关键职员的名字。然后,他们装作丢失了钥匙来到正门,招待让他们进入。接着,他们进入第三层安全管制区,又丢失了身份牌,一个友善的员工为他们开了门。
这些陌生人知道,首席财政官出差了,他们因此能够进入他的办公室并从未上锁的计算机上获得财务数据。他们叫看门人搬了个垃圾桶过来,把所有文档放了进去,带着满满一垃圾桶数据离开了办公大楼。陌生人曾研究过了首席财政官的声音,所以他们能够打***,假装首席财政官,说自己急需他接通网络的密码。至此,陌生人就可以使用通常的技术和黑客工具来获得访问系统的超级用户权限。
在这个例子中,陌生人是网络顾问公司的,他们进行的是其他员工不知道的,针对首席财政官的安全审计。在这之前,首席财政官没有给他们任何特别的信息,但他们却能通过社会工程学获得所有他们想要的访问权限。(这个故事是真实工作中的一个经历,是由Kapil Raina讲述的。他现在是Verisign的安全专家、《商业安全:初学者指南》的作者之一,)
我所阅读的大多数讲社会工程学的书大多以对社会工程学的定义开始,比如是一种让别人顺从你意愿的艺术和方法 (Bernz 2),一个外部的黑客,为了得到他需要的信息来访问系统,而对计算机系统的合法用户使用心理骗局的方法 (Palumbo),或者是从人那里获取需要信息(比如密码)胜过破解系统 (Berg)。实际上,根据你的观点,社会工程学可以是这些定义中的任何一个或者包含所有这些定义。有一件事大家似乎都同意,社会工程学是,黑客用智慧,操纵人们相信他人的这一天性。黑客的目的是获取信息,利用这些信息来获得对有价值系统和系统中的信息的未经授权的访问。
安全在于信任。信赖在于保护和真实性。一般大家对用户是安全链上最薄弱环节的看法一致,人天性相信别人的话,让我们易收到攻击。许多有经验的安全专家强调这个事实。不管有多少关于网络漏洞、补丁和防火墙的论文发布,我们只能减少一点点威胁。然后,在清算帐目时却由Maggie或者她的朋友作主。and then it&rsquo up to Maggie in accounting or her friend, Will, dialing in from a remote site, to keep the corporate network secured.
目标和攻击
总的来说,社会工程学基本的目标和黑客技术是一样的:获得未经授权的到系统或者信息的访问,来欺诈,网络入侵、工业间谍、盗取客户身份资料或者只是破坏系统和网络。典型的目标包括***公司、待客接***服务、大型知名企业、金融机构、军事和政府部门,以及医院。互联网的爆炸发展The Internet boom had its share of industrial engineering attacks in start-u as well, but attacks generally focus on larger entities.
找到合适的,现实的社会工程学攻击的例子很困难。目标机构,不是拒绝承认他们是牺牲品(毕竟,承认违背了基本的安全原则不仅仅是令人为难,还可能损害机构的名声)就是没有文件记录攻击,所以没有人能够真的确定是否曾遭到过社会工程学攻击。
至于为什么通过这种方式攻击目标机构,因为用社会工程学方法来获得违法访问往往比通过各种形式的技术破解更简单。既然是技术人员,事情就变得更简单了,常常只是拿起***然后直接问某个人的密码。大多数情况下,这就是黑客们将做的。
社会工程学攻击发生在两个层面上:物理上的和精神上的。第一,我们要注意那些物理环境易受攻击:工作场所,***,你的垃圾箱还有网络。在工作场所,黑客可以径直走进门,就像电影里的一样,并装作一个进入机构的维修工人或者顾问。然后,这个入侵者大摇大摆的穿过办公室直到他或她找到一些放在桌面上的密码,随后带着充足的信息离开这个办公大楼。晚上在家,黑客就可以开始探索这个公司的网络了。另一个方法更简单,只要站在那里,看一个健忘的职员如何输入他的密码就行了。
通过***进行社会工程学攻击
最流行的社会工程学攻击方式是通过***实施的。黑客会模仿某位领导或相关人员打***,慢慢的将信息从用户口中套出来。咨询台特别易于受到这种攻击。黑客们可以假装是从公司内部***交换网络上打来的玩笑***或者是公司的***接线员,所以来电者身份不并不一定是最好的防御措施。这里有一个由计算机安全研究院提供的经典***交换网络欺诈:嘿,我是美国电报***公司业务推销,我在做一个调查。我需要你按一些键。
这有一个更好的例子:他们在午夜给你打***,说:你在过去六小时之内打过***到埃及吗?没有啊。然后他们会说:这个***现在还在打,是从你的***卡里打往埃及的,有人用你的卡消费了大约2000美元。你要对这2000美元负责,你必须付款他们继续说,我的工作就是在***上为您取消这2000美元的费用。但是你需要读出你美国电报***公司的卡号和个人身份号码,然后我会帮你取消这些收费。接着,这个人中计。。
因为咨询台的本职工作就是提供帮助,这一点可能被那些设法获得违法信息的人发现、利用,所以咨询台特别容易受到攻击。咨询台工作人员被训练成友善的,并且是毫无保留的告诉自己知道的,这简直就是社会工程学的金矿。大多数咨询台工作人员受过的安全方面教育极少,所以他们往往只是不断地回答问题,然后接听下一个***。这会造成巨大的安全漏洞。
计算机安全研究院的主持人作了一个现场示范,演示咨询台是如何的易受攻击,他打***到***公司,经过转接,到达咨询台。谁是今晚当班的?哦,是贝蒂。请贝蒂听***。[他的***被转接给贝蒂]你好贝蒂。倒霉的一天对不对?没有啊,为什么?你的系统崩溃了。她说:我的系统没有崩溃,我们一切正常。他说:你最好注销看看。贝蒂注销了系统。他说,现在登陆。贝蒂再一次登陆了系统。他说,我们这里一点显示都没有,我没看到你的状态有任何变化。再注销。贝蒂又再一次的注销。贝蒂,我必须用你的账号登陆,看看你的账号出了什么问题。把账号和密码告诉我。接着,这个咨询台高级主管把账号和密码都告诉了他。
这个***题材的变型是公用***和自动取款机。黑客们确实是越过肩膀偷看,最后获得信用卡号和密码。(我的一个朋友在美国的一个大型机场就遇上了。)人们总是在机场里围着***亭站成一圈,所以这个地方一定要倍加小心。
垃圾搜寻
垃圾搜寻也叫捡废品,是另一种流行的社会工程学攻击方式。从公司的垃圾袋里可以搜集到大量的信息。LAN Times列出了下面的这些东西,在我们的垃圾中他们是潜在的安全隐患:公司***簿,组织图,备忘录,公司保险手册,会议日历,时间和节假日,系统手册,打印出的敏感数据或者登陆名和密码,打印出的源代码,磁盘,磁带,公司信签,备忘录表,还有淘汰的硬件。
对黑客来说,这些资源是提供丰富信息的宝藏。黑客可以从***簿上了解到人的名字和***号码,来确定目标或模仿对象。组织图包含在组织内谁是当权者的信息。备忘录里有增加可信度的小信息。规定手册向黑客展示该公司真正的有多安全(或者不安全)。日历就更好了,他们或许可以给黑客提供某一雇员在那个特殊的时间出差的信息。系统手册,敏感数据或者其他技术信息资源也许能够给黑客提供打开公司网络的准确秘匙。最后,淘汰的硬件,特别是硬盘,能够通过技术恢复数据并提供各种各样的有用信息。(我们将会在第二部分讨论如何处理所有这些东西;从碎纸机开始讲是最好的)
网上社会工程学
互联网对社会工程学工程师来说是一片收获密码的沃土。主要的弱点是许多用户常常是在某一个账户上重复使用相同的简单密码:雅虎,Travelocity ,Gap.com什么的。所以一旦黑客获得一个密码,他或她或许可以进入多个账号。其中黑客获取密码的一种方式是通过在线表格:他们可以发送一些有关你独得赌金的信息,并要求用户输入名字(包含电子邮件地址,她或许还能同时获得那个人的公司账户密码)和密码。这些表格可以通过电子邮件或者美国邮政发送。美国邮政从表面上看感觉更好,让你觉得发送邮件的像是大型企业。
在网上,黑客用来获取信息的另一个办法是假装成网络管理员,通过网络给用户发送邮件询问密码。这种社会工程学攻击一般不能成功,因为用户上网的时候更小心黑客,但是用户依然要注意。此外,黑客可以给用户***程序,来弹出窗口。这些弹出窗口貌似网络的一部分,要求用户重新输入他的用户名或密码来修复某一问题。在这个时候,大多数用户应该知道不要以明文发送密码,但是系统管理员偶尔发出一些简单的安全措施,提醒用户还是应该的。要做得更好点,系统管理员可以警告他们的用户不管任何时候都不要泄露密码,除非是当面,与经授权的,可信赖的员工交谈。
电子邮件可以被用来以更直接的手段进入系统。举个例子,发送包含有病毒,蠕虫或者密码的邮件。一个很好的例子是VIGILANTe记录的攻破美国在线的案子:在那个案子里,黑客打***到美国在线,寻求技术支持,他和支持工程师攀谈了一个多小时。在谈话中,黑客提到他的汽车要低价出售。这位技术支持对此非常感兴趣,于是黑客发送了一个带有汽车图片附件的邮件。图片附件执行,打开一个后门,并绕过美国在线的防火墙建立了一个连接。
说服技巧
黑客们从心理学的观点学习社会工程学,强调如何创造利于攻击的完美心理环境。获得说服力包括下面的一些方法:模仿,迎合,从众,分散责任,还有老用户。不管使用哪种方法,主要目的是使用户相信这个社会工程学工程师是他们可以信赖的,并将敏感信息泄露给他。另一个诀窍是,永远不要一次询问过多的信息,同时为了保持表面上良好的关系,应从不同的人身上获得一点点信息。
模仿通常意味创造某个人并扮演这个角色。角色越简单越好。有时候,可能仅仅是打个***,说:嗨,我是管理信息系统的乔,我需要你的密码。但并不是每次都能成功。有些时候,黑客会研究一个机构里真实存在的一个人,等待他出差,然后在***上假扮他。据Bernz的书上说,一个黑客曾经曾仅写了很多关于黑客的事情,他们用一些小盒子来伪装自己的声音并学习被害人的语音模式和组织结构图。我认为,这种模仿攻击极少出现,因为需要大量的准备工作,但它确实发生。
在模仿攻击中使用的常见角色有:维修工,IT技术人员,经理,受信赖的第三方(比如,总裁执行秘书,他说总裁授权他来取某个文件),或是同事。在一个大公司里,这并不难做到。因为你没有办法认识所有人,而身份标志可以是假的。黑客扮演的这些角色大多属于那些我们想去讨好的那类人,比如领导。大多数雇员希望给老板留下深刻的印象,所以他们会拼命提供领导需要的信息。 从众是基于群体的行为,但有时可以用在对个人用户,告诉他其它每个人都已将现在讯问他的这些信息提供给了黑客来让用户信服,例如如果黑客假扮IT经理。当黑客用这种方式攻击,降低员工的压力,分散给出密码时员工的责任感。
当对方产生怀疑的时候,在社会工程学攻击中最好的方法就是友善。这个观点基于一般用户都会信任***里的这位同事并希望提供帮助,所以黑客真的只需要做得让人觉得基本可信就行了。另外,大多数职员都会礼貌的回应,特别是对女性。稍微奉承一下,或者一句玩笑话对软化目标雇员使之合作可能会有帮助,然而,聪明的黑客知道在雇员产生怀疑之前的什么时候,停止追问信息。如果面对面时,一个微笑或简单的一句谢谢你都能奏效。如果还不够,新用户常做的也经常奏效:我好烦啊,(眨巴眼睛)你能帮我吗?
逆向社会工程
最后,更高级的获取非法信息的方法叫做反向社会工程。这种方法是黑客创造一个在某方面是权威的角色,雇员会主动来问他问题,而不是相反。如果研究,安排并执行得很好,反向社会工程学攻击可能提供给黑客更好的机会从雇员那里获得有价值的信息;可是,这需要大量的准备,研究和攻击之前的踩点。
根据Rick Nelson写的《黑客方法:社会工程学》这本书:反向社会工程学攻击的三部分是破坏,宣告,协助。黑客破坏一个网络,引起一些故障。然后那个黑客宣称他是联系来修复问题的,然后,当他过来修复网络故障时,从雇员那里要走一些信息并达到他此行的真正目的。雇员们永远不会认为他是一个黑客,因为他们的网络故障排除了,每个人都很高兴。
当然,如果一本讲社会工程学的书不提到凯文米特尼克,那肯定不完整。所以,我会引用《安全焦点》这本书中的他的一篇文章来总结:你可以花费大量的金钱来购置技术和服务&helli helli 你的网络体系在过时的手段面前依然脆弱。第二部分讲:防范策略,要讨论如何通过使用确认攻击,预防技术,培训和策略来防范。
第二部分:防范策略
完全进入
这是一共两章的社会工程学专题的第二部分。在第一部分里,我们定义了社会工程学是黑客用智慧,操纵人们相信他人的这一天性。黑客的目的是获取信息,利用这些信息来获得对有价值系统和系统中的信息的未经授权的访问。回顾一下:社会工程学最基本的目标与黑客活动一样,总的来说都是:为了制造欺诈,网络入侵,工业间谍,窃取身份或只是破坏系统和网络而去获得未经授权的到系统的访问。
我第一次尝试社会工程学是在了解这个术语的含义之前。在初中、高中时,我曾是我们学校所在区域的驾驶技术委员会学生代表。当我二年级的时候,这个行政区在准备组建跨越整个区的网络的前一年,想在我们学校测试这套计算机网络。他们招标并选择了建设网络的硬件和软件,我的工作是测试网络。一天,我注意到这些新机器和外围的设备都没有上锁,我就拿了一台显示器和一个鼠标,然后到楼下看有没有人注意到我。确实没人看到我。我决定把他们带出去。我成功的把东西带到了停车场的后面,后来我觉得这次试验已经成功,并把东西送还了回去。
事实上没有一个人注意到我,或者阻拦我。这让我重新思考网络安全到底意味着什么。我向负责人汇报了这次测试。第二年,在本区所有新电脑和设备都上了锁。我的经历说明,社会工程学攻击可以是如此的简单,直接而有效。至今,我都想知道因为没有防范社会工程学,学校和社区到底损失了多少计算机设备。接下来,本文会讨论一些帮助个人和组织机构防范社会工程学攻击的方法。我指的是反击社会工程学的策略。
从哪里开始呢?安全策略
社会工程学攻击包括两个不同的方面:一个是物理方面,即攻击地点,例如工作场所,通过***,垃圾搜寻,网上;一个是心理方面,指的是实施攻击的方法,例如说服,模仿,迎合,从众和友善。因此,防范策略需要在物理和心理两个层面上都有所动作。雇员培训是必须的。很多公司犯的错误是只为物理层面的攻击作了应对计划。而从社会-心理学角度来看,确实门洞大开。所以在最初,管理层必须了解开发、实施完善的安全策略和规程的必要性。管理层必须认识到如果没有足够的防范社会工程学和反向社会工程学攻击,那么他们在软件升级,安全设备和审计上花的钱只是浪费 (Nelson) 。策略的一个优势是,它消除了雇员回应黑客要求的职责。如果黑客的要求是被策略禁止的,那么雇员除了拒绝黑客的请求,没有别的选择。
坚固的策略可以概括,也可以具体,而我建议最好不要太概括也不要太具体。这样,策略的实施者在未来的规程修改中就有更大的灵活性,同时限制全体雇员,在每日的工作中不能过于放松(见安全焦点的《安全策略导论》系列)。安全策略应该讲述信息访问控制,建立账号,获得批准和密码修改。永远也不要让公司内部网络获得到调制解调器访问。应该配置锁具,身份认证以及碎纸机。违反安全策略的人应该被曝光并强制改正。
防止物理攻击
理论上,优良的物理安全似乎就像一个木头人,但是为了真正防止商业机密离开公司大楼,额外的谨慎还是需要的。任何进入大楼的人的身份都应该被检查、核实。无一例外。一些文档需要被放在上锁的文件抽屉里或者安全的存储地点(同时,抽屉等的钥匙不要放在显而易见的地方)。其它文档可能需要切碎特别是那些放在垃圾筒旁边的。同样的,所有的磁存储媒体都应该分别消磁,因为数据可以从被格式化的磁盘或硬盘中找回来。 (Berg)。将锁好的垃圾箱存放在有保安监控的安全地方。
回到大楼内,应该说,在网络上所有的机器(包括远程系统)都要切实落实好密码保护。(你可以在安全聚焦的文章《密码黑客确保你的密码安全中找到一些有用的提示》)推荐使用屏幕保护密码,可以用PGP和其他加密程序来加密硬盘上的文件以提供额外的保护。
***和***网络
一种常见的犯罪是通过机构的***交换机,或者私人交换分机,机构内部的专用***网非法拨打长途***。黑客们可以拨入***然后假扮成某人,要求***转接到外线,花这个机构的钱,打***到世界各地。可以通过制定不允许转接***,控制海外和长途***,以及跟踪可以***的策略来预防。如果遇见谁打***过来,说他们是***技术员,需要获得密码,那他或她肯定在说谎。就拿Verizon通讯公司的资料来说,***技术员开展测试不需要用户的协助,因此应该怀疑要求密码或其他认证的事情 (Verizon)。所有的员工都应注意这点,他们就不会再上当了。
就像第一部分所讲的那样,咨询台是社会工程学攻击的主要目标,因为他们的工作就是告诉客户有用的信息。保护咨询台免受社会工程学攻击的最好方法就是培训。没有授权时,咨询台应该完全的拒绝泄露密码。(实际上,他应该是组织策略绝不能通过***或者电子邮件泄露密码;相反,它们只应该透露给信任的人,有授权的人)回拨***,个人身份号码和密码也可以增加安全性。如果有疑问,应鼓励咨询台工作人员当感觉***有问题时,停止服务 (Berg)。换句话说,只需要说不。
培训,培训,再培训
培训员工的重要性延伸到咨询台之外,横跨整个机构。根据企业机密信息专家,Pro-Tec Data公司总裁兼首席行政官Naomi Fine的资料,员工必须接受如何鉴别应被考虑为机密的信息,并对自己保护它们安全的职责有清醒的认识 (Pro-Tec Data)。为了成功,机构必须将计算机安全作为所有工作的一部分,不管员工是否使用计算机(Harl)。机构里的每一个人都要明确的知道为什么这些指定的机密信息至关重要;因此,机构因为有了保护网络安全的责任感而获益。(Steve )
所有的员工都应该接受如何安全的保存机密信息方面的培训。让他们参与安全策略(Harl)。请所有新员工参加安全讲座。每年为员工提供最新的资料。另一种被Fine女士推荐的方式是通过发行月刊增加员工的参与。就拿Pro-Tec Data公司来说,月刊包含真实的安全事故案例,以及这些事故可以如何防范。这使员工认识到放松安全意识潜藏着风险。根据SANS的记录,机构使用下面的一些组合:视频,杂志,手册,标记,海报,咖啡杯,钢笔和铅笔,印有字的鼠标垫,屏幕保护,登陆横幅,记事本,桌面物品,T恤和不干胶 (Arthurs)。哇啊,我能生动的描述呆伯特在他的小卧室里的所有东西。然而,重要的是,这些观点经常变更,雇员们会忽略他们的意思,把它当作耳边风。。
识别社会工程学攻击
显然,为了对付攻击,能够分辨出攻击是很有用的。计算机安全研究院记录有许多可以用于分辨社会工程学攻击的征兆:拒绝提供联系资料,急匆匆地,借他人名声,胁迫,犯小错误(拼写错误,用词不当,古怪的问题),以及询问禁止泄漏的资料。不能自圆其说。试着想象你就是一名黑客。Bernz建议人们去熟悉一下这些作品,比如夏洛克.福尔摩斯故事系列,如何交朋友和影响他人,心理学书籍,甚至《宋飞传》(宋飞和乔治确实在编造故事方面很有一套)(Bernz)。要想了解敌人,就要学会换位思考。
公司可以不断地开展一些有关安全意识的活动来确保安全。公司的内部网络是实施这些方法的宝贵资源,特别是如果包含有在线通讯,电子邮件提醒,游戏训练,和严格的密码修改需求。最大的问题是,员工也许会变得得意洋洋而忘记安全。获得持续不断的保护的关键是在整个机构中不断地提醒注意安全有些机构甚至创造了一些安全意识的节目,如上述发给员工的小玩意儿。
反击社会工程学攻击
如果员工察觉有可疑事情,他或她需要按程序报案。应有一个人负责追踪这个事情最好是事故应急小组的成员,如果机构中有这个部门。同时,这位员工应该给其他相同职位的同事通报,因为他们也可能受到攻击。事故应急小组或者管理追踪此事的人(安全小组的成员和/或系统管理员)可以调整对事件做出适当的回应。
凯文米特尼克曾在他的文章我参加的第一次密码学会议记录了一个有趣的事。米特尼克说,会议组织者决定不召开社会工程学会议是一个错误,他说:你可以在这次展会,演说者和赞助商处花大价钱购买技术和服务,但是你的网络基础设施依然很容易受到过时的骗术的攻击。这事是很重要的。提高认识,更多的安全机构应该在他们的程序和会议中优先考虑社会工程学。同时,机构、公司应该经常开展安全审计,这样他们的安全就不会变味。
下表列出了一些常见的入侵伎俩和防范策略:
危险区
黑客的伎俩
防治策略
***(咨询台)
模仿和说服
培训雇员,咨询台永远不要在***上泄露密码或任何机密信息
大楼入口
未经授权进入
严格的胸牌检查,员工培训,安全人员坐镇、
办公室
不要在有其他人在的情况下键入密码(如果必须,那就快速击键)
***(咨询台)
模仿打到咨询台的***
所有员工都应该分配有个人身份号码已获得服务台的支持
办公室
在大厅里徘徊寻找打开的办公室
所有的访客都应该有公司职员陪同
收发室
插入伪造的备忘录
监视,锁上收发室
机房/***柜
尝试进入,偷走设备,附加协议分析器来夺取机密信息
保证***柜、存放服务器的房间等地方是锁上的,并随时更新设备清单
***和专用***交换机
窃取***费
控制海外和长途***,跟踪***,拒绝转接
垃圾箱
垃圾搜寻
保证所有垃圾都放在手监视的安全区域,对此记录媒体消磁。
企业内部网和互联网
在企业内部网和互联网上创造、安插间谍软件偷取密码
持续关注系统和网络的变化,对密码使用进行培训
办公室
偷取机密文档
在文档上标记机密的符号,而且应该对这些文档上锁
模仿和说服
通过持续不断的提高员工的意识和培训
切实的防御
是的,现实中的防御是一项是人畏缩的任务。让我们现实一点,大多数公司没有财力和人力来完成以上列表中的所有项目。然而,有些用于防堵网络漏洞的钱可以调整一下。虽然不像网络漏洞般明显,但威胁是现实存在的;不过,我们也不希望制造一些草木皆兵的咨询台工作人员。只需要聪明和合理。保持士气高昂,并在不牺牲安全的条件下有一个宽松的企业文化是有可能的。对游戏规则稍作修改,入侵者就没有机会了
归类于:
— FireFox.FST @ 12:25 am
2007年01月07日
一、程序下载
***版下载:
绿色版下载:
MD5校验和:
6b9c0eb6c71 39fedd6c7b6d4dada9a xplorer_1.2.0_Setup.exe
e7e3580d06f657a88f3113725d698f07 xplorer_1.2.0.rar
二、软件介绍
软件名称:X浏览器
软件版本:V 1.2.0
软件作者:XPower Lab
作者邮件:
网站名称:XPower::做最安全的客户端
网站地址:
语言版本:简体中文
授权形式:免费软件
应用平台:Win9x/WinME/Win2000/WinXP/Win2003
X浏览器是一款真正好用又安全的浏览器,安全上网首选。
基本特征
1. X浏览器在Mozilla FireFox的基础上开发,使用IE Tab扩展实现FireFox 和 IE 双内核支持,自由切换。兼顾安全性与可操作性。
2. 强大的安全性,有效杜绝木马程序和恶意插件。
3. 不捆绑任何流氓软件,真正绿色环保软件。
4. 强大的广告过滤能力,完全屏蔽弹出窗口,有效杜绝浏览过程的视觉污染,并极大提高网页打开速度。
增强特性
1. 集成 RSS 订阅能力
2. 集成网络文章采集管理能力
3. 地址拦输入搜索,拖拽式搜索能力
4. 多语言翻译能力
5. 可以灵活结合迅雷,十倍速提升下载速度
6. 常用网址导航
三、版本更新
V 1.2.0 版本更新
主程序升级
优化插件,提高启动速度。
修改了Firefox原有的某些菜单项,令其更符合国人的使用习惯。
扩展更新:
更新:AdBlock Plus、All-in-one Gestures、Fasterfox、FlashGot、gTra late、IE Tab、MediaWrap、Sage、ScrapBook、Table Repairer、Undo Closed Ta Button、Grag de Go、CuteMenus
新增:Tab Mix Plus、Thunder Exte ion、Pearl Crescent Page Saver Basic
删除:Tab Mix Lite CE、Fi ion
主题更新:
更新:Doodle Plastik主题
新增功能:
通过Tab Mix Plus扩展,X浏览器提供了比原先使用Tab Mix Lite CE时更多的标签页功能。
Thunder Exte ion扩展使您无需进行任何设定,就可以使用迅雷下载网上资源。
Pearl Crescent Page Saver Basic是一个将网页保存为图片的扩展。在X浏览器中,您只需要按下F12,网页就被保存为了图片文件。
归类于:
— FireFox.FST @ 8:34 pm
芝加哥黑客学院教室
  领先黑客一步的黑客学院
  首个用黑客来冠名的芝加哥黑客学院,就是一所提供防御黑客攻击课程的学院。FBI 属下的特别部门、美国航空航天局(NASA) 的雇员、独立咨询师和公司里的IT部总监们,都是这所学院的学生。
  文/丁晓蕾
  就在拨通芝加哥黑客学院(The Hacker Academy) 校长阿朗柯亨(Aaron Cohen)的***那一刻,记者也没有停止把***那头的他想象成霍格沃茨校长邓布利多的模样:戴着半月形的眼镜,乱蓬蓬的银白色胡子长到可以塞进腰带里。事实上,尽管***那头的阿朗柯亨正患重感冒,可任谁也听得出他是个沉稳的美国年轻人31岁,犹太裔美国人,在商业领域工作多年,跟邓布利多没有半点关系。
 黑魔法防御术
  全民皆网的时代,我们用MSN与朋友聊天,在淘宝上买新款运动鞋,用付费通支付水电费总之,只要你乐意,你就可以只靠一台电脑、一根网线、一张可在网上支付的
生活下去。这样的生活虽然方便惬意,但是也很容易被黑客盯上,造成损失。
  调查报告显示,有目的的黑客活动、合作间谍及数据窃取活动在急剧增加。这些活动更隐蔽,更有组织性,且目标明确,被专家称为专业性的恶意攻击。黑客活动已不再只是为了好玩,现在,他们从事这类活动是为了谋生。有些地方甚至发展出了收保护费的情况,黑客们侵入一家公司的网络终端,然后勒索钱财,不给钱就搞垮你。黑客袭击的类型多样,大到几年前曾在全球范围内大爆发、导致上百亿美元损失的我爱你病毒,小到商业间谍从银行、信托公司或个人那里窃取机密信息数据的各种行为,应有尽有。
  因此,越来越多的公司和政府机构需要有人来教他们如何防范日益升级的黑客攻击,他们不得不相应地调整预算、防御策略和管理方针,掏钱送IT 部门的员工去学习防御黑客袭击的技术。很多网络安全公司应运而生,为客户提供防黑客攻击的课程。
  身为商人的阿朗柯亨看到了这一点,2006年11月,他在芝加哥开了一所自己的黑客学院,学院所教授的内容在我们一般人看来简直像黑魔法一样可怕: phishing schemes、ping sweep、蠕虫病毒、木马病毒、防火墙攻击和一些类似Google 搜索的先进技术在黑客学院教授黑魔法防御术的罗福伊克麦迪(Ralph Echemendia) 是阿朗柯亨多年前认识的朋友,也是美国乃至全世界数一数二的信息安全专家,曾为众多机构提供过相关的技术培训,被CNN、FOX新闻、
杂志、今日美国甚至动物星球等诸多媒体报道过。很多学生就是冲着他的名声,才选择了黑客学院。
  喜欢戴棒球帽的Echemendia虽然是个资深的有道德的黑客,但却与现实中的黑客团体保持着密切的联系,甚至还是一些黑客活动的组织者。照他的话说,只有这样,才能跟得上形势。
  像黑客一样思考
  黑客学院并不是第一家提供这种课程的地方,但是我们是第一个用黑客来冠名,第一家完全提供防御黑客攻击课程的学院。阿朗柯亨说。
  学院不是教授学生如何成为黑客,而是教他们如何像黑客一样思考或者说,如何领先黑客一步。阿朗柯亨说:我希望人们不再会一听到黑客这个词就害怕,如果你能像黑客一样思考,你知道他们将要搞的把戏,你就可以防止一些黑客袭击。在黑客学院的招生名单里,有FBI属下的特别部门、美国航空航天局(NASA) 的雇员、独立咨询师和公司里的IT部总监们等等。
  阿朗柯亨主要负责学院的商业运营,而课程的内容则由Ralph Echemendia来负责。我们提供大量的现实案例供学生实践学习,跟很多学校不同的是,我们提供实体教学和网络教学两种教学方式,学生可以自由选择。学校提供两种5 日制的课程,分别是认证网络分析员课程和认证道德黑客课程,学成的学员将被分别颁发ECSA(
安全分析员) ***和CEH( 认证道德黑客***),两者皆由电子商务咨询国际委员会颁发,尤其是后者,正越来越被各大公司和政府机构看重,成为新的求职砝码。
  除此之外,学校还为那些没有时间参加全日课程或者无力支付昂贵学费的人在网上开设了午夜黑客的课程,连续两个整晚由指导老师在网络上教授一些最实用的技巧,学费是一人695美元,相对全日制课程几千美元的价格实惠许多,但没有认证***。 归类于:
— FireFox.FST @ 8:28 pm
  新华网北京1月5日电 (记者 李京华) 北京市第二中级人民法院日前对涉及恶意软件的不正当竞争纠纷案的北京阿里巴巴信息技术有限公司诉北京三际无限网络科技有限公司侵犯著作权及不正当竞争纠纷一案作出一审判决,判令三际无限公司赔偿阿里巴巴公司经济损失3万元及诉讼合理支出4万余元。
  据法院介绍,阿里巴巴公司的起诉称:三际无限公司向公众提供奇虎安全卫士(又名360安全卫士)软件,同时通过其他网站和免费工具软件进行捆绑传播。奇虎安全卫士软件将雅虎助手和雅虎Widget软件列为所谓恶意软件,导致用户无法正常使用雅虎助手和雅虎Widget软件。
  阿里巴巴公司认为,雅虎助手和雅虎Widget软件并非三际无限公司所称的恶意软件,而是由用户自主选择、可以彻底卸载、不损害用户任何权益的正常软件。三际无限公司的上述行为侵犯了阿里巴巴公司对雅虎助手和雅虎Widget软件享有的著作权,损害了阿里巴巴公司的商誉,构成不正当竞争。
  二中院审理认为,三际无限公司在奇虎安全卫士软件中将雅虎助手软件描述为:软件类别:有潜在风险的;恶意表现:强制***、干扰其他软件运行、浏览器劫持;危险级别:中,并将雅虎助手软件默认选中为清除,还在媒体上宣传雅虎助手软件是恶意软件。三际无限公司的上述行为缺乏法律依据。
  审理法官说,将同业竞争者的产品称为危险应当具有充分的事实和法律依据。三际无限公司在奇虎安全卫士软件中将雅虎Widget软件标注为危险,并将雅虎Widget软件默认选中为清除,上述行为构成不正当竞争,应当承担停止侵害、赔偿损失的法律责任。
归类于:
— FireFox.FST @ 8:27 pm
2007年01月04日
Acrobat Reader缺陷触发跨站点脚本攻击
 CNET科技资讯网 1月4日国际报道 Acrobat Reader软件中的一个安全缺陷对于网络诈骗犯罪分子而言可能是个福音。
  赛门铁克和VeriSign iDefe e表示,Acrobat Reader浏览器插件中的一个错误使网络诈骗犯罪分子指定一个托管有恶意Adobe PDF文件的网站的地址。
  犯罪分子可以构造一个似乎是值得信赖的链接,并增添在链接被点击后就会运行的恶意JavaScript代码。
  VeriSign iDefe e快速响应团队的主管敦汉姆说,例如,犯罪分子可以在一个空白网站上找到一个PDF文件,然后创建指向该文件和恶意JavaScript代码的链接。
  敦汉姆表示,这一缺陷使得系统可能出现跨站点脚本(XSS)攻击,窃取cookie、对话信息,甚至黑客可能开发XSS蠕虫。
  赛门铁克表示,Adobe软件中的这一缺陷可能会刺激XSS攻击的增长。过去,这类攻击都需要利用网站中的安全缺陷,Adobe Reader中的这一缺陷首次使得客户端应用软件成为跨站点脚本攻击的帮凶。
  赛门铁克警告称,这一缺陷可能会极大地改变传统的跨站点脚本攻击的格局。
  Adobe在一份电子邮件声明中说,为了减轻这种威胁,用户可以升级到上个月发布的Adobe Reader 8。Adobe还表示,正在开发以前版本的Adobe Reader补丁软件。
  赛门铁克还表示,用户还可以强制PDF文件只能在Acrobat客户端软件而不能在浏览器插件中打开。
归类于:
— FireFox.FST @ 9:13 pm
2006年12月10日
中国&time time 公司
2006年03 月30 日
文档控制
拟 制: 审 核: 标准化: 读 者: 版本控制
版本 提交日期 相关组织和人员 版本描述
V1.0 2005-12-08 V1.1 2006.03.30 目 录
1 概述 1
1.1 适用范围 1
1.2 实施 1
1.3 例外条款 1
1.4 检查和维护 1
2 适用版本 2
3 业务使用警告 2
4 用户帐户设置 2
4.1 UID-用户ID基本要求 2
4.2 UNIX中Root安全标准 3
4.3 默认系统帐户安全标准 3
4.4 密码要求 5
4.5 密码保护 7
4.6 限制登陆失败次数 7
4.7 GID-组ID的基本要求 7
5 网络设置 8
5.1 IP协议栈的安全设置 8
5.1.1 套接字队列长度定义用来防护SYN攻击 8
5.1.2 重定向 8
5.1.3 源站路由 9
5.1.4 TIME_WAIT设置 9
5.1.5 ECHO回应广播 9
5.1.6 地址掩码查询和时间戳广播 10
5.2 /etc/hosts.equiv, .rhosts和.netrc配置文件 10
5.3 X Window系统 11
5.4 其他网络服务安全设置标准: 11
5.5 /etc/hosts.deny和/etc/hosts.allow的配置规范 12
6 权限控制 13
6.1 用户文件和HOME目录属性 13
6.2 操作系统资源 13
7 操作系统补丁管理 14
8 审计策略 14
8.1 系统访问日志 14
8.2 日志记录保存期限 14
8.3 Sudo日志记录 14
9 附则 15
9.1 文档信息 15
9.2 其他信息 15
1 概述
安全配置标准提供中国&time time 公司(下简称中国&time time 公司)UNIX操作系统应当遵循的安全性设置的标准,本文档旨在帮助系统管理人员,利用UNIX操作系统内建的安全配置,以建立一个更为安全的环境。
1.1 适用范围
本规范的使用者包括:
主机系统管理员、应用管理员、网络安全管理员。
本规范适用的范围包括:
支持中国&time time 公司运行的AIX,Solaris和Linux(Redhat Linux)主机系统。
1.2 实施
本规范的解释权和修改 最 新 的 评 论
搜 索
友 情 链 接
0020104
各种教程
@ 2004-08-09 10:30
Win32Asm教程
翻译:taowen
这是我的Win32汇编教程。它总是在创建中,我会不停地添加内容。通过上面的next和prev链接,你可以转到后面和前面一页。
先来对这个教程做个小小的介绍。Win32Asm不是一个非常流行的编程语言,而且只有为数不多(但很好)的教程。大多数教程都集中在编程的win32部分(例如,WinAPI,标准Windows编程技术的使用等),而不是汇编语言本身,例如伪代码(opcodes),寄存器(registers)的使用等。虽然你能在其他教程中找到这些内容,但那些教程通常是解释Dos编程的。它当然可以帮你学习汇编语言,但在Windows中编程,你不再需要了解Dos中断(interrupt)和端口(port)In/Out函数。在Windows中,WindowsAPI提供了你可在你的程序中使用的标准函数,后面还会对此有更多内容。这份教程的目的是在解释用汇编编Win32程序的同时学习汇编语言本身。
1.0-介绍汇编语言
汇编语言是创造出来代替原始的只能由处理器理解的二进制代码的。很久以前,尚没有任何高级语言,程序都是用汇编写的。汇编代码直接描述处理器可以执行的代码,例如:
add eax,edx
add这条指令把两个值加到一起。eax和edx被称为寄存器,它们可以在处理器内部保存值。这条代码被转换为66 03 c2(16进制)。处理器阅读这行代码,并执行它所代表的指令。像C这样的高级语言把它们自己的语言翻译为汇编语言,而汇编器又把它转换为二进制代码:
C 代码
a = a + gt gt; C编译器 汇编语言
add eax, edx gt gt;汇编器 原始输出(十六进制)
66 03 C2 (注意该处的汇编语言的代码被简化了,实际输出决定于C代码的上下文)
1.1-为什么?(Why?)
既然用汇编写程序很困难,那么为什么你用A汇编而不是C或者别的什么??-汇编产生的程序更小而且更快。在像如有人工智能一般的非常高级编程语言中,编译器要产生输出代码比起汇编来更困难。虽然编译器变得越来越好,编译器仍然必须指出最快(或最小)的方式产生汇编代码。而且,你自己来写(汇编)代码(包括可选的代码优化)能生成更小更快的代码。但是,当然,这比使用高级语言难多了。还有另一个与某些使用运行时dll的高级语言不同的地方,它们在大多数时运行良好,但有时由于dll(dll hell)而产生问题,用户总是要***这些Dll。对于Visual C++,这不是一个问题,它们是与Windows一同***的。而Visual Basic甚至不把自己的语言转换为汇编语言(虽然5以及更高的版本进行了一些这样的转换,但不完全)。它高度依赖msvbvm50.dll-Visual Baisc虚拟机。由VB产生的exe文件仅仅存在简单的代码和许多对这些dll的调用。这就是vb慢的原因。汇编是所有中最快的。它仅仅用系统的dll如Kernel32.dll, User32.dll等。
译者注:dll hell是指由于dll新的版本被旧的版本给代替了。由于使用了dll新版本的程序仍然调用新的函数,导致了致命的错误。
另一个误解是许多人认为汇编不可能用来编程。当然,它难,但不是不可能。用汇编创建大的工程的确很难,我只是用它来写小程序,用于需要速度的代码被写在能被其他语言导入的dll中。而且,Dos和Windows还有一个很大的区别。Dos程序把中断当“函数”用。像中断10用于显示,中断13用于文件存储等。在Windows中,API函数只有名字(比如Me ageBox, CreateWindowsEx)。你能导入库(DLL)并使用其中的函数。这使得用asm写程序简单多了。你将在下一章中学习更多关于这方面的知识。
2.0-开始前的准备
介绍已经够多了,现在让我们开始吧。要用汇编写程序,你需要一些工具。下面,你能看到我将在本教程中使用哪些工具。我建议你***同样的工具,因为这样你能跟着教程试验文中的例子。我也给出其他的一些选择,虽然其中的大部分你都可以选择,但是要警告的是在汇编器(masm,tasm和nasm)中有很大的区别。在这个教程中,将使用masm,因为它有许多很有用的功能(例如invoke),它使得编程更容易。当然,你可以自己选择你更喜欢的汇编器,但这将使你跟着教程走难一些而且你不得不把教程中的例子进行转换使它可以在你用的汇编器中运行。
汇编器
我的选择:Masm(在win32asm包中)
网址:win32asm.cjb.net
描述:一个把伪代码(opcodes)翻译为给处理器读的原始输出(object文件)的汇编器
相关内容:Masm,宏(macro)汇编器,是一个有很多有用的特色的汇编器。像“invoke”,它可以简化对API函数的调用并对数据类型进行检查。你将在本教程的后面学习这些。如果你读了上面的文字你就知道本教程推荐使用masm。
供选择:Tasm[dl],nasm[dl]
链接器
我的选择:微软Incremental链接器(link.exe)
网址:win32asm.cjb.net(在win32asm包中)
描述:链接器把目标(object)文件和库文件(用于导入DLL中的函数)“链接”到一起输出最终的可执行文件。
关于:我用Iczelion的Win32asm包中的link.exe。但大多数的链接器都可以用。
供选择:Tasm linker[dl]
资源编辑器
我的选择:Borland Resource Workshop
网址:www.crackstore.com
描述:用于创建资源(图形,对话框,位图,菜单等)的资源编辑器。
关于:大多数的编辑器都行。我个人爱好是resource workshop但你可以用你喜欢的。注意由于resource workshop创建的资源文件有时给资源编译带来麻烦,如果你想使用这个编辑器,你应当把tasm一起下下来,他里面包含了用于编译borland式资源的brc32.exe。
供选择:Symantec资源编辑器,Resource Builder等等
文本编辑器
我的选择:ultraedit
网址:www.ultraedit.com
描述:一个文本编辑器需要说明吗?
关于:文本编辑器的选择是十分个性化的。我非常喜欢ultraedit。你可以下载我为ultraedit写的语法文件,它可以使汇编代码语法高亮。但至少,选一个支持语法高亮的文本编辑器(关键字会自动标色)。这非常有用而且它使你的代码更容易读和写。Ultraedit还有一个可以使你在代码中快速跳转到某一个函数的函数列表。
供选择:数百万的文本编辑器中的一个
参考手册
我的选择:win32程序员参考手册
网址:www.crackstore.com(或搜索互联网)
描述:你需要参考一些API函数的用法。最重要的是“win32程序员参考手册”(win32.hlp)。这是个大文件,大约24mb(一些版本是12mb,但不全)。在这个文件中,对所有系统dll的函数(kernel,user,gdi,shell等)都做了说明。你至少需要这个文件,其他的参考(sock2.hlp, mmedia.hlp, ole.hlp等)也是有帮助的但不一定需要。
供选择:N/A
(译者注:该教程写成较早,现在有极好的MSDN供选择)
2.1-***工具
现在你已经得到这些工具了,把它们***到你硬盘的某个角落吧。这有几个值得注意的地方:
把masm包***到你打算写汇编源程序的那个分区。这保证了包含文件路径的正确性。把masm(和tasm)的bin目录加到autoexec.bat的path中,并重新启动。
如果你用的是ultraedit,使用你可以在前面下载的语法文件并启用function-listview(函数列表视图)。
2.2-为你的源文件准备目录
在某个地方创建一个win32文件夹(或其他你喜欢的名字),并为你创建的每一个工程创建一个子文件夹。
3.0-汇编基础知识
这章将教你汇编语言的基础知识
3.1-伪代码(opcodes)
汇编程序是用伪代码创建的。一个伪代码是一条处理器可以理解的指令。例如:
Add指令把两个数加到一起。大部分伪代码有参数
ADD eax, edx
ADD有两个参数。在加法的情况下,一个源一个目标。它把源值加到目标值中,并把结果保存在目标中。参数有很多不同的类型:寄存器,内存地址,直接数值(immediate values)参见下文。
3.2-寄存器
有几种大小的寄存器:8位,16位,32位(在MMX处理器中有更多)。在16位程序中,你仅能使用16位和8位的寄存器。在32位的程序中,你可以使用32位的寄存器。
一些寄存器是别的寄存器的一部分:例如,如果EAX保存了值EA7823BBh这里是其他寄存器的值。
EAX EA 78 23 BB
AX EA 78 23 BB
AH EA 78 23 BB
AL EA 78 23 BB
ax,ah,al是eax的一部分。eax是一个32位的寄存器(仅在386以上存在),ax包含了eax的低16位(2字节),ah包含了ax的高字节,而al包含了ax的低字节。因而ax是16位的,al和ax是8位的。在上面的例子中,这些是那些寄存器的值:
eax = EA7823BB (32-bit)
ax = 23BB (16-bit)
ah = 23 (8-bit)
al = BB (8-bit)
使用寄存器的例子(不要管那些伪代码,只看寄存器的说明)
mov eax, 12345678h
;Mov把一个值载入寄存器(注意:12345678h是一个十六进制值,因为h这个后缀。
mov cl, ah
;把ax的高字节移入cl
sub cl, 10
;从cl的值中减去10(十进制)
mov al, cl
;并把cl存入eax的最低字节
让我们来分析上面的代码:
mov指令可以把一个值从寄存器,内存和直接数值移入另一个寄存器。在上面的例子中,eax包含了12345678h,然后ah的值(eax左数第三个字节)被复制入了cl中(ecx寄存器的最低字节)。然后,cl减10并移回al中(eax的最低字节)
寄存器的不同类型:
全功能(General Purpose)
这些32位(它们的组成部分为16/8位)寄存器可以用来做任何事情:
eax (ax/ah/al) 加法器
ebx (bx/bh/bl) 基(base)
ecx (cx/ch/cl) 计数器
edx (dx/dh/dl) 数据 虽然它们有名字,但是你可以用它们做任何事。
段(Segment)寄存器
段寄存器定义了哪一段内存被使用。你可能在win32asm中用不着它们,因为windows有一个平坦(flat)的内存系统。在Dos中,内存被分为64kb的段,因而如果你想要定一个内存地址。你指定一个段,并用一个offset(偏移址)(像0172:0500(segment:offset))。在windows中,段有4GB的大小,所以你在Windows中不需要段。段总是16位寄存器。
CS 代码段
DS 数据段
SS 栈段
ES 扩展段
FS (only 286+) 全功能段
GS (only 386+) 全功能段
指针寄存器
实际上,你可以把指针寄存器当作全功能寄存器来使用(除了eip),只要你保存并恢复它们的原始值。指针寄存器之所以这么叫是因为它们经常被用来存储内存地址。一些伪代码(movb,sca 等)也要用它们。
esi (si) 源索引
edi (di) 目标索引
eip (ip) 指令指针
eip(在16位编程中为ip)包含了指向处理器将要执行的下一条指令的指针。因而你不能把eip当作全功能寄存器来用。
栈寄存器
有2个栈寄存器:e 和e 。e 装有内存中当前栈的位置(在下章中,对此有更多的内容)。E 在函数中被用成指向局部变量的指针。
e ( ) 栈指针 e ( ) 基(base)指针 4.0-内存
这部分将解释在Windows中内存是如何被管理的。
4.1-Dos和Win3.xx
在运行于Dos和Win3.xx的16位程序中,内存被分成许多个段。这些段的大小为64kb。为了存储内存,需要一个段指针和一个偏移址指针。段指针标明要使用的是哪个段,offset(偏移址)指针标明在段位置。看下图:
段 1 (64kb) 段 2 (64kb) 段 3 (64kb) 段 4(64kb) 更多 注意下面关于16位程序的解释,后面有更多关于32位的内容(但不要跳过这部分,要理解32位的内存管理,这部分很重要)上表是全部的内存,被划分成了多个64kb的段。最多有65536个段。现在取出一段:
段 1(64kb)
Offset 1 Offset 2 Offset 3 Offset 4 Offset 5 更多 为了指向段中的位置,需要使用offset。一个offset是段内部的一个位置。每个段最多有65536个offset。内存中地址的记法是:
SEGMENT:OFFSET
例如:
0030:4012(均为16进制)
它的意思是:段30,offset4012。为了查看那个地址中有什么。你先要到段30,然后到该段的offset4012。在前一章中,你已经学过了段和指针寄存器。例如,段寄存器有:
CS 代码段
DS 数据段
SS 栈段
ES 扩展段
FS (only 286+) 全功能段
GS (only 386+) 全功能段
顾名思义:代码段(CS)包括了当前的代码执行到了哪部分。数据段是用来标明在哪段中取出数据。栈指栈段(后面有更多)。ES,FS, GS是全功能的寄存器,并且可以用于任何段(虽然在Windows中不是如此)。
指针寄存器大多数时装有offset,但全功能寄存器(ax, bx, cx, dx等)也可以这么用。IP标明当前指令执行到了哪个offset。Sp保存了当前栈的在 (栈段中)的offset。
4.2-32位Windows
你可能已经注意到了关于段的一切是乏味的。在16位编程中,段是必不可少的。幸运的是,这个问题已经在32位Windows(95及以上)中得到解决。你仍然有段,但不用管他们了因为它们不再是64kb,而是4GB。你如果尝试着改变段寄存器中的一个,windows甚至会崩溃。这称为平坦(flat)内存模式。只有offset,而且是32位的,因而范围从0到4,294,967,295。内存中的每一个地址都是用offset表示的。这真是32位胜于16位的最大优点。所以,你现在可以忘了段寄存器并把精神集中在其他的寄存器上。
5.0-伪代码
伪代码是给处理器的指令,它实际上是原始十六进制代码的可读版。因此,汇编是最低级的编程语言。汇编中的所有东西被直接翻译为十六进制码。换句话说,你没有把高级语言翻译为低级语言的编译器上的烦恼,汇编器仅仅把汇编代码转化为原始数据。
本章将讨论一些用来运算,位操作等的伪代码。还有跳转指令,比较等伪代码在后面介绍。
5.1-一些基本的计算伪代码
MOV 这条指令用来把一个地方移往(事实上是复制到)另一个地方。这个地方可以是寄存器,内存地址或是直接数值(当然只能作为源值)。Mov指令的语法是:
mov 目标,源
你可把一个寄存器移往另一个(注意指令是在复制那个值到目标中,尽管“mov”这个名字是移的意思)
mov edx, ecx
上面的这条指令把ecx的内容复制到了ecx中,源和目标的大小应该一致。例如这个指令是非法的:
mov al, ecx;非法
这条伪代码试图把一个DWORD(32位)值装入一个字节(8位)的寄存器中。这不能个由mov指令来完成(有其他的指令干这事)。但这些指令是允许的因为源和目标在大小上并没有什么不同:
mov al, bl
mov cl, dl
mov cx, dx
mov ecx, ebx
内存地址由offset指示(在win32中,前一章中有更多信息)你也能从地址的某一个地方获得一个值并把它放入一个寄存器中。下面有一个例子:
offset 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42
data 0D 0A 50 32 44 57 25 7A 5E 72 EF 7D FF AD C7
每一个块代表一个字节
offset的值这里是用字节的形式表示的,但它事实上是32位的值,比如3A(这不是一个常见的offset的值,但如果不这样简写表格装不下),这也是一个32位的值:0000003Ah。只是为了节省空间,使用了一些不常见的低位offset。所有的值均为16进制。
看上表的offset 3A。那个offset的数据是25, 7A, 5E, 72, EF等。例如,要把这个位于3A的值用mov放入寄存器中:
mov eax, dword ptr[0000003Ah]
(h后缀表明这是一个十六进制值)
mov eax, dword ptr[0000003Ah]这条指令的意思是:把位于内存地址3A的DWORD大小的值放入eax寄存器。执行了这条指令后,eax包含了值725E7A25h。可能你注意到了这是在内存中时的反转结果:25 7A 5E 72。这是因为存储在内存中的值使用了little endian格式。这意味着越靠右的字节位数越高:字节顺序被反转了。我想一些例子可以使你把这个搞清楚。
十六进制dword(32位)值放在内存中时是这样:40, 30, 20, 10(每个值占一个字节(8位))
十六进制word(16位)值放在内存中时是这样:50, 40
回到前面的例子。你也可以对其他大小的值这么做:
mov cl, byte ptr [34h] ; cl得到值0Dh(参考上表)
mov dx, word ptr [3Eh] ; dx将得到值 7DEFh (看上表,记住反序)
大小有时不是必须的。
Mov eax,[00403045h]
因为eax是32位寄存器,编译器假定(也只能这么做)它应该从地址403045(十六进制)取个32位的值。
可以直接使用数值:
mov edx, 5006
这只是使得edx寄存器装有值5006,综括号[和]用来从括号间的内存地址处取值,没有括号就只是这个值。寄存器和内存地址也可以(他应该是32位程序中的32位寄存器):
mov eax,403045h;使eax装有值403045h(十六进制)
mov cx,[eax];把位于内存地址eax的word大小的值(403045)移入cx寄存器。
在mov cx, [eax]中,处理器会先查看eax装有什么值(=内存地址),然后在那个内存地址中有什么值,并把这个word(16位,因为目标-cx-是个16位寄存器)移入cx。
ADD, SUB, MUL, DIV 许多伪代码做计算工作。你可以猜出它们中的大多数的名字:add(加),sub(减),mul(乘),div(除)等。
Add伪代码有如下语法:
Add 目标,源
执行的运算是 目标=目标+源。下面的格式是允许的。
目标 源 例子
Register Register add ecx, edx
Register Memory add ecx, dword ptr [104h] / add ecx, [edx]
Register Immediate value add eax, 102
Memory Immediate value add dword ptr [401231h], 80
Memory Register add dword ptr [401231h], edx
这条指令非常简单。它只是把源值加到目标值中并把结果保存在目标中。其他的数学指令有:
sub 目标,源(目标=目标-源)
mul 目标,源(目标=目标×源)
div 源(eax=eax/源,edx=余数)
减法和加法一样做,乘法是目标=目标×源。除法有一点不同,因为寄存器是整数值(注意,绕回数不是浮点数)除法的结果被分为商和余数。例如:
28/6-商=4,余数=4
30/9-商=3,余数=3
97/10-商=9,余数=7
18/6-商=3,余数=0
现在,取决于源的大小,商(一部分)被存在eax中,余数(一部分)在edx:
源大小 除法 商存于 余数存于
BYTE (8-bits) ax / source AL AH
WORD (16-bits) dx:ax* / source AX DX
DWORD (32-bits) edx:eax* / source EAX EDX
*:例如,如果dx=2030h,而ax=0040h,dx:ax=20300040h。dx:ax是一个双字值。其中高字代表dx,低字代表ax,Edx:eax是个四字值(64位)其高字是edx低字是eax。
Div伪代码的源可以是
an 8-bit register (al, ah, cl,...)
a 16-bit register (ax, dx, ...)
a 32-bit register (eax, edx, ecx...)
an 8-bit memory value (byte ptr [xxxx])
a 16-bit memory value (word ptr [xxxx])
a 32-bit memory value (dword ptr [xxxx])
源不可以是直接数值因为处理器不能决定源参数的大小。
位操作 这些指令都由源和目标,除了“NOT”指令。目标中的每位与源中的每位作比较,并看是那个指令,决定是0还是1放入目标位中。
指令 AND OR XOR NOT
源位 0 0 1 1 0 0 1 1 0 0 1 1 0 1
目标位 0 1 0 1 0 1 0 1 0 1 0 1 X X
输出位 0 0 0 1 0 1 1 1 0 1 1 0 1 0
如果源和目标均为1,AND把输出位设为1。
如果源和目标中有一个为1,OR把输出位设为1。
如果源和目标位不一样,XOR把输出位设为1。
NOT反转源位
一个例子:
mov ax, 3406
mov dx, 13EAh
xor ax,dx
ax=3406(十六进制)是二进制的0000110101001110
dx=13EA(十六进制)是二进制的0001001111101010
对这些位进行xor操作:
源 0001001111101010 (dx)
目标 0000110101001110 (ax)
输出 0001111010100100 (new ax)
新dx是0001111010100100 (十进制的7845, 十六进制的1EA4)
另一个例子:
mov ecx, FFFF0000h
not ecx
FFFF0000在二进制中是11111111111111110000000000000000(16个1,16个0)如果反转每位会得到
00000000000000001111111111111111(16个0,16个1)在十六进制中是0000FFFF。因而执行NOT操作后,ecx是0000FFFFh。
步增/减 有两个很简单的指令,DEC和INC。这些指令使内存地址和寄存器步增或步减,就是这样:
inc reg - reg = reg + 1
dec reg - reg = reg - 1
inc dword ptr [103405] - 位于103405的值步增
dec dword ptr [103405] - 位于103405的值步减
NOP 这条指令什么都不干。它仅仅占用空间和时间。它用作填充或给代码打补丁的目的。
移位(Bit Rotation 和 shifiting) 注意:下面的大部分例子使用8位数,但这只是为了使目的清楚。
Shifting函数
SHL 目标,计数(count)
SHR 目标,计数(count)
SHL和SHR在寄存器,内存地址中像左或向右移动一定数目(count)的位。
例如:
;这儿al=01011011(二进制)
shr al, 3
它的意思是:把al寄存器中的所有位向右移三个位置。因而al会变成为00001011。左边的字节用0填充,而右边的字节被移出。最后一个被移出的位保存在carry-flag中。Carry-flag是处理器标志寄存器的一位,它不是像eax或ecx一样的,你可以访问的寄存器(虽然有伪代码干这活),但它的值决定于该指令的结构。它(carry-flag)会在后面解释,你要记住的唯一一件事是carry是标志寄存器的一位且它可以被打开或者关闭。这个位等于最后一个移出的位。
shl和shr一样,只不过是向左移。
;这儿bl=11100101(二进制)
shl bl, 2
执行了指令后bl是10010100(二进制)。最后的两个位是由0填充的,carry-flag是1,因为最后移出的位是1。
还有两个伪代码:
SAL 目标, 计数(算术左移)
SAR 目标, 计数(算术右移)
SAL和SHL一样,但SAR不完全和SHR一样。SAR不是用0来填充移出的位而是复制MSB(最高位)例如:
al = 10100110
sar al, 3
al = 11110100
sar al, 2
al = 11101001
bl = 00100110
sar bl, 3
bl = 00000100
Rotation(循环移动) 函数
Rol 目标,计数;循环左移
Ror 目标,计数;循环右移
Rcl 目标,计数;通过carry循环左移
Rcr 目标,计数;通过carry循环右移
循环移动(Rotation)看上去就像移(Shifting),只是移出的位又到了另一边。
例如:ror(循环右移) Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 移位之前 1 0 0 1 1 0 1 1 循环移位, 计数= 3 1 0 0 1 1 0 1 1 (被移出)
结果 0 1 1 1 0 0 1 1 如你在上图所见,位循环了。注意,每个被推出的位又移到了另一边。和Shifting一样,carry位装有最后被移出的位。Rcl和Rcr实际上和Rol,Rcr一样。它们的名字暗示了它们用carry位来表明最后移出的位,但和Rol和Ror干同样的事情。它们没有什么不同。
交换 XCHG指令也非常简单。它同在两个寄存器和内存地址之间交换:
eax = 237h
ecx = 978h
xchg eax, ecx
eax = 978h
ecx = 237h
6.0-文件结构
汇编源文件被分成了几个部分。这些部分是code,data,未初始化data,co tants,resource和relocatio ,资源部分是资源文件创建的,后面会有更多的讨论。Relocation部分对我们不重要(它包含了使PE-loader可以在内存的不同的位置装载入程序的信息)。重要的部分是code,data,未初始化data和co tants。可能你已经猜到,code部分包含了代码。Data装有数据,并有读写权限。整个data部分被包括在exe文件并可以用数据初始化。
未初始化data在启动时没有内容,甚至没有包括在exe文件本身。它只是由Windows“保留”的一部分内存。这部分也有读写权限。Co tants和data部分一样,但只读。虽然这部分可用作常数,但把常数定义在包含文件中更简单也更快捷,并用作直接数值。
6.1-代表各部分的符号
在你的源文件(*.asm)中,你可以用部分标识符定义各部分:
.code;代码部分由此开始
.data;数据部分由此开始
.data?;未初始化数据部分由此开始
.co t;常量部分由此开始
可执行文件(*.exe,*.dll和其他)是(在win32中)可移植执行格式(PE),我不会详细的讨论它但是有几点是重要的。部分(Sectio )的一些属性定义在PE头中:
Section名,RVA,offset,原始大小,虚拟大小和标志。Rva(相对虚拟地址)是将要装入的section部分的相对内存地址。这里相对的意思是相对于程序载入的基地址。这个地址也在PE头中,但可以由PE-loader改变(使用relocation部分)。Offset是初始化数据所在的exe文件本身的原始offset。虚拟大小是程序在内存中将达到的大小。标志是读/写/可执行等。
6.2-例子
这有一个示例程序:
Number1 dd 12033h
Number2 dw 100h,200h,300h,400h
Number3 db " labla,0
Value dd ?
mov eax, Number1
mov ecx, offset Number2
add ax, word ptr [ecx+4]
mov Value, eax
这个程序不能编译但没关系。
在你的汇编程序中,你放入“部分”中的所有东西都会进入exe文件而且当程序被载入内存时,位于某个内存地址。在上面的data部分,有3个标签:Number1, Number2, Number3。这些标签会保存它们在程序中的offset因而你可以在你的程序中使用它们来指示位置。
DD直接把一个dword放在那,DW是Word而DB是byte。你也可以用db放字符串,因为它实际上是一串byte值。在例子中,data部分会变成内存中的这样:
33,20,01,00,00,01,00,02,00,03,00,04,62,6c,61,62,6c,61,00(均为十六进制值)
(每个值位一byte)
我给其中的一些数字上了色。Number1指向byte 33所在的内存地址,Number2指向红色00的位置,Number3是绿色的62。现在,如果你在你的程序中这么写:
mov eax, Number1
它实际意为:
mov ecx, dword ptr[12033h所在的内存地址]
但这样:
mov ecx, offset Number1
意为:
mov ecx, 12033h所在的内存地址
在第一个例子中,ecx会得到Number1的内存地址的值。在第二个中,ecx会称为内存地址(offset)本身。下面的两个例子有相同的效果:
mov ecx, Number1
mov ecx, offset Number1
mov ecx, dword ptr [ecx] ( or mov ecx, [ecx])
现在让我们回到前面的例子中:
Number1 dd 12033h
Number2 dw 100h,200h,300h,400h
Number3 db " labla,0
Value dd ?
mov eax, Number1
mov ecx, offset Number2
add ax, word ptr [ecx+4]
mov Value, eax
标签可以使用像Number1,Number2和Number3等值,但它启动时包含0。因为它在未初始化data部分。这样的优点是,你在.data?中定义的所有东西不在可执行文件中而在内存中。
ManyBytes1 db 5000 dup (?)
ManyBytes2 db 5000 dup (0)
(5000dup意为:5000个副本。值db 4,4,4,4,4,4,4和值db 7dup(4)一样)
ManyBytes1不会在文件本身,只是5000个预分配在内存中的字节。但Manybytes2会在可执行文件中使文件变大5000个字节。虽然你的文件会包含5000个零,但并没有什么用。
Code部分被汇编(翻译为原始代码)并放入可执行文件中去(当然载入后在内存中)。
7.0-条件跳转
在Code部分,你可以看到像这样的标签:
mov eax, edx
sub eax, ecx
cmp eax, 2
jz loc1
xor eax, eax
jmp loc2
xor eax, eax
inc eax
(xor eax, eax意为:eax=0)
让我们来看看这些代码:
mov eax, edx;把edx放入eax中
sub eax, ecx;eax-ecx
cmp eax, 2
这有一条新指令:cmp。Cmp意为compare(比较)。它能比较两个值(寄存器,内存,直接数值)并设置Z-flag(零标志)。零标志很像carry,也是内部标志寄存器的一位。
Jz loc1
这也是条新的。它是条件跳转指令。Jz=jump if zero(如果设置了零标志就跳转)。Loc1是一个标记指令“xor eax,eax|inc eax”内存开始处offset的标签。因而jz loc1=如果设置了零标志,跳往位于loc1的指令。
Cmp eax, 2;如果eax=2设置零标志
Jz loc1;如果设置了零标志就跳转
如果eax等于2,跳往位于loc1的指令
然后有jmp loc2.这也好似一个跳转,但是是一个无条件跳转:它总是执行。上面的代码就是:
if ((edx-ecx)==2)
eax = 1;
eax = 0;
或者Basic版:
IF (edx-ecx)=2 THEN
EAX = 1
EAX = 0
7.1-标志寄存器
标志寄存器有一套标志。它们设不设置取决于计算或其他时间。我不会讨论它们的全部。只拣几个重要的说:
ZF(零标志) 当计算结果是零时该标志被设置(compare实际上是只设置标志不保存结构的减法)
SF(符号标志) 结果为负就设置
CF(carry标志) Carry标志中存放计算后最右的位。
OF(溢出标志) 标明一个溢出了的计算。如,结构和目标不匹配。
还有更多的标志(Parity, Auxiliary, Trap, Interrupt, Direction, IOPL, Nested Task, Resume, &am Virtual Mode)但因为我们不用它们,所以我不解释。
7.2-跳转系列
有一整套的条件跳转,而且它们跳转与否均取决于标志的状态。但由于大部分跳转指令有明白的名字,你甚至无需知道哪个标志要设置,例如:“如果大于等于就跳转”(jge)和“符号标志=溢出标志”一样,而“如果零就跳转”和“如果零标志=1就跳转”一样。
在下表中,“意思”指的是什么样的计算结果该跳转。“如果大于就跳转”意为:
cmp x, y
jmp 如果 x 比 y大
伪代码 意思 条件
JA Jump if above CF=0 &am ZF=0
JAE Jump if above or equal CF=0
JB Jump if below CF=1
JBE Jump if below or equal CF=1 or ZF=1
JC Jump if carry CF=1
JCXZ Jump if CX=0 register CX=0
JE (is the same as JZ) Jump if equal ZF=1
JG Jump if greater (signed) ZF=0 &am SF=OF
JGE Jump if greater or equal (signed) SF=OF
JL Jump if le (signed) SF != OF
JLE Jump if le or equal (signed) ZF=1 or SF!=OF
JMP Unconditional Jump -
JNA Jump if not above CF=1 or ZF=1
JNAE Jump if not above or equal CF=1
JNB Jump if not below CF=0
JNBE Jump if not below or equal CF=1 &am ZF=0
JNC Jump if not carry CF=0
JNE Jump if not equal ZF=0
JNG Jump if not greater (signed) ZF=1 or SF!=OF
JNGE Jump if not greater or equal (signed) SF!=OF
JNL Jump if not le (signed) SF=OF
JNLE Jump if not le or equal (signed) ZF=0 &am SF=OF
JNO Jump if not overflow (signed) OF=0
JNP Jump if no parity PF=0
JNS Jump if not signed (signed) SF=0
JNZ Jump if not zero ZF=0
JO Jump if overflow (signed) OF=1
JP Jump if parity PF=1
JPE Jump if parity even PF=1
JPO Jump if paity odd PF=0
JS Jump if signed (signed) SF=1
JZ Jump if zero ZF=1
所有的跳转指令需要一个参数:要跳往的offset。
8.0-关于数的一些事情
在大多数的编程语言中使用整数还是浮点数只取决于变量的声明。在汇编语言中,完全的不同。浮点数的计算是由特别的伪代码和FPU协处理器(浮点单元)完成的。浮点指令将会在后面讨论。先来看看一些关于整数的事情。在c语言中有signed(有符号)整数和u igned(无符号)整数。Signed是意为数有符号(+或-)。U igned总是正。找出下表中的不同(再一次的,这是一个byte的例子,它在其他大小时也同样工作)。
值 00 01 02 03 ... 7F 80 ... FC FD FE FF
无符号意义 00 01 02 03 ... 7F 80 ... FC FD FE FF
有符号意义 00 01 02 03 ... 7F -80 ... -04 -03 -02 -01
因此,在有符号数中,一个byte被分为两段:0~7F用于正值。80~FF用于负值。对于dword值,它也一样:0~7FFFFFFFh为正,80000000~FFFFFFFFh为负,正如你可能已经注意到的一样,负值的最高位有一个集合,因为它们比80000000h大。这位被称为符号位。
3.1-有符号或无符号?
你和处理器都不能看出一个值是signed还是u igned。好消息是对于加法和减法来说,一个数是signed还是u igned没有关系。
计算:-4+9
FFFFFFFC+00000009=00000005(这是对的)
计算:5-(-9)
00000005-FFFFFFF7=0000000E(这也是对的,5――9=4)
坏消息是对于乘法,除法和比较(compare)并不是这样。因此,对于signed数有特殊的乘除伪代码:imul和idiv
Imul也有一个比mul好的地方在于它可以接受直接数值:
imul src
imul src, immed
imul dest,src, 8-bit immed
imul dest,src
idiv src
它们几乎和mul,div一样,只是它们可以计算signed值。比较(compare)可以和u igned一样用。但标志作不同的设置。因此,对于符号和无符号数字有不同的jump指令:
cmp ax, bx
ja somewhere
ja是一个无符号跳转指令。如果大于就跳转。考虑这个ax=FFFFh(无符号时为FFFFh,有符号时为-1)和bx=0005h(无符号时为5,有符号时为5)。由于FFFFh在无符号时比0005大,ja指令会跳转,但如果用的是jg(指一个有符号跳转):
cmp ax, bx
jg somewhere
jg指令不会跳转,因为-1不比5大。
只要记住这点:
一个数字是有符号还是无符号取决于你怎样对待这个数。
9.0-更多的伪代码
这儿有更多的伪代码
TEST Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器。结果本身不会保存。Test用来测试一个位,例如寄存器:
test eax, 100b;b后缀意为二进制
jnz bitset
如果eax右数第三个位被设置了,jnz将会跳转。Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
test ecx, ecx
jz somewhere
如果ecx为零,Jz跳转
关于栈的伪代码 在我讲栈的伪代码之前,我会先解释什么是栈。栈是内存的一个地方,e 为指向栈的指针。栈是用来保存临时数值的地方,有两个指令来放入一个指和再把它取出来:push和pop。Push把一个指压入栈。Pop再把它弹出来。最后一个放入的值最先出来。一个值被放入栈中,栈指针步减,当它移出来的时候,栈指针步增。看这个例子:
(1) mov ecx, 100
(2) mov eax, 200
(3) push ecx ; save ecx
(4) push eax
(5) xor ecx, eax
(6) add ecx, 400
(7) mov edx, ecx
(8) pop ebx
(9) pop ecx
1、 把100放入ecx中
2、 把200放入eax中
3、 把ecx(等于100)压入栈中(第一个压入)
4、 把eax(等于200)压入栈中(最后压入)
5、 /6/7:对ecx执行操作,使ecx的值改变
8、 弹出ebx:ebx成为200(最后压入,最先弹出)
9、 弹出ecx:ecx又成为100(最先压入,最后弹出)
为了说明再压栈和弹栈时,内存中发生了什么,看下图:
Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 00 00 00 00 00 00 00 00 00
(栈在这里是初始化为0,但实际上并不是这样。ESP表示ESP指向的offset)
mov ax, 4560h
push ax
Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 00 00 60 45 00 00 00 00 00
mov cx, FFFFh
push cx
Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 FF FF 60 45 00 00 00 00 00
pop edx
Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 FF FF 60 45 00 00 00 00 00
edx现在是 4560FFFFh 了.
CALL和RET Call跳转到某段代码而且一发现RET指令就返回。你可以把它们看成在其他编程语言中的函数或子程序。例如:
……代码……
call 0455659
……更多代码……
455659处的代码:
add eax, 500
mul eax, edx
当执行这条指令时,处理器跳到455659处的代码,执行指令一直到ret为止,并返回到调用处的下一条。Call跳转到的代码被成为过程(procedure)。你可以把你反复使用的代码写进一个过程并在你每次需要它的时候调用。
更深入的细节:call把EIP(指向将要执行指令的指针)压入栈,而ret指令在它返回的时候把它弹出来。你也可以给一个call指定的参数。这是由压栈来完成的:
push something
push something2
call procedure
在一个调用的内部,参数从栈中读出并使用。注意,只在过程中需要的局部变量也储存在栈中。我不会在此深入下去,因为它可以在masm和tasm中很轻易的完称。只要记住你可以写过程,而且它们可以由参数。一个重要的地方:
eax几乎总是用来装一个过程的返回值。
对于windows函数也是如此。但然,你可以在你的过程使用其他的寄存器,但这是标准。
10.0-masm的优点
如果你不在使用masm,你可以跳过这章并尝试着转换所有的例子,或不论如何地读一下,并试着说服自己使用masm。当然,这是你的选择。但masm真的使汇编语言更容易了。
10.1-条件和循环结构
Masm有一些伪高阶的语法来简便地创建条件和循环结构:
.IF, .ELSE, .ELSEIF, .ENDIF
.REPEAT, .UNTIL
.WHILE, .ENDW, .BREAK
.CONTINUE
如果你有使用编程语言的经验(你应该有),你可能已经看到了一些像if/else的结构:
.IF eax==1
;eax等于1
.ELSEIF eax=3
; eax等于3
; eax既不是1也不是3
这种结构非常有用。你不需要和一对跳转搅在一起了,只要一个.IF语句(也不要忘记.IF和.ELSE之前的时期)。嵌套的if是允许的:
.IF eax==1
.IF ecx!=2
; eax= 1 而且 ecx 不是 2
但可以更简洁些:
.IF (eax==1 &am ecx!=2)
; eax = 1 而且 ecx 不是 2
这些是你可以使用的操作符:
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
&am 位测试
! 逻辑非
&am 逻辑与
|| 逻辑或
CARRY? carry bit set
OVERFLOW? overflow bit set
PARITY? parity bit set
SIGN? sign bit set
ZERO? zero bit set
这个语句执行一块指令知道条件为真为止:
.REPEAT ;代码在此 .UNTIL eax==1
这块代码反复执行repeat和until之间的代码,知道eax=1。
While是repeat语句的反转。它在条件为真时执行代码块:
.WHILE eax==1
;代码在此
你可以使用.BREAK语句来跳出循环
.WHILE edx==1
inc eax
.IF eax==7
如果Eax==7,while循环将停止
continue指令使repeat或While跳过下面的代码块,重新执行循环。
10.2-invoke
这是胜过tasm和nasm最大的优点。Invoke简化了过程和call的使用。
一般的格式:
push parameter3
push parameter2
push parameter1
call procedure
Invoke 格式:
invoke procedure, parameter1, parameter2, parameter3
汇编后的代码是一摸一样的,但invoke格式更简单而且更可靠。对一个过程使用invoke,你要这样定义prototype:
PROTO STDCALL testproc
声明了名为testproc,需三个DWORD大小的参数的过程。现在,如果你这么做……
invoke testproc, 1, 2, 3, 4
……masm会给你一个testproc过程需要三个参数而不是四个的错误。Masm还会做类型检查。它检查参数是否为正确的类型(即大小)
在一个invoke语句中,你可以用ADDR代替offset。这会使地址在汇编时是正确的。
过程这样定义:
testproc PROTO STDCALL
testproc proc param1
WORD, param2
WORD, param3
testproc endp
这会创建一个名为testproc,带三个参数的过程。Prototype是用来调用过程的。
testproc PROTO STDCALL
testproc proc param1
WORD, param2
WORD, param3
mov ecx, param1
mov edx, param2
mov eax, param3
add edx, eax
mul eax, ecx
testproc endp
现在,过程做了一下计算,(param1, param2, param3) = param1 * (param2 + param3).结果(返回值)存放在eax中,局部变量这样定义:
testproc proc param1
WORD, param2
WORD, param3
LOCAL var1
LOCAL var2:BYTE
mov ecx, param1
mov var2, cl
mov edx, param2
mov eax, param3
mov var1, eax
add edx, eax
mul eax, ecx
mov ebx, var1
.IF bl==var2
xor eax, eax
testproc endp
你不可以在过程外使用这些变量。它们储存在栈中而且当过程返回时移出。
10.3-宏
现在不解释宏。可能在以后的教程中,但现在它们对我们不重要。
11.0-Windows中的汇编基础
现在你已经有了一些汇编语言的基础知识,你将要学习在Windows中怎样学习汇编。
11.1-API
Windows编程的根本在于Windows API,应用程序接口。这是由操作系统提供的一套函数。每个Windows程序员都要用这些函数。这些函数在像kernel, user, gdi, shell, advapi等系统dll中。函数有两类:ANSI和Unicode。这和字符串的存储方法有关。A i中,每个字节代表一个符号(ASCI码),并用字节0代表一个字符串的结束(null-terminated)。Unicode使用宽字符格式。它的每个字节用2个字节。这允许像中文等多字符的语言的使用。宽字符串由两个0字节结束。Windows通过使用不同的函数名,同时支持A i和Unicode。
例如:
Me ageBoxA(后缀A意为a i)
Me ageBoxW(后缀W意为宽字符-unicode)
我们只使用a i型
11.2-导入dll
为了使用来自WindowsAPI的函数,你需要导入dll。这是由导入库(.lib)来完成的。这些库是必需的。因为它们使系统(Windows)能在内存的动态基地址处动态的载入dll。在Win32asm包中(win32asm.cjb.net)提供了大多数标准dll的库。你可以用masm的includelib语句装载一个库。
译者注:注意,win32asm.cjb.net被中国电信封了ip。访问请使用代理。
Includelib C:\masm32\lib\kernel32.lib
这将载入库kernel32.lib。在例子中,用这种格式:
Includelib \masm32\lib\kernel32.lib
现在你可以看到为什么汇编源文件要和masm在同一个区的原因了。你可以不改动路径为正确的区就能在其他的电脑上编译你的程序。
但你不只是需要包含库。包含文件(.inc)也是必须的。这些可以用l2inc工具由库文件自动生成。包含文件这样装载:
include \masm32\include\kernel32.inc
在包含文件中,定义了dll中函数的原型(prototypes),因而你能使用invoke。
kernel32.inc:
Me ageBoxA proto stdcall
Me ageBox textequ
你能看到包含文件内有for A i的函数而且没有‘A’的函数名字定义为与真实函数名一样:你可以用Me ageBox代替Me ageBoxA使用。在你包含了库和包含文件后,你可以使用函数了:
invoke Me ageBox, NULL, ADDR MsgText, ADDR MsgTitle, NULL
11.3-Windows包含文件
这里有一个特别的包含文件。大多数的时候统称为Windows.inc,其中包含了用于Windows API的所有常量和结构的定义。例如,消息框有不同的样式。函数的第四个参数是样式。NULL指的是MB_OK,它只有一个OK按钮。Windows包含文件有这些样式的定义:
MB_OK equ 0
MB_OKCANCEL equ ...
MB_YESNO equ ...
因此你可以把这些名字当常数来用:
invoke Me ageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_YESNO
例子将使用masm包中的包含文件:
include \masm32\include\windows.inc
11.4-框架
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\windows.inc
blahblah
blahblah
end start
这是Windows汇编源文件(.asm)的基本框架
告诉汇编器应该生成486处理器(或更高)的伪代码。你可以使用.386,但大多数情况下用.486
.model flat, stdcall
使用平坦内存模式(在前面章节中讨论了)并使用stdcall调用习惯。它的意思是函数的参数从右往左压入(最后的参数最先压入)而且函数在结束时自己清栈。这对于几乎所有的Windows API函数和dll是标准
option casemap:none
控制字符的映射为大写。为了Windows.inc文件能正常工作,这个应该为”none”
includelib
前面讨论了
include
前面也讨论了
开始data部分(看前面章节)
开始code部分(看前面章节)
end start
表示一个程序的开始的标签。它不是非得叫“start”。你可以使用任何和“end”语句后相同的标签:
startofprog:
end startofprog
12.0-第一个程序
是创建你的第一个程序的时候了。本章中的指导将这样组织:
12.1-第一步
如果万事具备,你应该在你的masm同一个区上有一个win32(或win32asm)目录。为每个工程,你应该创建一个子目录。
在win32目录中创建一个名为“Firstprogram“的子目录。创建一个新的文本文件并重命名为“first.asm”。
12.2-第二步
在first.asm中输入一下代码:
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
因为现在,我们仅需要kernel32和user32两个dll。
12.3-第三步
我们将要创建著名的“Hello World”程序。要显示“hello World”字符串,我们要用消息对话框。消息对话框由Me ageBox函数创建。你可以在《
》(看第二章)中查找这个函数。这是书上说的:
Me ageBox函数创建,显示并操作消息对话框。消息对话框包含应用程序定义的消息和标题,加上任何预定义的图标与按钮的组合。
int Me ageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // addre of text in me age box
LPCTSTR lpCaption, // addre of title of me age box
UINT uType // style of me age box
Parameters
Identifies the owner window of the me age box to be created. If this parameter is NULL, the me age box has no owner window.
Points to a null-terminated string containing the me age to be di layed.
lpCaption
Points to a null-terminated string used for the dialog box title. If this parameter is NULL, the default title Error is used.
Specifies a set of bit flags that determine the contents and behavior of the dialog box. This parameter can be a combination of flags from the following grou of flags.
[--SNIP--]
在这段文字后有所有常数和标志的列表(他们定义在windows.inc中)。因为它太长了,我没有在这里列出来。通过查看参考,你就知道Me ageBox函数要4个参数:父窗口(owner),指向消息串的指针,指向标题串的指针和消息框的类型。
HWnd可以是Null。因为我们的程序没有窗口。
LpText必须是指向我们文本的指针。这仅仅意为参数是文本所在内存地址的offset。
LpCaption 是标题串的offset。
UType 是参考中解释的像MB_OK,MB_OKCANCEL,MB_ICONERROR等值的组合。
让我们先定义两个用于Me ageBox的字符串:
在first.asm中加入:
MsgText db Hello world!,0
MsgTitle db This is a me agebox,0
.data 指示data部分的开始。用db,字节直接被插入,而且字符串又只是字节的集合,data部分会在包含上面的字符串,附加上结尾的0。MsgText装有第一个字符串的offset。MsgTitle有第二个字符串的offset。现在我们可以使用函数:
invoke Me ageBox, NULL, offset MsgText, offset MsgTitle, Null
但因为用的是invoke,你可以使用(更安全)ADDR代替offset:
invoke Me ageBox, Null, ADDR MsgText, ADDR MsgTitle, Null
我们还没有看最后一个参数,但这不会有什么问题。因为MB_OK(有一个ok按钮的消息对话框的样式)等于0(NULL)。但你也可以使用其他的任何样式。Utype(第4个参数)的定义是:
指定一系列决定对话框内容与行为的位标志。这个参数可以是下面标志组中标志的组合。
现在以我们要一个有OK按钮与“information”图标的简单消息对话框为例。MB_OK是OK按钮的样式,MB_ICONINFORMATION是information图标的样式。样式是用“or”操作符联合的。这不是or伪代码。Masm会在汇编前处理or操作。不用or,你可以用+号(加号)代替,但有时对层叠样式有问题(一个样式包含其他一些样式)。但在本例中你也可以用+号。
invoke Me ageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK + MB_ICONINFORMATION
end start
把以上的代码加入到你的first.asm文件中。
我们还加入了一个start标签。如果你现在汇编你的程序并运行它,它将显示一个消息对话框但很有可能在你点OK之后就崩溃了。这是因为程序没有结束,而处理器开始执行Me ageBox代码后的任何东西。Windows中程序是用ExitProce 函数结束的:
VOID ExitProce (
UINT uExitCode //对于所有线程的退出代码 );
我们可以把0用作退出码。
把你的代码改成这样:
invoke Me ageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK + MB_ICONINFORMATION
invoke ExitProce , NULL
end start
12.4-第4步
因此我们最终的程序是:
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
MsgText db Hello world!,0
MsgTitle db This is a me agebox,0
invoke Me ageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProce , NULL
end start
12.5-第5步
现在我们将从源代码产生可执行文件。
用一下内容新建一个文本文件并命名为make.bat:
@echo off
ml /c /coff first.asm
link /su ystem
indows first.obj
pause> ul
解释:
ml /c /coff first.asm
Ml是宏汇编器(masm)。Masm将从程序创建原始代码。参数的意思是: /c =汇编不链接(因为我们用link.exe来做这项工作) /coff = 产生COFF格式的object(对象)文件,这是Windows可执行文件的标准格式。 first.asm = a汇编first.asm文件
link /su ystem
indows first.obj
链接器把object文件和所有导入的dll与库链接起来: /su ystem
indows = 创建Windows的可执行文件。 first.obj = 链接 first.obj
如果你把所有的事情都正确的完成了,并运行批处理文件。将产生first.exe。运行它,看看有什么结果。
13.0-Windows中的窗口
在本章中,我们将创建一个有窗口的程序
13.1-窗口
你可能已经猜到了Windows之所以称为Windows的原因了。在Windows中,有两种程序:GUI程序和控制台程序。控制台模式的程序看上去就像Dos程序,它们在一个似-dos的窗口中运行。你使用的大多数程序是GUI(图形用户界面)程序,它们有一个用于和用户交互的图形界面。这是由创建窗口来完成的。几乎你在Windows中看见的每一件东西都是窗口。首先,你创建一个父窗口,然后是像编辑框,静态控件(文本标签-译者注),按钮等的自窗口(控件)。
13.2-窗口类
每一个窗口都有名字。你为你的父窗口定义你自有的类。对于控件,你可以使用Windows的标准类名(例如,“Edit”,“Static”,“Button”)
13.3-结构
你程序中的窗口类是用“RegisterCla Ex“函数注册的。(RegisterCla Ex是RegisterCla 的扩展版本,后者已经不太使用了)这个函数的声明是:
ATOM RegisterCla Ex(
CONST WNDLCASSEX *lpwcx//有类数据的结构之地址
lpwcx:指向WNDCLASSEX结构。在把它传递给函数之前,你必须用适当的类属性填写结构。
唯一的参数是指向结构的指针。先来看看一些结构的基本知识:
一个结构是一些变量(数据)的集合。它用STRUCT定义:
SOMESTRUCTURE STRUCT
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
SOMESTRUCTURE ENDS
(结构名不一定要大写)
你可以用问号把你的变量定义在未初始化data部分。现在你可以根据定义创建一个结构:
Initialized
Initializedstructure SOMESTRUCTURE 100,200,10,'A',90h
Uninitialized
UnInitializedstructure SOMESTRUCTURE
在第一个例子中,创建了一个新的结构(用初始化了的结构保存它的offset),而且结构的每一个元素用初始化数值填写了。第二个例子只是告诉masm为结构名分配内存,而且每个数据元素用0初始化。在创建了结构之后,你可以在代码中使用它:
mov eax, Initializedstructure.some_word
; eax现在是 10
inc UnInitializedstructure.dword1
; 结构的dword1步增
结构是这样存在内存中的:
内存地址 内容
offset of Initializedstructure 100 (dword, 4 bytes)
offset of Initializedstructure + 4 200 (dword, 4 bytes)
offset of Initializedstructure + 8 10 (word, 2 bytes)
offset of Initializedstructure + 10 65 or 'A' (1 byte)
offset of Initializedstructure + 11 90h (1 byte)
12.3-WNDCLASSEX
现在已经了解了足够多的结构知识,让我们处理RegisterCla Ex吧。在《
》中,你可以查找WNDCLASSEX结构的定义。
typedef struct _WNDCLASSEX { //
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hI tance;
HICON hIco HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR l zMenuName;
LPCTSTR l zCla Name;
HICON hIconSm;
} WNDCLASSEX;
WNDCLASSEX结构体的大小。用于Windows的认证。你可以用SIZEOF得到它的大小: mov wc.c ize, SIZEOF WNDCLASSEX
为类指定一个样式(如果窗口要有滚动条,加上重画标志。等等)
lpfnWndProc
指向Windows Procedure的指针(本章后面有更多内容)
cbClsExtra
在Windows类结构后本配多少额外内存。对我们不重要
cbWndExtra
在Windows实例后分配多少额外内存。对我们也不重要
hI tance
你程序的实力句柄。你可以用GetMoudleHandle函数得到这个句柄
窗口图标资源的句柄
hCursor
窗口光标资源的句柄
hbrBackground
用于填充背景的画刷句柄,或是标准刷子类型中的一个,如 COLOR_WINDOW, COLOR_BTNFACE , COLOR_BACKGROUND.
l zMenuName
指向一个指定菜单类名的零结尾字符串
l zCla Name
指向一个指定窗口类名的零结尾字符串
hIconSm
一个和窗口类关联的小图标句柄
在你的Win32文件夹中创建一个名为firstWindow的文件夹并在这个文件夹中创建一个名为window.asm的新文件,输入一下内容:
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
然后创建一个名为make.bat的.bat文件。把这些文本粘贴进去:
@echo off
ml /c /coff window.asm
link /su ystem
indows window.obj
pause> ul
从现在开始,为了节省空间,仅显示小段的代码。你可以通过点来显示教程此处的全部代码。完整的代码在新窗口中显示。
译者注:为了方便,我又把这些放回来了。
13.4-注册类
现在我们在名为WinMain的过程中注册类。该过程中完成窗口的初始化。
把这些加入你的汇编文件:
WinMain PROTO STDCALL
hI tance dd ?
invoke GetModuleHandle, NULL
mov hI tance, eax
invoke WinMain, hI tance, NULL, NULL, SW_SHOWNORMAL
end start
这些代码通过GetModuleHandle得到模块句柄,并把模块句柄放入hI tance变量中。这个句柄在Windows API中频繁使用。然后它调用WinMain过程。这不是一个API函数,而是一个我们将要定义的过程。原型是:WinMain PROTO STDCALL
WORD,因而是一个带4个参数的函数:
现在把这些代码放在end start:前
WinMain proc hI t
WORD, hPrevI t
WORD, CmdLine
WORD, CmdShow
WinMain endp
你根本就不需要用这个winmain过程,但这是一种十分普遍的处世化你的程序的方法。Visual C自动初始化这个函数的参数,但我们必须自己来做。现在不要管hPrevI t和CmdLine。集中注意在hI t和CmdShow上。Hi t是实例句柄(=模块句柄),CmdShow是定义窗口该如何显示的标志。(你可以在API参考关于ShowWindows部分发现更多)
在前面代码中的invoke WinMain, hI tance, NULL, NULL, SW_SHOWNORMAL用正确的实例句柄和显示标志调用这个函数。现在我们可以在WinMain中写我们的初始化代码了。
WinMain proc hI t
WORD, hPrevI t
WORD, CmdLine
WORD, CmdShow
LOCAL wc:WNDCLASSEX
LOCAL hwnd
WinMain endp
这有我们将在过程中要用的两个局部变量
Cla Name db FirstWindowCla quot;,0
WinMain proc hI t
WORD, hPrevI t
WORD, CmdLine
WORD, CmdShow
LOCAL wc:WNDCLASSEX
LOCAL hwnd
; now set all the structure members of the WNDCLASSEX structure wc:
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hI t
pop wc.hI tance
mov wc.hbrBackground,COLOR_WINDOW
mov wc.l zMenuName,NULL
mov wc.l zCla Name,OFFSET Cla Name
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterCla Ex, ADDR wc
WinMain endp
让我们来看看发生了什么:
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
初始化了结构的大小(这是RegisterCla Ex要求的)。设置类的样式为”CS_HREDRAW or CS_VREDRAW”,然后设置了窗口过程的offset。你在后面会知道什么是窗口过程,现在你仅需要记住你需要WndProc过程的地址。该地址可以通过“offset WndProc”获得。Cb.ClsExtra和cb.WndExtra我们没有使用因而设它们为Null。
Push hI t
Pop wc.hI tance
Wc.hI tance设为WinMain的hI t参数。为什么我们不用:mov wc.hI tance, hI t?因为mov指令不允许从一个地址移到另一个地址。通过push/pop,值被压入栈,然后又弹入目标中。
mov wc.hbrBackground, COLOR_WINDOW
mov wc.l zMenuName, NULL
mov wc.l zCla Name, OFFSET Cla Name
类的背景色被设为COLOR_WINDOW,没有定义菜单(null)而且l zCla Name设为一个指向零结尾的类名字符串:“FirstWindowCla ”它应该是一个在你的程序中定义的唯一名字。
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
窗口需要一个图标。但又因为我们要一个指向图标的句柄,我们使用LoadIcon来载入图标并获得句柄。LoadIcon有两个参数:hI tance和lpIconName。HI tance是包含图标的可执行文件的模块句柄。LpIconName是一个指向图标资源和图标ID的字符串的指针。如果你用NULL为hI tance,你可以从一些标准图表中选这一个(这却是是因为我们在这里还没有图标资源)hIconSm是小图标,你可以对它使用相同的句柄。
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
对光标也一样。NULL作hI tance,并用一个标准光标类型:IDC_ARROW,标准Windows箭头型光标。
invoke RegisterCla Ex, ADDR wc
现在,最终用RegisterCla Ex来注册类,通过一个指向WNDCLASSEX结构的指针作参数。
13.5-创建窗口
现在,你已经注册了一个类,你可以使用它创建一个窗口:
HWND CreateWindowEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpCla Name, // pointer to registered cla name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu, or child-window identifier
HINSTANCE hI tance, // handle to a lication i tance
LPVOID lpParam // pointer to window-creation data
DwExstyle和dwStyle是两个决定窗口样式的参数。
LpCla Name 是一个指向你注册了的类名的指针。
LpWindowName 是你窗口的名字(如果有的话,这将成为你窗口的标题)
X, Y, nWidth, nHeight 决定你窗口的位置和大小
HMenu 是菜单窗口的句柄(在后面讨论,现在为空)
HI tance 是程序实例的句柄
LpPararm 是你能在你的程序中使用的扩展值
A Name FirstWindow,0
INVOKE CreateWindowEx,NULL,ADDR Cla Name,ADDR A Name,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,400,300,NULL,NULL,\
hI t,NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
(注意\使汇编器读下一行的时候好像还在同一行)
我们的代码将用我们刚刚注册的类名创建一个新的窗口。标题是“FirstWindow”(程序名,A Name),样式是WS_OVERLAPPEDWINDOW,这是一个创建有标题,系统菜单,可缩放边框和最大化/最小化按钮的窗口样式。CW_USERDEFAULT作为x和y的位置会使Windows为新窗口使用缺省位置。窗口的(初始)大小是400×300象素。
函数的返回值是窗口句柄,HWND。它储存在局部变量hwnd中。然后窗口用ShowWindow显示。UpdateWindow确保窗口被画出。
13.6-消息循环
窗口可
收藏: @ 2004-07-30 13:17
编置内核包含两大项内容,即配置内核和编译内核。这两项工作需要经常查看内核的文档,至少要查看Readme文件和Documentation目录下的Changes文件。它们对内核进行了描述,比如升级内核可能出现的问题和内核对系统中工具的版本要求等。Linux内核的编制方法下面将做具体说明。
下载与解压
首先需要将内核源码下载到/usr/src/目录下面。如果压缩格式是gzip,那么执行如下命令:
#tar xzvf linux-2.4.23.tar.gz
如果是bzip2格式,则执行如下命令:
#tar xjvf linux-2.4.23.tar.bz2
这时会建立Linux-2.4.23内核源代码树。进入该目录,并确保今后的所有操作都在这个目录下完成。
配置内核
有了要编译配置的内核,先来介绍怎么样配置内核。具体的步骤分为一下几步:
1.在开始配置内核之前,首先需要通过下面的命令清除所有的临时文件、中间件和配置文件。对于一个刚从网上下载的内核来说,它肯定是干净的,这么做只会多此一举。但是这是一个良好习惯,而且不会有坏结果。
#make mrproper
2. 然后要了解自己系统的硬件配置情况,比如CPU的类型、主办芯片、显卡和声卡的型号等。
3. 配置内核选项,用到的命令是:
#make config_opt
用到的配置工具有:
◆ config 基于交互式的文本配置界面。每个问题以线形格式出现,并被一个一个地回答,而且一旦作出了回答就不能再修改了。
◆ oldconfig 同config相似,但是使用原有的配置文件,而且只会提问有关新内核特性的问题,对于内核升级很方便。
◆ menuconfig 一个文本模式、选单驱动的配置界面。
◆ xconfig 基于Tcl/Tk的X图形配置界面。
现在开始配置内核,使用的工具为menuconfig。在命令行模式下执行下面的命令:
#make menuconfig
在闪过几行字之后就出现了如图1所示的界面。
图1 内核配置界面
使用方向键在各选项间移动;使用“Enter”键进入下一层选单;每个选项上的高亮字母是键盘快捷方式,使用它可以快速地到达想要设置的选单项。在括号中按“y”将这个项目编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返回到上层选单。
注意,如果“make menuconfig”命令失败,很可能是ncurses库没有***。
内核的配置选项很多,这里就主要选项进行简要说明,使大家能根据自己的情况,进行内核定制。如果某些项把握不准,可以参考documentation/Configure.help文件,也可搜索整个系统,并查看相关的选项都在哪些文件中出现了。接下来就是个选项的配置说明情况。
◆ Loadable module su ort(可加载模块支持)。其中“Enable loadable module su ort”选项可让内核支持模块;“Module unloading”选项可以让用户卸载不再使用的模块,如果不选的话用户将不能卸载任何模块(注意,有些模块一旦加载就不能卸载,与是否选择了此选项无关);“Module versioning su ort(EXPERIMENTAL)”选项允许用户可以使用其它版本内核中编译的模块,不过并不可靠,所以一般不选择它;“Automatic kernel module loading”选项允许内核自动调用“modprobe”命令来加载需要的模块。
模块是一小段代码,编译后可在系统内核运行时被动态地加入内核,从而为内核增加一些特性或对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以缩小内核的体积。在运行时可以使用“modprobe”命令把模块加载到内核中去(在不需要时还可以卸载它)。
◆ Set version infomation on all symbols for modules(CONFIG_MODVERSIONS)是有关内核模块版本控制的选项。如果用户打算开发内核模块代码(包括当前内核源码树中之外的任何模块代码),就开启这个设置。一般的用户可以关闭。
◆(Pentium-III/Celeron(Co ermine))Proce or family用来选择CPU类型。它允许内核使用高级处理器内部的特殊指令。当然,如果用户的CPU是80386,就没必要选择P4。但是如果实在不知该怎么选择,就选386。这时如果用户使用高级的CPU,内核的运行速度会比它应有的速度慢,但至少它能够运行。建议使用Help和/proc/cpuinfo获得更多的帮助。
◆ High Memory Su ort (CONFIG_NOHIGHMEM)使内核支持大内存。通常情况下内核只支持1GB内存(实际情况是896MB,它与vmalloc()的实现有关,这超出了我们的讨论范围)。如果用户的内存数量超过了896MB,请选择内核对4GB内存的支持,甚至64GB内存的支持。
◆ Symmetric multi-proce ing su ort(CONFIG_SMP)使内核支持多处理器。如果用户有多于一个CPU,那么一定要选这项。
◆ Maximum number of CPUs(2-32)用以选择处理器数量。对于单CPU用户来说,选多少都没有意义。
◆ General setup表示通用配置。这里可设置内核对虚拟内存的支持和为System V的进程提供通信机制;通过“Sysctl su ort”选项可以动态地更改一些核心参数与变量,而不需要重新启动系统。
◆ File systems(文件系统)。这里的内容很多,建议在缺省的基础上进行修改。一般需要DOS FAT(FAT16、FAT32)、VFAT,EXT3、NTFS和ISO9660(标准光盘使用的文件系统)支持。
介绍完这些内核配置的主要选项,用户在根据自己的要求配置好内核之后,接下来就要编译内核。
◆ Power management optio (ACPI、APM)是高级电源管理。要注意ACPI与APM不能同时使用。如果同时配置了这两者,那么在系统启动时,若发现一个可工作的ACPI设备,那么APM将被关闭,ACPI会被加载。
如果想让Linux支持高级电源管理,例如软关机、系统休眠等,需要选择“Power Management su ort”选项;“Software Su end(EXPERIMENTAL)”选项可以挂起计算机(类似Windows XP中的休眠),这个功能不需要高级电源管理的支持;“Proce or”选项可让处理器在空闲时节省电能,应该选上;“Thermal Zone”选项在系统温度过高时,及时调整系统的工作状态,以保护CPU(需要硬件的支持)。
◆ Bus optio (PCI、PCMCIA、EISA、MCA和ISA)用以设置系统总线。根据主板参数自己进行选择。针对PCI总线的是“PCI su ort”选项,下面还有ISA和EISA子项,一般都是需要的;“Su ort for hot-pluggable devices”选项是对热插拔设备的支持;“PCMCIA/CardBus su ort”选项支持PCMCIA。
◆ Executable file formats表示可执行文件格式,一般全要选上。
◆ Device Drivers用来选择设备驱动程序。声卡、显卡、网卡和电视卡等驱动都在这里选择。其中“Plug and Play su ort”选项支持即插即用;“Block devices”选项支持块设备;“SCSI device su ort”选项支持SCSI 设备;“Multi-device su ort(RAID and LVM)”选项支持RAID和逻辑卷;“Networking su ort”选项支持网络,包括网络协议和网络设备,协议中肯定要“TCP/IP”项,根据自己的网卡选择相应的设备;ISDN上网必需选“ISDN su ystem”选项;“Sound”选项是声卡驱动,有两种选择,一种是ALSA驱动,一种是Open Sound System驱动,选择支持自己声卡的那种,将之编译进内核;“USB Su ort”选项该项很重要,平常用的优盘就是一种USB设备;对USB而言,至少需要“Su ort for USB”、“USB device filesystem”、“ECHI HCD(USB 2.0)su ort”、“UCHI HCD(most Intel and VIA)su ort”、“USB Audio su ort”、“USB MIDI su ort”和“USB Ma Storage su ort”选项。
执行了“make ”之后,系统会在include/linux目录下生成一个autoconf.***件。例如,在配置内核选项时选择支持NTFS文件系统,并把它编译进了内核,那么在.config中就会生成“CONFIG_NTFS_FS=y”这项,相应的在include/linux/autoconf.h中会生成“#define CONFIG_NTFS_FS 1”这项。因此所有与NTFS文件系统相关的C源文件都会包含include/config/ntfs/fs.h这个头文件。
新的2.6.0内核中增加了两个GUI配置工具,要使用xconfig必需先***Qt库(一般发行版的光盘里都有),要使用gconfig就要先***Gtk库。
在启动配置工具时,2.6.0内核会读取当前的系统配置,从而保持与当前配置相同的选项。这个特性是为方便以后的升级工作,在内核特性变化不大的情况下可以直接以当前的选项为基础,省去了逐项配置的麻烦。有两种方法可以让2.6.0内核以默认选项来启动配置工具,一种是将当前的配置文件/boot/config-XXX删除;另一种是在执行配置工具前先执行“make defconfig”命令。
除此之外,还为make添加了几个新选项,是allyesconfig、allnoconfig和allmodconfig。它们是为内核开发人员与测试人员准备的。
用户根据自己的要求配置好内核之后,接下来就要编译内核。
编译内核
编译内核的软件环境是kbuild系统,它泛指构建一个完整并能够运行的Linux内核所需要的一切资源。这些资源包括构建程序、脚本、中间件、配置文件和Makefile。现在就讲解内核的编译过程,具体步骤如下:
1.“make dep”或“make depend”
kbuild调用中间件scripts/mkdep来生成描述与相关核心文件形成依赖关系的.***件(绝大多数)列表。这个列表保存在.depend中。用户即使不执行这一步,kbuild也会自动执行的。
2. 构建内核镜像的命令是:
#make < oot_opt
其参数如下:
◆ zImage 构建小内核镜像。
◆ compre ed 同zImage。
◆ bzImage 构建大内核镜像。
◆ zdisk 使用zImage生成一张引导软盘。
◆ bzdisk 使用bzImage生成一张引导软盘。
◆ zlilo 使用lilo作为zImage的引导器。
◆ bzlilo 使用lilo作为bzImage的引导器。
根据实际情况选择内核境象类型,大多数情况下选择“make bzImage”。
2.6.0内核的kbuild系统与2.4.23比起来有一定的差异,但是绝大多数功能都是相似的。只是构建内核镜像的命令参数增加了一下几项:
◆ fdimage 制作一张1.44M的引导软盘
◆ fdimage144 同fdimage
◆ fdimage288 制作一张2.88M的引导软盘
3.通过下面的命令***内核:
#make i tall
如果用户使用LILO,它会把内核镜像放到正确的位置并且修改LILO的配置,那么用户可以免去手动操作。如果使用别的引导器(例如GRUB),那么不使用这个命令。因为修改grub.conf需要交互式的手动编辑,自动修改可能会带来一些不可预计的错误,所以编译完毕后用户需要进行一些手动操作(见下面第6步)。
在2.6.0中“make i tall”更加智能,它会依此将arch/i386/boot/bzImage、System.map复制为/boot/vmlinuz-2.6.0,/boot/System.map-2.6.0,并创建vmlinuz-2.6.0的软链接vmlinuz和System.map-2.6.0的软链接System.map。kbuild还会自动创建/boot/initrd-2.6.0.img,并且修改grub.conf,以前这一切都要手动才能完成。引用别人的话来说:“2.4.x还是半自动的,而2.6.x是全自动的。”
4. 用下条命令编译所有被配置为模块的内核组件:
#make modules
5. 把所有编译好的内核模块按照功能拷贝到/lib/modules/2.4.23/目录下,使用下面命令:
#make modules_i tall
6. 手动操作将内核境像文件(/linux/arch/i386/boot/bzImage)拷贝到/boot分区,然后修改LILO或GRUB的相关设置。这里以grub.conf为例:
default=0
timeout=10 lashimage=(hd0,1)/grub/image/37.xpm.gz
title kernel-2.4.22
root (hd0,1)
kernel/vmlinuz-2.4.22 ro root=oot=LABEL=/ initrd /initrd-2.4.22.img
title kernel-2.4.23 root (hd0,1) kernel /vmlinuz-2.4.23 ro root=/dev/hda1 initrd /initrd-2.4.23.img
title kernel-2.6.0 root (hd0,1) kernel /vmlinuz-2.6.0 ro root=/dev/hda1 initrd /initrd-2.6.0.img
注意,在2.4.23之前的内核,通常制定LABEL参数,但是对于2.4.23和2.6.0内核,这个参数已经被废弃了,使用root参数指定根文件系统的位置。
如果重新启动后出现“kernel panic”错误或显示应该修改“init”信息,则基本都是以上kernel语句错误。
根据发行版的不同,通常GRUB配置文件会在/etc/grub.conf、/boot/grub/menu.lst或/boot/grub/grub.conf三个地方。
7.最后将在编译过程中的垃圾文件进行清理,命令如下:
#make clean
/ 文件夹:
收藏: @ 2004-07-30 13:16
本文译自《
》(第三版) 一书的第27章: Programming in C. 关于本译文有任何的话请与我联系: mailto:con@nease.net.
linux的发行版中包含了很多软件开发工具. 它们中的很多是用于 C 和 C++应用程序开发的. 本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具. 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程. 在本文中你将学到以下知识:
* 什么是 C
* GNU C 编译器
* 用 gdb 来调试GCC应用程序
你也能看到随 linux 发行的其他有用的 C 编程工具. 这些工具包括源程序美化程序(pretty print programs), 附加的调试工具, 函数原型自动生成工具(automatic function prototypers).
注意: 源程序美化程序(pretty print programs)自动帮你格式化源代码产生始终如一的缩进格式.
什么是 C?
C 是一种在 UNIX 操作系统的早期就被广泛使用的通用编程语言. 它最早是由贝尔实验室的 De is Ritchie 为了 UNIX 的辅助开发而写的, 开始时 UNIX 是用汇编语言和一种叫 B 的语言编写的. 从那时候起, C 就成为世界上使用最广泛计算机语言.
C 能在编程领域里得到如此广泛支持的原因有以下一些:
* 它是一种非常通用的语言. 几乎你所能想到的任何一种计算机上都有至少一种能用的 C 编译器. 并且它的语法和函数库在不同的平台上都是统一的, 这个特性对开发者来说很有吸引力.
* 用 C 写的程序执行速度很快.
* C 是所有版本的UNIX上的系统语言.
C 在过去的二十年中有了很大的发展. 在80年代末期美国国家标准协会(American National Standards I titute)发布了一个被称为 ANSI C 的 C 语言标准.这更加保证了将来在不同平台上的 C 的一致性. 在80年代还出现了一种 C 的面向对象的扩展称为 C++. C++ 将在另一篇文章 C++ 编程中描述.
linux 上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上, 因此可以自由发布. 你能在 Linux 的发行光盘上找到它.
GNU C 编译器
随 Slackware linux 发行的 GNU C 编译器(GCC)是一个全功能的 ANSI C 兼容编译器. 如果你熟悉其他操作系统或硬件平台上的一种 C 编译器, 你将能很快地掌握 GCC. 本节将介绍如何使用 GCC 和一些 GCC 编译器最常用的选项.
使用 GCC
通常后跟一些选项和文件名来使用 GCC 编译器. gcc 命令的基本用法如下:
gcc [optio ] [filenames]
命令行选项指定的操作将在命令行上每个给出的文件上执行. 下一小节将叙述一些你会最常用到的选项.
GCC 选项
GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的 GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数 linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的:
gcc -p -g test.c
gcc -pg test.c
第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息.
当你不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件. 例如, 下面的命令将在当前目录下产生一个叫 a.out 的文件:
gcc test.c
你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令:
gcc -o count count.c
注意: 当你使用 -o 选项时, -o 后面必须跟一个文件名.
GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉 GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理. 缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名.
-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.
优 化 选 项
当你用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化. 有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和 -O2 选项.
-O 选项告诉 GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用 -O 时慢. 但通常产生的代码执行速度会更快.
除了 -O 和 -O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用. 这些选项的详细描述, 请参考 GCC 的指南页, 在命令行上键入 man gcc .
调试和剖析选项
GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是 -g 和 -pg 选项.
-g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使 -g 和 -O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被 GCC 作了改动. 关于调试 C 程序的更多信息请看下一节用 gdb 调试 C 程序 .
-pg 选项告诉 GCC 在你的程序里加入额外的代码, 执行时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况. 关于 gprof 的更多信息请参考 gprof 一节.
用 gdb 调试 GCC 程序
linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能:
* 它使你能监视你程序中变量的值.
* 它使你能设置断点以使程序在指定的代码行上停止执行.
* 它使你能一行行的执行你的代码.
在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容:
GDB is free software and you are welcome to distribute copies of it
under certain conditio type " how copying to see the conditio .
There is a olutely no warranty for GDB; type " how warranty for details.
GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc.
当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行 gdb :
gdb fname
当你用这种方式运行 gdb , 你能直接指定想要调试的程序. 这将告诉gdb 装入名为 fname 的可执行文件. 你也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连. 你可以参考 gdb 指南页或在命令行上键入 gdb -h 得到一个有关这些选项的说明的简单列表.
为调试编译代码(Compiling Code for Debugging)
为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联.
在编译时用 -g 选项打开调试选项.
gdb 基本命令
gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页.
表 27.1. 基本 gdb 命令.
命 令 描 述
file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
list 列出产生执行文件的源代码的一部分.
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部.
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变.
break 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIX shell 命令.
gdb 支持很多与 UNIX shell 程序一样的命令编辑特征. 你能象在 bash 或 tcsh里那样按 Tab 键让 gdb 帮你补齐一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹配的命令. 你也能用光标键上下翻动历史命令.
gdb 应用举例
本节用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当的简单, 但它展示了 gdb 的典型应用.
下面列出了将被调试的程序. 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出.
#include < tdio.h
main ()
char my_string[] = hello there" my_print (my_string);
my_print2 (my_string);
void my_print (char *string)
printf (The string is %s , string);
void my_print2 (char *string)
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++)
string2[size - i] = string
string2[size+1] = `
全文结束 /
/ 文件夹:
收藏: @ 2004-06-10 19:59
*** 服务器的通用配置
雇员的 *** 远程访问
按需的分支机构
持续的分支机构
业务伙伴的 Extranet
使用 RADIUS 身份验证的拨号和 ***
使用公用和专用网络创建的网络连接称为虚拟专用网络 (***)。在这个方案中,一个虚构的公司 Electronic, Inc. 已部署 Windows 2000 点对点隧道协议 (PPTP) 和第 2 层隧道协议 (L2TP) *** 技术来创建安全远程访问、分支机构和业务伙伴连接的解决方案。本白皮书介绍了 Electronic, Inc. 的 *** 和拨号远程访问基础结构的设计和配置。
本白皮书介绍了如何使用 Windows 2000 操作系统为一个虚构的公司配置通用虚拟专用网络方案。尽管您的网络配置可能与这里描述的不同,但仍然可以在您的网络环境中应用虚拟专用网络的基本概念。
使用公用和专用网络创建的网络连接称为虚拟专用网络 (***)。
虚拟专用网络 (***) 是专用网络的扩展,它包括的链接跨 Internet 这样的共享或公用网络。使用 ***,您可以用模拟点对点专用链接的方式通过共享或公用网络在两台计算机之间传送数据。虚拟专用网络连接工作是创建和配置虚拟专用网络。
为模拟点对点链接,数据被提供路由信息的头封装或包裹起来,路由信息使得数据能够穿越共享或公用网络而到达它的终点。为模拟专用连接,数据被加密以实现保密。没有加密密钥,在共享或公用网络上截获的数据包是无法破译的。封装并加密专用数据的链接是虚拟专用网络 (***) 连接。
Electronic, Inc. 是一个虚构的电子设计和制造公司,它的总部在纽约,并在美国各地有分支机构和分发业务伙伴。Electronic, Inc. 使用 Windows 2000 操作系统实现了一个 *** 解决方案来连接远程访问用户、分支机构和业务伙伴。
位于企业总部的 *** 服务器提供远程访问和路由器到路由器的 PPTP 和 L2TP *** 连接。此外,*** 服务器还提供到 Intranet 和 Internet 位置数据包的路由。
根据 *** 服务器的通用配置,介绍以下虚拟专用网络方案:
雇员的 *** 远程访问。
按需的分支机构访问。
持续的分支机构访问。
业务伙伴的 Extranet。
使用 RAD

参考资料

 

随机推荐