接着外挂教程 VB 从零开始编外挂
需要VBAPI函数: FindWindow←寻找窗口列表中第一个符合指定条件的顶级窗口 GetWindowThreadProcessId←获取与指定窗口关联在一起的一个进程和线程标识符 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相关API声明: FindWindow ↓ PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong GetWindowThreadProcessId ↓ PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong) AsLong -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Label、Timer --------------------------------------------------------------------------------------------------------------------------------------------------------自定义函数: DimhwndAsLong --------------------------------------------------------------------------------------------------------------------------------------------------------源代码: PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong)AsLong PrivateSubTimer1_Timer() DimhwndAsLong''储存FindWindow函数返回的句柄 hwnd=FindWindow(vbNullString,"WindowsMediaPlayer")''取得进程标识符 ''只要把WindowsMediaPlayer换成游戏的名称就可了! Ifhwnd=0Then Label1.Caption="游戏未运行" Else Label1.Caption="游戏已运行" EndIf EndSub 相信大家,在制作游戏外挂的时候,都会用到FPE、金山游侠、GE修改器、GameMaster8.0等等这些软件,但是如今的网络游戏基本上都加了NP,下面来了解一下NP。知己知彼,百战不殆嘛! 什么是nProtect? nProtect是设计用于保护个人电脑终端不被病毒和黑客程序感染的新概念的基于网络的反黑客和反病毒的工具。他帮助确保所有输入个人电脑终端的信息在网络上不落入黑客手中。在最终用户在执行电子贸易时,可以通过将nProtect配置在那些提供电子商务、进口贸易,电子贸易的金融机构的网站上,来提高安全等级。nProtect怎样工作?nProtect是一种基于服务器端的解决方案并且当那些需要保护的任何网络应用被运行时而自动启动。nProtect被载入内存,所以最终用户不需要安装任何应用程序,只要nProtect启动,就开始拒绝黑客工具和病毒的入侵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面介绍它如何工作: 用户登陆时nProtect自动启动。 浏览器确认和自动安装安全模块到用户的个人电脑。扫描黑客工具和病毒通知用户目前的安全状态如果有黑客工具和病毒尝试删除在被入侵时端驻留内存来锁定黑客工具直到电脑或者nProtect关闭。 可恶的韩国人,把这个加进了网络游戏。我只能说:“呸!” -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面讲讲躲过NP的扫描的几个方法: 一、FPE篇 台湾人开发的东西,哎。出名了的,没办法谁叫它这么好呢! 1.先装一个FPE把,呵呵←这个是废话! 2.不要把安装程序删除,按照:开始→运行→regedit→HEKY_LOCAL_MACHINE→SOFTWARE →jaw→FPE打开!(问:有什么用?答:修改呀!) 3.运行FPE,然后在搜索里面输入''jaw''(一定要家'''')一般是6个地址,然后全部都选中输入: 313131c313131(意思就是111,两边多输入31就是1111!)不要关FPE!(关了就完了!) 4.修改注册表,把注册表里面的jaw、FPE(FPE的是全改)关闭FPE出现对话框。(什么鸟语不认识!呵呵) 5.将现在FPE的文件夹修改为1112000(原来是FPE2000撒),把FPE.exe修改为111.exe 6.然后重新安装一次FPE也把那个DLL文件复制到你修改过的FPE文件目录下!(呵呵!) 7.开FPE进游戏里面乱来拉!哈哈 -------------------------------------------------------------------------------------------------------------------------------------------------------- 二、任务管理器篇 比尔·盖茨那崽儿设计的东西,还可以在这上面派上用场!(问:是什么东西?答WINDOWS自带的撒!呵呵!) 1.首先用快捷键Ctrl+Alt+Delete/.打开任务管理器 2.查看进程,一般垃圾点的网络游戏会出现多的进程。你就杀了就行了! 3.没有多的进程怎么办?BIN这个是大多数网络游戏都有的把,官方的登陆器和私服的登陆器一样的,都是调用BIN进入游戏。登陆器打开后,更新完毕。点击运行游戏,间隔几秒杀掉登陆器的进程(这个要看你自己的计算机配置如何了,可能是2秒、可能是10秒!反正不超过15秒)这样就可以闭屏NP拉! 呵呵又可以乱来了! -------------------------------------------------------------------------------------------------------------------------------------------------------- 三、直接篇 直接篇说白了就不用任何东西!怎么做?跟着我眼镜来撒! 《封神榜》知道把?(答:不知道!反答:去死!)它的保护是有的,官方都已经公布了 但是有些人说《封神榜》没NP,(注意:NP现在就是保护的代名词了!)别听那些人的! 首先,运行登陆器(更新的那个)进入游戏。关闭用登陆器进入的游戏马上运行Game.exe 呵呵,没NP了。FPE等东西可以乱来了。魔法叠加、免负重等等都可以实现! 还有一种就是DAT文件或者BIN文件直接修改为EXE。呵呵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 四、编程篇(VB、VC、DELPHI等等!) 怎么办呢?呵呵,我不懂怎么编VC和DELPHI的。***我就喜欢VB怎么着? VB可以简单的实现虚拟nProtect的消息发送。具体的就不说了! 一句话虚拟nProtect消息(你不等于没说嘛!)-_-!呵呵这个嘛......! 代码就不写了,麻烦。就像用WPE这些发包一样的原理 躲避了NP的扫描现在就可以模拟了! -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VBAPI函数: keybd_event←函数模拟了键盘行动 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相关API声明: keybd_event ↓ PrivateDeclareSubkeybd_eventLib"user32"(ByValbVkAsByte,ByValScanAsByte,ByValdwFlagsAsLong,ByValdwExtraInfoAsLong) -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Timer(interval不为空) -------------------------------------------------------------------------------------------------------------------------------------------------------- 代码: PrivateDeclareSubkeybd_eventLib"user32"(ByValbVkAsByte,ByValScanAsByte,ByValdwFlagsAsLong,ByValdwExtraInfoAsLong) PrivateSubTimer1_Timer() Callkeybd_event(82,0,0,0)''模拟按下"R"键 EndSub -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它模拟: 方法一: AppActivatesTitle SendKeys"5" 方法二: AppActivatesTitle SendKeysvbKey5 方法三: SendMessageHwnd,WM_KEYDOWN,vbKey5,0& SendMessageHwnd,WM_KEYUP,vbKey5,0& 方法四: AppActivatesTitle keybd_event53,0,0,0 keybd_event53,0,KEYEVENTF_KEYUP,0 方法五: PostMessagelHwnd,WM_KEYDOWN,vbKey5,0& PostMessagelHwnd,WM_KEYUP,vbKey5,0& 前边谈了模拟键盘,下面说说模拟鼠标。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VBAPI函数: mouse_event←模拟一次鼠标事件 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相关API声明: mouse_event ↓ PrivateDeclareSubmouse_eventLib"user32"(ByValdwFlagsAsLong,ByValdxAsLong,ByValdyAsLong,ByValcButtonsAsLong,ByValdwExtraInfoAsLong) -------------------------------------------------------------------------------------------------------------------------------------------------------- 定义变量: ConstMOUSEEVENTF_LEFTDOWN=&H2 ConstMOUSEEVENTF_LEFTUP=&H4 ConstMOUSEEVENTF_MIDDLEDOWN=&H20 ConstMOUSEEVENTF_MIDDLEUP=&H40 ConstMOUSEEVENTF_MOVE=&H1 ConstMOUSEEVENTF_ABSOLUTE=&H8000 ConstMOUSEEVENTF_RIGHTDOWN=&H8 ConstMOUSEEVENTF_RIGHTUP=&H10 -------------------------------------------------------------------------------------------------------------------------------------------------------- MOUSEEVENTF_LEFTDOWN''鼠标左键按下 MOUSEEVENTF_LEFTUP''鼠标松开 MOUSEEVENTF_RIGHTDOWN''鼠标右键按下 MOUSEEVENTF_RIGHTUP''鼠标右键松开 -------------------------------------------------------------------------------------------------------------------------------------------------------- 代码: PrivateDeclareSubmouse_eventLib"user32"(ByValdwFlagsAsLong,ByValdxAsLong,ByValdyAsLong,ByValcButtonsAsLong,ByValdwExtraInfoAsLong) ConstMOUSEEVENTF_LEFTDOWN=&H2 ConstMOUSEEVENTF_LEFTUP=&H4 ConstMOUSEEVENTF_MIDDLEDOWN=&H20 ConstMOUSEEVENTF_MIDDLEUP=&H40 ConstMOUSEEVENTF_MOVE=&H1 ConstMOUSEEVENTF_ABSOLUTE=&H8000 ConstMOUSEEVENTF_RIGHTDOWN=&H8 ConstMOUSEEVENTF_RIGHTUP=&H10 ''这里是鼠标左键按下和松开两个事件的组合即一次单击 mouse_eventMOUSEEVENTF_LEFTDOWNOrMOUSEEVENTF_LEFTUP,0,0,0,0 ''模拟鼠标右键单击事件 mouse_eventMOUSEEVENTF_RIGHTDOWNOrMOUSEEVENTF_RIGHTUP,0,0,0,0 ''两次连续的鼠标左键单击事件构成一次鼠标双击事件 mouse_eventMOUSEEVENTF_LEFTDOWNOrMOUSEEVENTF_LEFTUP,0,0,0,0 mouse_eventMOUSEEVENTF_LEFTDOWNOrMOUSEEVENTF_LEFTUP,0,0,0,0 应用实战 -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VBAPI函数: FindWindow GetWindowThreadProcessId OpenProcess ReadProcessMemory CloseHandle -------------------------------------------------------------------------------------------------------------------------------------------------------- 相关API声明: FindWindow ↓ PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong GetWindowThreadProcessId ↓ PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong) AsLong OpenProcess ↓ PrivateDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInherITHandleAsLong,ByValdwProcessIdAsLong)AsLong ReadProcessMemory ↓ PrivateDeclareFunctionReadProcessMemoryLib"kernel32"(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong CloseHandle ↓ PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong GetCurrentProcess ↓ PrivateDeclareFunctionGetCurrentProcessLib"kernel32"()AsLong -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Label、Timer(interval不为空)、Text -------------------------------------------------------------------------------------------------------------------------------------------------------- 定义函数: DimSetHpAsInteger''定义设定的体力值 DimSetMpAsInteger''定义设定的魔法值 DimNowHpAsLong''定义目前的体力值 DimNowMpAsLong''定义目前的魔法值 DimMaxHpAsLong''定义角色的最高体力值 DimMaxMpAsLong''定义角色的最高魔法值 DimDiZhiAsLong''定义内存地址函数 DimhwndAsLong''储存FindWindow函数返回的句柄 -------------------------------------------------------------------------------------------------------------------------------------------------------- 代码: PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong) AsLong PrivateDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLong PrivateDeclareFunctionReadProcessMemoryLib"kernel32"(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong PrivateDeclareFunctionGetCurrentProcessLib"kernel32"()AsLong DimSetHpAsInteger''定义设定的体力值 DimSetMpAsInteger''定义设定的魔法值 DimNowHpAsLong''定义目前的体力值 DimNowMpAsLong''定义目前的魔法值 DimMaxHpAsLong''定义角色的最高体力值 DimMaxMpAsLong''定义角色的最高魔法值 DimDiZhiAsLong''定义内存地址函数 PrivateFunctionncnr(lpADDressAsLong)AsInteger ''声明一些需要的变量 DimhwndAsLong''储存FindWindow函数返回的句柄 DimpidAsLong''储存进程标识符(ProcessId) DimpHandleAsLong''储存进程句柄 hwnd=FindWindow(vbNullString,"封神榜·网络版") ''取得进程标识符 GetWindowThreadProcessIdhwnd,pid ''使用进程标识符取得进程句柄 pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid) ''在内存地址中读取数据 ReadProcessMemorypHandle,lpADDress,ByValVarPtr(ncnr),4,0& ''关闭进程句柄 CloseHandlehProcess EndFunction ConstSTANDARD_RIGHTS_REQUIRED=&HF0000 ConstSYNCHRONIZE=&H100000 ConstSPECIFIC_RIGHTS_ALL=&HFFFF ConstSTANDARD_RIGHTS_ALL=&H1F0000 ConstPROCESS_ALL_ACCESS=STANDARD_RIGHTS_REQUIREDOrSYNCHRONIZEOr&HFFF ConstPROCESS_VM_OPERATION=&H8& ConstPROCESS_VM_READ=&H10& ConstPROCESS_VM_WRITE=&H20& PrivateSubForm_Load() ''体力:07F68F3这里替换你所搜索到的地址魔法:07F6860同前 DiZhi=&H07F68F3 Timer1.Enabled=True Timer2.Enabled=False Timer3.Enabled=False EndSub PrivateSubTimer1_Timer() DimhwndAsLong hwnd=FindWindow(vbNullString,"封神榜·网络版") Ifhwnd=0Then Label12.Caption="游戏未加载" Timer1.Enabled=True Timer2.Enabled=False Timer3.Enabled=False ExitSub EndIf Label12.Caption="游戏已加载" SetHp=Text1.Text''获取设定的体力值 SetMp=Text2.Text''获取设定的魔法值 NowHp=ncnr(DiZhi)''获取当前的体力值 NowMp=ncnr(DiZhi+12)''获取当前的魔法值 MaxHp=ncnr(DiZhi+4)''获取角色的最高体力值 MaxMp=ncnr(DiZhi+16)''获取角色的最高魔法值 Label3.Caption=Str(NowHp)+"/"+Str(MaxHp)''显示角色体力值状态 Label4.Caption=Str(NowMp)+"/"+Str(MaxMp)''显示角色魔法值状态 IfCheck1.ValueThen Timer2.Enabled=True Else Timer2.Enabled=False EndIf IfCheck2.ValueThen Timer3.Enabled=True Else Timer3.Enabled=False EndIf EndSub PrivateSubTimer2_Timer() ''体力值小于设定值按下数字键1 If(NowHp)<SetHpThen SendKeys"1" EndIf EndSub PrivateSubTimer3_Timer() ''魔法值小于设定值按下数字键2 If(NowMp)<SetMpThen SendKeys"2" EndIf EndSub -------------------------------------------------------------------------------------------------------------------------------------------------------- 钩子:喜欢外挂的人都知道,很多外挂都是在游戏当中才能呼出。这个就用到了钩子 N多人说:“哎,VB做钩子想都别想!去学C语言吧!”只要大家遇到这种人,就别理会他。 可以说他是个垃圾。在实现钩子方面VB可能没有VC快,但是也不像那种人说的“想都别想” C语言,我最近几天看了看。{};这些太多了。脑袋也大了!可能那些学C语言的人是接触电脑 编程的时候就学的它吧!但是呢,我接触电脑学的就是VB。没办法我爱它! -------------------------------------------------------------------------------------------------------------------------------------------------------- 好了下面介绍简单的钩子吧! -------------------------------------------------------------------------------------------------------------------------------------------------------- SetWindowsHookEx定义如下: DeclareFunctionSetWindowsHookExLib"user32"Alias"SetWindowsHookExA"(ByValidHookAsLong,ByVallpfnAsLong,ByValhmodAsLong,ByValdwThreadIdAsLong)AsLong idHook是钩子类型,如WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。 hmod用于全局钩子,VB要实现钩子,必须设为0。 dwThreadId用于线程钩子VB中可以设置为App.ThreadID。 lpfn为钩子函数,在VB中可以使用AddressOf获得钩子函数的地址。 这个函数因为钩子类型不同而有所不同。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 如键盘钩子为: PublicFunctionKeyboardProc(ByValnCodeAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong ''如果Code不为0,钩子函数必须调用CallNextHookEx,将消息传递给下面的钩子。wParam和lParam不是按键。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面给大家一个VB钩子运用很好的例子!(全局钩子) 我在论坛上遇到了王者,王者可以说是我见到的VB最棒的一个人。可以说王者是个 VB狂人,很多学C语言的人看来VB不能实现的东西。王者都实现了!这不是在打广告 这是真的。VB实现全局钩子前几年在某某VB学习网站上看见过“VB全局钩子是根本不能实现的!站长发布”呵呵!真的有点骇人听闻! 但是大家看到了下面这个“万能吃药”外挂就知道了! http://www.v2best.com/dispbbs.asp?boardID=6&ID=171&page=1 -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它的就不多说了,开学了。到暑假的时候再写东西吧! 希望大家努力,相信一点, 什么工具什么语言不重要,只要有思路就行! 做外挂的人都知道,目前有两种办法制作网络游戏外挂。一种是封包式另外一种是内存式!下面就给大家制作一个抓包器,来研究一下,网络游戏的数据! ---------------------------------------------------------------------------------------------------- PrivateSubForm_Load() CountID=0 ExitID=False ListView1.ColumnHeaders.Add1,,"源IP",1500 ListView1.ColumnHeaders.Add2,,"源端口",1500 ListView1.ColumnHeaders.Add3,,"目标IP",1500 ListView1.ColumnHeaders.Add4,,"目标端口",1500 ListView1.ColumnHeaders.Add5,,"协议",1500 ListView1.ColumnHeaders.Add6,,"时间",1500 EndSub PrivateSubForm_Unload(CancelAsInteger) CallWCleanup(s) UnloadMe EndSub PrivateSubListView1_Click() DimcounAsLong DimsarAsString,sar3AsString Dimsar1AsString,sar2AsString RichTextBox1.Text=""''清除RichTextBox1 Dimbuffer()AsByte buffer=str IfListView1.SelectedItemIsNothingThen''如果ListView1控件没有数值则提示错误 ExitSub EndIf ''将buffer的值(即通过Recibir接收的数据包)转换为一定格式并在RichTextBox1控件下显示出来 Fori=0Toresarray(ListView1.SelectedItem.Index) coun=coun+1 IfLen(Hex(buffer(i)))=1Then sar="0"&Hex(buffer(i)) Else sar=Hex(buffer(i)) EndIf sar3=sar3&sar IfAsc(Chr("&h"&Hex(buffer(i))))<32Then sar1="." Else sar1=Chr("&h"&Hex(buffer(i))) EndIf sar2=sar2&sar1 RichTextBox1.Text=RichTextBox1.Text&sar&"" Ifcoun=15Then RichTextBox1.Text=RichTextBox1.Text&"|"&sar2&vbCrLf: coun=0 sar2="" sar3="" EndIf Nexti Ifcoun<15Then r=44-(coun*3)+1 es=String(r,Chr(32)) RichTextBox1.Text=RichTextBox1.Text&es&"|"&sar2 EndIf EndSub PrivateSubM_Clear_Click() ListView1.ListItems.Clear RichTextBox1.Text="" EndSub ''程序开始捕捉 PrivateSubM_Start_Click() ListView1.ListItems.Clear RichTextBox1.Text="" Connectingip(hostname),MsgHwnd''开始截取封包 EndSub PrivateSubM_Stop_Click() ExitID=True''停止截取封包 EndSub PrivateSubMsgHwnd_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle) CountID=CountID+1 Recibirs,1 IfExitID=TrueThen CallWCleanup(s) ExitID=False MsgBox"退出",vbOKOnly,"数据封包截取" EndIf EndSub 模块: OptionExplicit ''WSAstartup用来判断Windows所支持的Winsock版本,也就是初始化WinsockDLL,其中第一个参数为你所想需要的Winsock版本!低字节为主版本,高字节为副版本!由于目前Winsock有两个版本:1.1和2.2,因此该参数可以是0x101或0x202;第二个参数是一个WSADATA结构,用于接收函数的返回信息!WSAStartup函数调用成功会返回0,否则返回非0值! ''WSACleanup用来关闭Winsock,与WSAstartup一起使用,即WSAstartup也可以看为启动Winsock ''gethostbyname用来返回一个关于主机信息的结构的指针 PublicDeclareFunctionWSAstartupLib"wsock32.dll"Alias"WSAStartup"(ByValwVersionRequiredAsInteger,ByReflpWSADataAsWS Adata)AsLong PublicDeclareFunctionWsACleanupLib"wsock32.dll"Alias"WSACleanup"()AsLong PublicDeclareSubCopyMemoryLib"kernel32.dll"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByVallengthAsLong) PublicDeclareFunctionlstrlenLib"kernel32.dll"Alias"lstrlenA"(ByVallpStringAsAny)AsLong PublicDeclareFunctionlstrcpyLib"kernel32.dll"Alias"lstrcpyA"(ByVallpString1AsAny,ByVallpString2AsAny)AsLong PublicDeclareFunctioninet_ntoaLib"wsock32.dll"(ByValaddrAsLong)AsLong PublicDeclareFunctiongethostnameLib"wsock32.dll"(ByValnameAsString,ByValnamelenAsLong)AsLong PublicDeclareFunctiongethostbynameLib"wsock32.dll"(ByValnameAsString)AsLong PublicDeclareFunctionclosesocketLib"wsock32.dll"(ByValsAsLong)AsLong PublicDeclareFunctionrecvLib"wsock32.dll"(ByValsAsLong,bufAsAny,ByValbuflenAsLong,ByValflagsAsLong)AsLong PublicDeclareFunctionsocketLib"wsock32.dll"(ByValafAsLong,ByVals_typeAsLong,ByValprotocolAsLong)AsLong PublicDeclareFunctionWSAAsyncSelectLib"wsock32.dll"(ByValsAsLong,ByValhWndAsLong,ByValwMsgAsLong,ByVallEventAsLong)AsLong PublicDeclareFunctionWSAIoctlLib"ws2_32.dll"(ByValsAsLong,ByValdwIoControlCodeAsLong,lpvInBufferAsAny,ByValcbInBufferAsLong,lpvOutBufferAsAny,ByValcbOutBufferAsLong,lpcbBytesReturnedAsLong,lpOverlappedAsLong,lpCompletionRoutineAsLong)AsLong PublicDeclareFunctioninet_addrLib"wsock32.dll"(ByValcpAsString)AsLong PublicDeclareFunctionbindLib"wsock32.dll"(ByValsAsInteger,addrAssockaddr,ByValnamelenAsInteger)AsInteger PublicDeclareFunctionntohsLib"wsock32.dll"(ByValnetshortAsLong)AsInteger PublicTypeWSAdata wVersionAsInteger wHighVersionAsInteger szDescriptionAsString*255 szSystemStatusAsString*128 iMaxSocketsAsInteger iMaxUdpDgAsInteger lpVendorInfoAsLong EndType ''sock地址结构 PublicTypesockaddr sin_familyAsInteger sin_portAsInteger sin_addrAsLong sin_zeroAsString*8 EndType PublicTypeHOSTENT h_nameAsLong h_aliasesAsLong h_addrtypeAsInteger h_lengthAsInteger h_addr_listAsLong EndType ''ip头结构 PublicTypeipheader lenverAsByte tosAsByte lenAsInteger identAsInteger flagsAsInteger ttlAsByte protoAsByte checksumAsInteger sourceIPAsLong destIPAsLong EndType ''TCP头结构 PublicTypetcp_hdr th_sportAsInteger th_dportAsInteger th_seqAsLong th_ackAsLong th_lenresAsByte th_flagAsByte th_winAsInteger th_sumAsInteger th_urpAsInteger EndType ''UDP头结构 PublicTypeudp_hdr th_sportAsInteger th_dportAsInteger th_lenAsInteger th_sumAsInteger EndType ''ICMP头结构 PublicTypeicmp_hdr th_typeAsByte th_codeAsByte th_sumAsInteger th_idAsInteger th_seqAsInteger th_timeAsLong EndType ''常量 PublicConstPF_INET=2 PublicConstSOCK_RAW=3 PublicConstAF_INET=2 PublicConstFD_READ=&H1 PublicConstSIO_RCVALL=&H98000001 PublicConstEM_REPLACESEL=&HC2 PublichostAsHOSTENT PublicsAsLong PublicsockAssockaddr PublicHeaderAsipheader PublictcpHeadAstcp_hdr PublicudpHeadAsudp_hdr PublicicmpHeadAsicmp_hdr Publicresarray()AsLong,strAsString PubliciAsLong,CountIDAsLong''i为临时变量,循环语句用,CountID用来计算一共有多少个数据包 PublicprotocolAsString Publicbuffer()AsByte''存放数据包 PublicresAsLong''返回值,临时变量 PublicExitIDAsBoolean''退出标识 ''开始 PublicSubWstartup() DimDataAsWSAdata CallWSAstartup(&H202,Data)''初始化Winsock为2.2 EndSub ''结束 PublicSubWCleanup(sAsLong) CallWsACleanup''关闭Winsock closesockets EndSub ''获得当前主机的IP PublicFunctionip(ByRefaddressAsString)AsString DimpipAsLong DimuipAsLong DimsAsLong DimssAsString DimculAsLong CopyMemoryhost,ByValgethostbyname(address),Len(host)''将gethostbyname获得的值放到host CopyMemorypip,ByValhost.h_addr_list,4''将host.h_addr_list的值放到pip CopyMemoryuip,ByValpip,4''将pip的值放到uip s=inet_ntoa(uip)''将uip转换为标准的IPV4格式 ss=Space(lstrlen(s))''去掉空格 cul=lstrcpy(ss,s) ip=ss''获得IPV4格式的地址并将其放如ip EndFunction ''获得当前机器的主机名 PublicFunctionhostname()AsString DimrAsLong DimsAsString DimhostAsString Wstartup host=String(255,0) r=gethostname(host,255)''获得当前主机的主机名 Ifr=0Then hostname=Left(host,InStr(1,host,vbNullChar)-1) EndIf EndFunction ''连接IP PublicSubConnecting(ByRefipAsString,picAsPictureBox) DimresAsLong,bufAsLong,bufbAsLong buf=1 Wstartup''初始化Winsock s=socket(AF_INET,SOCK_RAW,0)''创建套接字,s是socket功能返回的文件描述符 Ifs<1Then CallWCleanup(s) ExitSub''如果创建失败则退出 EndIf sock.sin_family=AF_INET''socket类型 sock.sin_addr=inet_addr(ip)''所用的IP地址 res=bind(s,sock,Len(sock))''绑定端口 Ifres<>0Then CallWCleanup(s) ExitSub''如果绑定失败则退出 EndIf res=WSAIoctl(s,SIO_RCVALL,buf,Len(buf),0,0,bufb,ByVal0,ByVal0)''改变SocketIO模式,将其改为混乱模式,即接受与自己无关的数据,则SIO_RCVALL Ifres<>0Then CallWCleanup(s) ExitSub EndIf res=WSAAsyncSelect(s,pic.hWnd,&H202,ByValFD_READ)''设置套接字处于阻塞方式或者非阻塞方式,消息发送的窗口是pic,即Form1.Picture1 Ifres<>0Then CallWCleanup(s) ExitSub EndIf EndSub ''接收信息 PublicSubRecibir(sAsLong,ByValRecFormatAsLong) IfRecFormat=FD_READThen ReDimbuffer(2000)''重定义缓冲区大小为2000 Do res=recv(s,buffer(0),2000,0&)''接收信息 Ifres>0Then ReDimPreserveresarray(CountID)''改变数组大小,并保留以前的数据 str=buffer() resarray(CountID)=res CopyMemoryHeader,buffer(0),Len(Header)''将buffer里面的数据复制到Header结构里面 ''根据IP头结构的标识来获得是什么类型的数据包,并将IP从头结构中分离出来 IfHeader.proto=1Then protocol="ICMP" proticmpinversaip(Hex(Header.destIP)),inversaip(Hex(Header.sourceIP)) EndIf IfHeader.proto=6Then protocol="TCP" protcpinversaip(Hex(Header.destIP)),inversaip(Hex(Header.sourceIP)) EndIf IfHeader.proto=17Then protocol="UDP" proudpinversaip(Hex(Header.destIP)),inversaip(Hex(Header.sourceIP)) EndIf EndIf LoopUntilres<>2000 EndIf EndSub ''将16进制转换为IP地址 PublicFunctioninversaip(ByReflngAsString)AsString DimipsAsString SelectCaseLen(lng) Case1 lng="0000000"&lng Case2 lng="000000"&lng Case3 lng="00000"&lng Case4 lng="0000"&lng Case5 lng="000"&lng Case6 lng="00"&lng Case7 lng="0"&lng EndSelect Fori=1ToLen(lng)Step2 ips=ips&Val("&h"&Mid(lng,Len(lng)-i,2))&"." Nexti inversaip=Mid(ips,1,Len(ips)-1) EndFunction PublicFunctionproticmp(saaAsString,socAsString)AsString DimListTempAsVariant SetListTemp=Form1.ListView1.ListItems.Add(,,soc) ListTemp.SubItems(2)=saa ListTemp.SubItems(4)=protocol ListTemp.SubItems(5)=Time CopyMemoryicmpHead,buffer(0+20),Len(icmpHead) EndFunction PublicSubprotcp(saaAsString,socAsString) DimListTempAsVariant CopyMemorytcpHead,buffer(0+20),Len(tcpHead) SetListTemp=Form1.ListView1.ListItems.Add(,,soc) ListTemp.SubItems(1)=ntohs(tcpHead.th_sport) ListTemp.SubItems(2)=saa ListTemp.SubItems(3)=ntohs(tcpHead.th_dport) ListTemp.SubItems(4)=protocol ListTemp.SubItems(5)=Time EndSub PublicSubproudp(saaAsString,socAsString) DimListTempAsVariant CopyMemoryudpHead,buffer(0+20),Len(udpHead) SetListTemp=Form1.ListView1.ListItems.Add(,,soc) ListTemp.SubItems(1)=ntohs(udpHead.th_sport) ListTemp.SubItems(2)=saa ListTemp.SubItems(3)=ntohs(udpHead.th_dport) ListTemp.SubItems(4)=protocol ListTemp.SubItems(5)=Time EndSub --------------------------------------------------------------------------------------------------- 彩色的太费时间了,所以就直接贴了!呵呵! 分析篇:分析主要就是分析ram里面的东西拉。可以到“看雪”去学学简单的汇编命令 004f3b9c/$53pushebx 004f3b9d|.83c4f8addesp,-8 004f3ba0|.8bdamovebx,edx;解密后数据目标地址 004f3ba2|.8bd4movedx,esp;数据传递目标地址 004f3ba4|.b904000000movecx,4;传递个数为4 004f3ba9|.e812eef8ffcallclient.004829c0;把侍解密的4数值传递过来进行解密 004f3bae|.8a0424moval,byteptrss:[esp];第一位 004f3bb1|.c1e002shleax,2 004f3bb4|.33d2xoredx,edx 004f3bb6|.8a542401movdl,byteptrss:[esp+1];第二位 004f3bba|.c1ea04shredx,4 004f3bbd|.0ac2oral,dl;第一位与每二位0r 004f3bbf|.8803movbyteptrds:[ebx],al;输出第1位 004f3bc1|.43incebx;计数器+1指向第二位 004f3bc2|.8a442401moval,byteptrss:[esp+1];第二位 004f3bc6|.c1e004shleax,4 004f3bc9|.33d2xoredx,edx 004f3bcb|.8a542402movdl,byteptrss:[esp+2];第三位 004f3bcf|.c1ea02shredx,2 004f3bd2|.0ac2oral,dl;第二位与第三位or 004f3bd4|.8803movbyteptrds:[ebx],al;输出第二位 004f3bd6|.43incebx;计数器+1指向第三位 004f3bd7|.8a442402moval,byteptrss:[esp+2];第三位 004f3bdb|.c1e006shleax,6 004f3bde|.8a542403movdl,byteptrss:[esp+3];第4个 004f3be2|.0ac2oral,dl;第三个与第四个or 004f3be4|.8803movbyteptrds:[ebx],al;输出第三位 004f3be6|.59popecx 004f3be7|.5apopedx 004f3be8|.5bpopebx 004f3be9/.c3retn 004f3bea8bc0moveax,eax 004f3bec/$53pushebx 004f3bed|.56pushesi 004f3bee|.57pushedi 004f3bef|.55pushebp 004f3bf0|.50pusheax;封包 004f3bf1|.b802000000moveax,2 004f3bf6|>81c404f0ffff/addesp,-0ffc 004f3bfc|.50|pusheax 004f3bfd|.48|deceax 004f3bfe|.^75f6/jnzshortclient.004f3bf6 004f3c00|.8b84240020000>moveax,dwordptrss:[esp+2000] 004f3c07|.8bd9movebx,ecx 004f3c09|.8bfamovedi,edx 004f3c0b|.8bd3movedx,ebx 004f3c0d|.81e203000080andedx,80000003 004f3c13|.7905jnsshortclient.004f3c1a 004f3c15|.4adecedx 004f3c16|.83cafcoredx,fffffffc 004f3c19|.42incedx 004f3c1a|>85d2testedx,edx 004f3c1c|.7405jeshortclient.004f3c 23 004f3c1e|.83c8fforeax,ffffffff 004f3c21|.eb7bjmpshortclient.004f3c9e 004f3c23|>8bd3movedx,ebx 004f3c25|.85d2testedx,edx 004f3c27|.7903jnsshortclient.004f3c2c 004f3c29|.83c203addedx,3 004f3c2c|>c1fa02saredx,2 004f3c2f|.891424movdwordptrss:[esp],edx 004f3c32|.8d542404leaedx,dwordptrss:[esp+4] 004f3c36|.8bcbmovecx,ebx 004f3c38|.e883edf8ffcallclient.004829c0;整理出封包传递给解密地址进行解密 004f3c3d|.c6441c0400movbyteptrss:[esp+ebx+4],0 004f3c42|.8b1c24movebx,dwordptrss:[esp] 004f3c45|.c1e302shlebx,2 004f3c48|.4bdecebx 004f3c49|.85dbtestebx,ebx 004f3c4b|.7c28jlshortclient.004f3c75 004f3c4d|.43incebx 004f3c4e|.8d442404leaeax,dwordptrss:[esp+4];一个封包 004f3c52|>8a10/movdl,byteptrds:[eax];第n位 004f3c54|.80fa3b|cmpdl,3b 004f3c57|.7205|jbshortclient.004f3c5e 004f3c59|.80fa7a|cmpdl,7a 004f3c5c|.7605|jbeshortclient.004f3c63 004f3c5e|>83c8ff|oreax,ffffffff;出错处理 004f3c61|.eb3b|jmpshortclient.004f3c9e 004f3c63|>81e2ff000000|andedx,0ff 004f3c69|.8a923def5a00|movdl,byteptrds:[edx+5aef3d];54ef3d是一串字符串. 004f3c6f|.8810|movbyteptrds:[eax],dl;转换后代码 004f3c71|.40|inceax;下一个封包字符 004f3c72|.4b|decebx;计数器减1 004f3c73|.^75dd/jnzshortclient.004f3c52 004f3c75|>8b1c24movebx,dwordptrss:[esp] 004f3c78|.4bdecebx 004f3c79|.85dbtestebx,ebx 004f3c7b|.7c1bjlshortclient.004f3c98 004f3c7d|.43incebx 004f3c7e|.33edxorebp,ebp 004f3c80|.8d742404leaesi,dwordptrss:[esp+4];取上面转化后的数值 004f3c84|>8d546d00/leaedx,dwordptrss:[ebp+ebp*2] 004f3c88|.03d7|addedx,edi;目标地址每次转化3 004f3c8a|.8bc6|moveax,esi;源地址每次取 004f3c8c|.e80bffffff|callclient.004f3b9c;解密数据(取4个.转化3个) 004f3c91|.45|incebp 004f3c92|.83c604|addesi,4 004f3c95|.4b|decebx 004f3c96|.^75ec/jnzshortclient.004f3c84 004f3c98|>8b0424moveax,dwordptrss:[esp] 004f3c9b|.8d0440leaeax,dwordptrds:[eax+eax*2] 004f3c9e|>81c404200000addesp,2004 004f3ca4|.5dpopebp 004f3ca5|.5fpopedi 004f3ca6|.5epopesi 004f3ca7|.5bpopebx 004f3ca8/.c3retn 封包的比对!网络游戏都是通过数据交换实现游戏竞技滴,所以分析封包是制作外挂的一个步骤。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 网络游戏封包分为2种封包:1。明文封包2。加密封包 多数网络游戏都是加密封包,其原因是为了信息不被修改。明文封包的也有,呵呵“cs”呀这些 -------------------------------------------------------------------------------------------------------------------------------------------------------- 好了,进入正题。封包这玩意其实很难。但是如果你入门了就不难了! 明文的好对付,but加密的就有点.......但也是有办法滴 就是“多抓包,多分析,多解密!”呵呵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 抓包篇:什么抓包呢?抓包当然就是用wpe,或者自己编写软件拉,上次(呵呵`也就是昨天)已经做过了! 0056df384e3e545356554a6c776463424d466a6en>tsvujlwdcbmfjn 0056df48414b623f7178767965477a664c503d5fakb?qxvyegzflp=_ [email=0056df584552405a5c616d5d4368676f57443b51er@z am]chgowd;q]0056df584552405a5c616d5d4368676f57443b51er@z/am]chgowd;q[/email] 0056df6875585b3c746b70725e606949484f5973ux[0056df782e331e011322100b282d200d193c3b06.3"(-.<; 0056df88111c0c003d1d2f21030205042c313e23..=/!,1># 0056df98322427381f3925120a09181b2a293a0e2$''''89%..*): 0056dfa83507260f2b3614373f3430160815171a5&+67?40 这个就是某个网络游戏的封包!当然是加了密的。 00878be055414e4e4e4e4e4e4e4e4e424e4e704euannnnnnnnnbnnpn 00878bf04145564e3e413e58794e4b65aevn>a>xynke 00878be005100000000000000000000b00003600...........6. 00878bf0102004000110013117001118.1. 0087cc0415000000000000000b000d8042010005.........?b. 0087cc1400715c0458.q/x 什么意思呢?当然就是要分析拉! -------------------------------------------------------------------------------------------------------------------------------------------------------- 前天晚上我跟封包玩了一晚上,因才开始(第一次跟封包)说一下我一晚上的发现吧 我是直接用WPE截取的,因为金山游戏本身都有截取封包的保护措施(就像MM所说),直接用WPE截取我是截取不到的,后来用Ollydbg调试的时候才截取的到。 经过前面的准备,封报的明文准备已经OK,准备进行加密,加密方式是取一个4字节的数字,对封包进行Xor运算,运算完毕后就直接发送出去,我核对过用WPE截取封包的数据,和我看到的运算结果完全一致,这说明只要用那个4字节的数字对封包进行反Xor运算就可以得到明文的封包。 其实说白了那个4字节的数字就是每次加密的密匙,也就是服务器认可的,这个4字节怎么得出的我就没跟了,暂时只发现只要不更换场景,4字节密匙不会更变。 相同道理,服务返回的信息也是经过4字节Xor运算处理了的,客户端解密时候取服务端4字节密匙对封包进行解密就可以得到明文封包。 大体说下封神封包加密解密流程 Send: 1,制造明文封包 2,取4字节Send密匙 3,用4字节密匙对封包进行Xor运算(保留前2位),最后不足4字节进行单字节运算。 4,发送。 Revc: 1,收到封包 2,取4字节Revc密匙 3,用4字节密匙对封包进行Xor运算(保留前2位),最后不足4字节进行单字节运算。 4,对明文封包进行分析 -------------------------------------------------------------------------------------------------------------------------------------------------------- 以上的方法比较累人!下面说说本地制作吧(既是用大家熟悉的FPE等软件) 制作辅助外挂(自动加血,自动加蓝,免负重等等) HP的地址是不固定的,我使用金山游侠先找出当前的那个地址, 然后使用softice对该地址设置断点,softice应该会立刻断住, 你会看见MOVDWORDPTRDS:[EAX+ECX*8+EB4],EDI, 在客户端中,位置是0x4B2C74, 你可以修改游戏的进程, 把MOVDWORDPTRDS:[EAX+ECX*8+EB4], EDI改成一个E9XXXXXXXX9090, JMP到进程中.rsrc和.data之间的空余地址, 把(XXXXXXXX)+0x4B2C74+5处的代码修改成MOVY,EDI, 下一条做原来的MOVDWORDPTRDS:[EAX+ECX*8+EB4],EDI, 再来个E9ZZZZZZZZ, 设置好ZZZZZZZZ使其再跳到原来DWORDPTRDS:[EAX+ECX*8+EB4], EDI的下一句,就是0x4B2C7B处, 这样HP的地址就固定下来了,只要看Y就知道HP了。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面说说客服端的破解(小试牛刀!)有兴趣的朋友可以制作一个DLL 来实现加血锁定血量! .text:004E8EF0sub_4E8EF0procnear .text:004E8EF0 .text:004E8EF0arg_0=dwordptr4 .text:004E8EF0arg_4=dwordptr8 .text:004E8EF0arg_8=dwordptr0Ch .text:004E8EF0 .text:004E8EF0movecx,[esp+arg_0];可能是长度LEN地址 .text:004E8EF4pushebx .text:004E8EF5moveax,[esp+4+arg_4];缓存地址 .text:004E8EF9pushesi .text:004E8EFAmovesi,ecx .text:004E8EFCpushedi .text:004E8EFDmovedi,[esp+0Ch+arg_8];加密KEY地址 .text:004E8F01andesi,3;相当于缓存长度除以4的余数 .text:004E8F04shrecx,2;相当于缓存长度除以4的商 .text:004E8F07movedx,[edi];把加密KEY值放进edx .text:004E8F09movebx,ecx; .text:004E8F0Bdececx; .text:004E8F0Ctestebx,ebx; .text:004E8F0Ejbeshortloc_4E8F1E;判断跳转 .text:004E8F10incecx; .text:004E8F11 .text:004E8F11loc_4E8F11: .text:004E8F11movebx,[eax] .text:004E8F13addeax,4 .text:004E8F16xorebx,edx;异或运算,EDX=KEY的值,核心运算 .text:004E8F18dececx .text:004E8F19mov[eax-4],ebx .text:004E8F1Cjnzshortloc_4E8F11;相当于FOR循环运算 .text:004E8F1E .text:004E8F1Eloc_4E8F1E: .text:004E8F1Emovecx,esi .text:004E8F20decesi .text:004E8F21testecx,ecx .text:004E8F23jbeshortloc_4E8F35 .text:004E8F25leaecx,[esi+1] .text:004E8F28 .text:004E8F28loc_4E8F28: .text:004E8F28movbl,[eax] .text:004E8F2Axorbl,dl;异或运算 .text:004E8F2Cmov[eax],bl .text:004E8F2Einceax .text:004E8F2Fshredx,8 .text:004E8F32dececx .text:004E8F33jnzshortloc_4E8F28;相当于FOR循环运算 .text:004E8F35 .text:004E8F35loc_4E8F35:KEY付值运算; .text:004E8F35moveax,[edi] .text:004E8F37movedx,eax .text:004E8F39shledx,5 .text:004E8F3Csubedx,eax .text:004E8F3Emoveax,1 .text:004E8F43addedx,8088405h .text:004E8F49mov[edi],edxKEY付值 .text:004E8F4Bpopedi .text:004E8F4Cpopesi .text:004E8F4Dpopebx .text:004E8F4Eretn .text:004E8F4Esub_4E8EF0endp -------------------------------------------------------------------------------------------------------------------------------------------------------- 今天就到这里 传奇外挂制作的资料 -------------------------------------------------------------------------------------------------------------------------------------------------------- 显血:7A0D3:75EB 超负重:99A40:76EB offset原改 防石化: 00466F80:7590 00466F81:2E90 稳如泰山: 0046959D:2044 004695A9:1438 如影随行: 004634E2:0001 战斗退出: 004620E6:7490 004620E7:0D90 00462162:7490 00462163:0A90 004914CA:7490 004914CB:0E90 00491576:7490 00491577:0E90 相对不卡:——| 00463A8D:9900| 0049B848:2C00|——二选一 绝对不卡:| 00466F57:0001——| -------------------------------------------------------------------------------------------------------------------------------------------------------- 防止双开: EB1CA110414A00 修改为: 741CA110414A00 需要双开就反过来改。 看血: 内存地址:47A0D3 75EB 找 00000075108B45EC 修改为: 000000EB108B45EC 强退: 内存地址:004620E6(7) 7490 0D90 找 2000740D8B45 修改为: 200090908B45 内存地址:00462162(3) 7490 0A90 找 2000740A8B45 修改为: 200090908B45 内存地址:4914CA(B) 内存地址:491576(7) 7490 0E90 找 0080782000740EA1 修改为: 00807820009090A1 免助跑 内存地址:00461BEB(C-F0) 0F90 8E90 7990 FD90 FF90 FF90 找 E8000F8E79FDFFFF 修改为: E800909090909090 内存地址:461BB9(A-E) 0F90 8C90 DA90 0090 0090 0090 找 00010F8CDA000000A1 修改为: 0001909090909090A1 跑步砍 内存地址:004634E2 0001 找 4F00008D45F0 修改为: 4F00018D45F0 攻击速度 内存地址:46 7016(7) 78E2 0504 找 EB0BB87805 修改为: EB0BB84805 说明:速度由二位数指定,二位数前后互换为真实数据,数字大为慢小为快 穿人 内存地址:472D17 340C 找 00000034018845 修改为: 0000000C018845 免蜡 内存地址:471BDE 74EB 找 008038007454 修改为: 00803800EB54 物品闪光 内存地址:471AA6 04 找 1300007625 修改为: 0200007625 自动放药 找 0048C21FF968FDFF 004623A276070000 修改为: 0048C21FDD50B001 004623A27AEDB201 超负重?? Poke00499A40EB 004975A8EB5C 00499A40EB93 攻击方法修 原版 00463425741C 0046344A7410 004634637415 半月 00463425741C 0046344A7410 004634639090 攻杀 00463425741C 0046344A9090 004634637415 烈火 004634259090 0046344A7410 004634637415 方法二 半月 Poke00463363D0 烈火 Poke00463363D1 普通 Poke00463363C6 C745E8C60B单手砍 C745E8C70B双手砍 C745E8C80B跳跃砍 C745E8CA0B攻杀 C745E8CB0B刺杀 C745E8D00B半月 C745E8D10B烈火 无限刺杀 内存地址:463363 C6CB 找 C745E8C60B 修改为: C745E8CB0B 内存地址:463373 C7CB 找 C745E8C70B 修改为: C745E8CB0B 无限攻杀 内存地址:463363 C6CA 找 C745E8C60B 修改为: C745E8CA0B 内存地址:463373 C7CA 找 C745E8C70B 修改为: C745E8CA0B 无限半月 内存地址:463363 C6D0 找 C745E8C60B 修改为: C745E8D00B 内存地址:463373 C7D0 找 C745E8C70B 修改为: C745E8D00B 无限烈火 内存地址:463363 C6D1 找 C745E8C60B 修改为: C745E8D10B 内存地址:463373 C7D1 找 C745E8C70B 修改为: C745E8D10B 自动放药 找 0048C21FF968FDFF 004623A276070000 修改为: 0048C21FDD50B001 004623A27AEDB201 免蜡 内存地址:471BDE 74EB 找 008038007454 修改为: 00803800EB54 -------------------------------------------------------------------------------------------------------------------------------------------------------- 编程工具: 1.VC高手的不二选择 2.BorlandC++Builder如果当年是Borland做了操作系统而不是bill,也许我们现在的 编程工具更加智能更加方便更加接近人性化.如果不喜欢VC那种事事必恭的编程方式, 就用它好了,除了我们用的操作系统不是由它造的之外,几乎所有的编程都可以用它完成. 3.BorlandDelphi和BorlandC++Builder一样,由同一家公司出品在RAD方面个人感觉 VB在它面前只是一个小学生.与VC比嘛,除了语法上不同之外,性能及编程方面都要比VC 强过很多,不过它不是bill的产品,所以有系统底层方面比VC要差一些,不过用它做个什么外挂之类,它还是足以胜任的. 4.VB这个就不多说了简单的内存修改封包修改就它就好了,强烈推荐初学者使用,有了 经验之后再用其它的工具,可以事倍功半. 内存工具: FPE2001 GameMaster GameExpert GameEnchanter 游神 金山游侠 ↑我最喜欢的几样工具(金山游侠除外),谁说网络游戏不能修改。呵呵 封包修改工具 WPE winsock spyMaster ETF20 (PS:还有很多工具哟,不过不太智能化,不过也一样有功能很强了.这些以后再介绍了) 辅助工具 变速齿轮 按键精灵 TrainerMakerKit MagicTrainerCreator 反编译调试脱壳工具 UltraEdit Softice TRW2000 W32Dasm OllyDbg SPY++ 脱SafeDiscSafeCast2壳工具 脱Aspack壳工具 脱ASPro壳工具 脱UPX壳工具 脱Armadillo壳工具 VB实现指针访问!DLL的访问--------------------------------------------------------------------------------------------------------------------------------------------------------CopyMemory函数提供了一个简单的方法来执行C++中见解访问运算符(*),这个运算符可以访问被一个指针变量所指向的变量的值。 即如有指针变量P,在C++中可以简单的用*P来访问,那在VB中怎么访问呢?在VB中,我们可以使用CopyMemory函数别名。 DeclareSubVBGetTargetLb"kernel32"Alias"RtlMoveMemory"(TargetAsAny,ByVallPointAsLong,ByValcbCopyAsLong) 例子: DimPointerAsLong DimTargetAsInteger DimiAsInteger i=123 Pointer=VarPtr(i)''获得指针 VBGetTargetTarget,Pointer,LenB(Target) Debug.PrintTarget -------------------------------------------------------------------------------------------------------------------------------------------------------- 很长时间以来,都认为只能通过绝对路径引用标准DLL中的函数。其实,你也可以用相对路径。很简单的,现在就尝试一下吧。1)绝对路径方法比如你的DLL文件位于c:estDLLdebugestDLL.dll 一般来说,你需要在VB中作如下声明 DeclareSubmytestLib"c:estDLLdubugestDLL.dll"(ByValxAsLong) 另外的一个变通方法是把testDLL.dll放在windows的系统目录下,这样,你就可以直接引用文件名了。不过,需要把一个文件放到windows系统目录下,很是不爽! 2)相对路径方法 看看我们如何用相对路径,假设你的DLL文件位于c:estDLLdebugestDLL.dll,你的VB程序位于目录c:estDLLvbClient 你可以在VB程序中作如下声明: DeclareSubmytestLib"../dubug/testDLL.dll"(ByValxAsLong) 如果直接运行你的VB程序,系统会提示错误:找不到../dubug/testDLL.dll. 为了使上面的声明其作用,先暂时关闭你的VB工程。然后用一个文本编辑器(notepad,editplus,etc)打开工程文件(就是那个后缀是vbp的家伙),通常vbp文件由几个部分组成。 |