展鸿丶 展鸿丶
沙雕程序员。
关注数: 8 粉丝数: 1,091 发帖数: 6,291 关注贴吧数: 12
[补课] 虚函数 虚函数(virtual function)是C++ Class的一种实现机制,用于实现多态。 类函数加上virtual修饰,就成了虚函数。 用一段代码表示: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fcodepad.org%2FHpKHeiJv&urlrefer=b4d00ffc569f82ffade0433fb9acc64f 在VS调试环境给函数下断点,可以看到pKnife有一个__vfptr变量,这是C++编译器添加的一个DWORD型数组,用来记录虚函数的地址,所以它又叫做虚函数表(Virtual Function Table 简称VFT)。 注意:如果Class里没有虚函数,那麽也不会有这个变量。调用pKnife->Print和pKnife->Print2都毫无疑问会执行表里对应的函数。 接着看看pGrenade的情况可以看到,重载了Print之后,原本是CBasePlayerItem里的,现在是CBasePlayerWeapon里的。 你可能会问:即使不用虚函数,直接重载也能实现,那这个东西还有什麽用? 如果把子类指针,转回父类指针,再调用那个重载的函数,结果依然是调用了子类的,想到什麽好点子没? ------------------------------------- 帅气的分割线 -------------------------------------- mp.dll 里实现了各种实体的功能,每一种实体都是一个类,它们都基于 CBaseEntity 这个类。 实际上各种实体都有很复杂的层级关系,举个例子: 玩家实体 CBasePlayer 是这样的: CBaseEntity::CBaseDelay::CBaseAnimating::CBaseToggle::CBaseMonster::CBasePlayer 曾曾曾爷爷了。。。 每一种实体都关联到一个类,比方说实体 weapon_ak47 实际上是关联到 CAK47 这个类 LINK_ENTITY_TO_CLASS(weapon_ak47, CAK47); 当你在插件或者其它地方使用CreateNamedEntity创建一个weapon_ak47实体,实际上也就是相当于上面代码的 new CAK47 这样的过程,只不过引擎和mp.dll帮你处理好了。 写插件非常重要的Ham模块就是对这些虚函数安装钩子,想钩住武器的切枪事件为什麽要所有武器都要钩一遍?因为每一种武器都有一个Deploy函数,只钩weapon_ak47,当然只有AK47才有效。 虚函数相当灵活,也容易操作,如果想钩一个虚函数,只需要知道它在VFT里的索引,写入新的函数地址就行。 基于这个特性,Ham模块提供了相当灵活的用法。 例如想要钩住hosta_entity的Think,只需要这样做: RegisterHam(Ham_Think, "hostage_entity", .... ); 如果使用fakemeta的FM_Think钩子,就要手动检查classname,如果有其它插件意外更改了classname会出现更意外的情况。。。 具体的实体关联情况可以参考CS16ND。 另外Ham的Ham_Weapon_SendWeaponAnim是BUG,任何情况使用都会崩溃(原因是Hook时参数数量不对)。
使用 IDA Pro 查找函数特征码 下载 IDA Pro 最好是6.x的版本,自带F5键反编译。 第一步: 在IDA里载入你的程序(EXE或DLL)第二步: 寻找函数,如果你知道函数里引用了某个函数或者字符串,就可以尝试直接搜索函数名或者字符串,在 IDA View 窗口里按(Alt+T)开始搜索,(Ctrl+T)继续往下搜索。 搜索到一个字符串或者函数之后,你可以按下 X 键,查找出所有引用了这个函数或者字符串的地方,这可以帮助你快速找到需要的函数。 找到一个函数之后,你可以按 F5 键查看反编译结果(C语言风格),根据代码来确定是否是你要寻找的函数。第三步: 切换到 Hex View 窗口,此时显示的位置有可能不是当前函数的数据,你需要记住这个函数的地址,就是(sub_xxxxxxx)这个,然后在IDA左边的 Function name 窗口里找到这个函数名(可以使用Alt+T快速搜索),双击一下,Hex View 窗口就会自动跳到这个函数头部数据。第四步: 选中并且复制这一行,就是函数的特征码(实际上特征码就是函数头部的几个字节数据)。 实际上最好复制整个函数的数据,但是一般来说前16个字节就已经够准了。 修改一下格式就可以使用了。特别提示: 如果特征码里出现有 0x10 - 0x20 之间的字节,最好替换成 0x2A 否则有可能出现特征码搜不到,这个是经验之谈,原理我也不懂。
当你使用变量存储一个数值的时候,代码是这样的:计算机的内存是以二进制的方式保存的,只有 " 1" 和 " 0" 两个值。 所以十进制的1和2在内存中是这样的:首先介绍最简单的位移操作,操作符是 " <<" 或者 " >>" 。 它会把二进制数据统一往左边或者右边移动一定的位数。 例如数值1的二进制是这样的:我们用左移运算符,把二进制数据往左边移动 1 个位置。 代码是这样写的:然后数据就会变成这样:那麽二进制的 "10" 就是十进制的 "2" 啦。=========================================================== 你可能会有疑问了,最大可以往左边移多少位呢? AMXX规定的变量(cell)最大可以支持往左边移动 32 位。 =========================================================== 然后你可能会有疑问,如果移过头了会怎样? 如果往左边移过头了,那麽最靠左边的数据会被丢弃! 就像这样:好了,左移就是这样的用法,右移 ">>" 跟左移的用法完全一样,请自行实践。 现在来学习一下其它的一些位操作:位或、位与。 =========================================================== 位或的介绍: 当两个二进制位有一个为 "1" 时,结果就为 "1" 。 怎麽对两个数执行位或呢?位或的运算符是 " |"。 用键盘就是这个符号:看看代码怎麽写:我们用文字和图片来解释这个过程: 请回头看位或的介绍!那麽你知道 new_value 的值是多少了吗?=========================================================== 那麽位与又是怎样的呢? 位与的介绍: 当两个二进制都为 "1" 的时候,值为 "1" ,否则为 "0" 。 怎麽对两个数执行位与呢?位与的运算符是 "&"。 代码是这样写的:二进制对比:所以结果就是二进制的 "100" 也就是十进制的 "4"。说了位或和位与,这实际上有什麽用呢? 事例: 如果你想保存32个玩家的一种状态,比如玩家是否活着,那麽你可能会这样写:回想二进制,AMXX的变量的二进制可以有32位,如果每一位分别用来记录一个玩家的 状态,那麽不是1个变量就搞定了? 是的,确实可以,下面代码说话:(为了代码易懂写成这个形式,实际上可以简写成这样:)(两种写法的结果是完全一样的) 如果又忘了位或的原理,请回头看一下。 如果玩家的id是2,那麽 1<<id 就是把 1 往左边移动 2 位,所以结果是这样的:那麽这个位置就是用来保存玩家2的状态了,如果这个位置是 1 就表示玩家活着。 否则玩家就是死了。 那麽要把这个值弄到 user_alive 变量里,就要用到位或了。 如果又忘了位或的原理,请回头看一下。这样你就把一个玩家的状态加进变量里了,user_alive 的其它位置当然是用来 保存其它玩家的状态的,每个玩家的id都不同,所以处在的位置也不同,不用 担心冲突掉。 那麽要怎么取得玩家的状态呢? 这里就要用到位与了。 忘记了位与的原理请回头看。 如果要判断玩家 2 的状态,那就先把1移动到玩家2的位置忘记了位与的原理请回头看。 直接把这个数和 user_alive 进行位与。二进制:因为 "100" 肯定大于0,所以如果返回值大于0,那麽玩家就是活着了。 如果玩家不是活着的话,就会变成这样:所以如果返回 “0” 就表示这个位置的值是 0 ,玩家也就是死了。 ------------------------------------------------------------------------------------------
native函数教程3 上一贴:http://tieba.baidu.com/p/3687126017 上一贴说了参数的各种使用方法,这贴是最后一贴,介绍另一种参数传递方式,此种方式更灵活,适合动态参数的Native函数。 什麽是动态参数?动态参数->不限定参数类型和数量:看到这里肯定有疑问了,这样的参数,怎麽接收呢? 这就是这次要介绍的内容。 先写两个插件测试一下:运行:提示:打开上一贴,观察register_native ( ) 函数的使用上的区别! 我们现在来看看register_native ( ) 函数的介绍:看到第3个参数,可见Native函数的参数传递方式有两种类型,当style为1时,Native函数的使用方法就可以像第1贴和第2贴说明的那样,直接对应的参数写上,当style为0的时候,就是另一种参数传递方式,两种方式不能混用,本篇介绍的就是style为0时,参数的使用方式。 当register_native ( ) 时,style设为0,那麽Native函数的本体就必须被声明成这样:接收到的第1个参数表示调用Native函数的插件的ID,第2个参数表示传递到Native函数上的参数数量。 那麽怎麽获得参数内容呢?可以参考amxmodx.inc的说明:这里中文解释一下上图每个函数的用途: 参数序号从1开始! get_****(参数序号, ...); get_string- 获取字符串参数值 set_string - 设置字符串参数值 get_param - 获取整数型参数值 get_param_f - 获取浮点(小数)型参数值 get_param_byref - 获取指针指向的整数型变量的值 get_float_byref - 获取指针指向的浮点型变量的值 set_param_byref - 设置参数指针指向的整数型变量的值 set_float_byref - 设置参数指针指向的浮点型变量的值 get_array - 获取整数型数组参数值 get_array_f - 获取浮点型数组参数值 set_array - 设置整数型数组参数的值 set_array_f - 设置浮点型数组参数的值 在pawn中,数组型参数始终传递指针而非传递数组数据。(不懂指针的含义请百度学习C语言指针) 注意:当声明Native时没有指定参数的类型,则参数默认传递参数的指针! 这样的参数传递过去将全部是指针!所以获取参数是要使用***_byref ( ) !使用get_param或者get_param_f会获取到错误的数值!怎麽指定好参数的类型呢?参数名前加上"&"符号表示传递指针,而不是数据本身,这某种程度上可以稍微提高速度(不必纠结)。 你可以理解为,如果Native函数没有指定参数的数据类型,那麽全部都是加了"&"的,全部都是指针。 那麽获取它的值的时候就得用get_param_bytef / get_float_byref 来获取了,就像这样:运行:当然你已经指定了参数的类型的话,代码就是这样的:运行:因为pawn中,字符串就是数组,所以字符串也是传递指针的,现在来演示获取一个字符串参数!运行:----------------------------------------------------低调的分割线----------------------------------------------------- 有了以上的演示,你应该已经知道,你的Native函数可以不限定接收的参数数量和类型! 你可能想问,我可以通过参数返回数值或者字符串吗?就像上一贴一样! 毫无疑问,这是可以的,因为指针就是用来做这种事的,指针就是指向一个变量的东西,使用set_param_byref / set_float_byref 你就可以设置指针指向的变量的值,就达到了返回一个数值的目的,说那麽多都是废话,见代码:运行:有了这个例子,其它那些set_string / set_float_byref / set_array 自然不在话下了吧,举一反三! 这里要提醒一下,设置数组的时候,保存数组的变量要和来源数组成员数相同! ----------------------------------------------------低调的分割线----------------------------------------------------- 就算是我也觉得这篇写得不够好,可能是因为准备不够充分的原因,如果看不懂的话,我也不重写了! 弃坑。。。
AlliedModders Open-Source ################################################################### ## AlliedModders ## Open-Source Software Group ## http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Falliedmods.net%2F&urlrefer=d60bbfe01802d8e7a28ac23d2efc85ff ################################################################### amxmodx AMX Mod X - Half-Life 1 Scripting and Administration Updated 2 hours ago ------------------------------------------------------------------------------------------------------------ sourcemod SourceMod - Source Engine Scripting and Administration Updated 18 hours ago ------------------------------------------------------------------------------------------------------------ metamod-source Metamod:Source - C++ Plugin Environment and Detour Library for the Source Engine Updated 2 days ago ------------------------------------------------------------------------------------------------------------ build-configs Build configuration files for AM Updated 2 days ago ------------------------------------------------------------------------------------------------------------ sourcepawn A small, statically typed scripting language. Updated 8 days ago ------------------------------------------------------------------------------------------------------------ stripper-source Stripper:Source Updated 8 days ago ------------------------------------------------------------------------------------------------------------ hl2sdk Half-Life 2 SDK Mirrors Updated 9 days ago ------------------------------------------------------------------------------------------------------------ ambuild AlliedModders C++ Build System Updated 15 days ago ------------------------------------------------------------------------------------------------------------ amtl AlliedModders C++ Template Library Updated 15 days ago ------------------------------------------------------------------------------------------------------------ cssdm Counter-Strike:Source Deathmatch Updated 17 days ago ------------------------------------------------------------------------------------------------------------ pawn-docgen Pawn documentation generator Updated on Oct 29, 2014 ------------------------------------------------------------------------------------------------------------ smxtools Tools for inspecting .smx files Updated on Sep 19, 2014 ------------------------------------------------------------------------------------------------------------ blaster Source and GoldSrc Query Tool Updated on Sep 8, 2014 ------------------------------------------------------------------------------------------------------------ metamod-hl1 Fork of Metamod for Half-Life 1 Updated on Aug 17, 2014 ------------------------------------------------------------------------------------------------------------ hlsdk Half-Life 1 SDK Mirror (2.3p3) Updated on May 25, 2014 - 楼主翻 amxmodx_mm.dll 的源码的时候发现的 - 不多解释,需要的人自然懂 - 代码 : http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fgithub.com%2Falliedmodders&urlrefer=b93c642d45b274e1749cb1fe0d3a5d67
首页 1 2 3 4 5 下一页