DNF第八张dnf韩服90版本出来吗后COF要怎么减的快?

DNF现在降COF值的最快最好的方法是什么啊?我四十级?_百度知道热门排序 |
前言:&br&&br&以下内容可能包含:跑题、民科、逻辑漏洞、无干货、主观偏见、瞎比比、瞎比比、瞎比……等恶性内容。&br&&br&请谨慎观看,善用反对。&br&&br&&br&对于一款网游来说,外挂就如同寄生虫一般,和大部分寄生虫一样,这种寄生会有三种结果。&br&&br&「一」共生&br&「二」被宿主杀死&br&「三」杀死宿主&br&&br&一般来说,什么样的结果,取决于一个三方角力情况,即:&br&&br&「1」游戏本身的素质和选择&br&「2」外挂功能的作用和破坏&br&「3」运营手段的阻止和取舍&br&&br&与游戏共生的外挂,一般游戏本身素质过硬,外挂作用更趋近于辅助和对功能的补充,运营商也只需宏观调控,便不太会出漏子,同时也能提高玩家的体验,比如传奇的免蜡,虽然对游戏本身的设计有一些破坏,但对玩家来说是好事。&br&&br&后来传奇的外挂发展到自动喝血,自动跑路,红血下线,自动修理,自动烈火等等,大部分机制被后来的设计者直接做在了游戏里,美其名曰满足玩家需求,也算是把这部分外挂洗白了;也有开发商愿意放出部分接口,供玩家制作「插件」,包括允许玩家自编译的宏,从而为玩家提供更多的功能便利和DIY需求。&br&&br&还有一种共生的外挂是挂机脚本,大多是工作室在用的挂机脚本和脱机挂,这种共生就显得更有哲♂学性:游戏要给工作室留饭,工作室要活跃游戏经济,玩家需要从工作室那获取便宜的劳动成果,还是在满足需求的基础上,开发者与工作室频繁地勾心斗角。&br&&br&所以共生的「外挂」,大多是「1」「2」「3」势力均等,各取所得罢。&br&&br&而被宿主杀死的外挂,则是「1」「3」强势互补,「2」相对弱势,那么一旦「2」的作用力越过了界,变会惨遭封杀。&br&&br&一部分老玩家知道,WOW当年由于底层的漏洞,是出过飞天挂的,但是一来,当时有CDKEY成本(运营策略),二来暴雪本身和要求代理在行政干预手段上保持强势(事实上,当初还有国内玩家在外服升级过快导致被GM出手强行冻结的故事,摊手),所以恶性外挂很快就被扑灭了;而一部分预备不足,没有在反外挂上做多作预防的开发商,唯有靠运营方的强势来来保证游戏的健康运行,比如魔力宝贝3.0主打绿色版本,号称一次封禁三万用户的故事,还有OW,暴雪一次封停一波的故事。&br&&br&不过这一部分不一定能「保持」杀死外挂:一者如果开发运营不是同一方,那么运营商就会成为一个摇摆的个体,他们的策略会随着运营情况发生变化,涉及到留存和收入,他们甚至通过收紧--放宽的手段刺激市场,如果运营数据上不好看,随时可能撒手崩盘;而即使是运营开发为一体或者更紧密的游戏,也很容出现开发给运营增加难度的问题,比如用过重的压力和奖励刺激了玩家,致使外挂使用者曲线增长的OW。&br&&br&然而毫无疑问的是,被逼无奈的行政手段一定会影响到玩家的的体验和情绪,进而影响收入和留存,这是不可避免的代价。所以在中国这个人口基数众多,大部分受众游戏动机不纯的国度里,开发者倾向于不给玩家使用外挂的机会,从底层严防死守,坚决信服务器,从而封堵外挂开发者越线的机会,是外挂的功能保持在第一种情况下,从而减少于角力的损失风险。&br&&br&而做不到的,大部分的结局就只有第三种:被外挂杀死。&br&&br&其实,被外挂杀死的游戏,并不一定真的是被外挂杀死的……这句话可能让你很困扰,但是无论如何,被外挂杀死的游戏,锅都可以花式甩给开发者。&br&&br&我们之前说,外挂是三方角力的一场大戏,在这场大戏中,开发者如果错误过重,那么就会让游戏不可避免地被外挂毁掉。&br&&br&我们知道,98.35%的韩国游戏是信客户端的,也就是说,这种游戏制作外挂非常非常的容易,甚至04年还是06年来着有一款游戏叫英雄王座,可以用金山游侠直接改数据,这我他妈还能说什么?&br&&br&而这样的游戏,除了靠行政手段----检测、封号----基本是没办法处理的。然而检测可以规避,封号可以再开,一些没有养成成本的游戏,基本上被外挂抓住就是一波团灭。再后来基本上就是被拿着尸体开私服,供人吊唁和怀念了。&br&&br&然而,这样看似死于外挂的游戏,真的是死于外挂吗?&br&&br&我不这样认为。&br&&br&我主动选择外挂的一款游戏叫作「惊天动地」,代理商叫作摩力游,在本地化的过程中,摩力游将游戏的技能、等级等核心成长数据提升速度减少了十倍,以配合本地化的运营需求----说白了就是坑钱----这让外挂不得不越界,玩家不得不越界;而代理商根本不敢封禁外挂,甚至大部分玩家因此相信外挂就是官方开发的……&br&&br&那么,「3」出了漏子瞎比搞,「1」就不会了吗?08年,我去玩赤壁,开发运营都是完美时空。彼时免费游戏运营手段已经初见成熟,用成长节奏卡人的手段也是百玩不厌:有限的主线、日常任务和经验产出,死亡掉落经验,付费额外经验等等----一时不适应的玩家,便会去选择挂机挂。&br&&br&我们知道,每一个外挂背后都有一个使用者,与其说一款游戏会被外挂毁掉,倒不如说会被外挂的使用者毁掉----因为外挂毕竟是客观存在的,使用者才具有主观能动性,外挂做得再过线,没人用也是死物。&br&&br&而玩家选择外挂的动机是什么?简单来说:玩家在游戏中,对自己所不能企及的目标,有病态的渴望。&br&&br&使用外挂是谁的错?玩家,毫无疑问,他们破坏了游戏的规则;而这个目标是谁制定的?是游戏本身,毫无疑问,是他们制订了游戏的规则。&br&&br&其矛盾便在于:当我没办法满足游戏为我设置的高压线,甚至没办法完成游戏的基本目标去获得乐趣,那么我除了流失,便只有寻求帮助这一条道路。&br&&br&那么,什么样的帮助是玩家可选的呢?***包括:充值,外挂,代练,代打----它们都不是什么高尚的帮助,确是玩家需要的,实实在在的帮助。&br&&br&所以我认为,当玩家大规模寻求外挂的时候,必然是游戏中的一部分设计出了问题,如果设计者说没有问题,那么就是设计者在主观角度上利用者这种问题。&br&&br&我们说韩国游戏外挂多,你们说他们死于外挂,可是即便没有外挂,大部分的MMORPG单一的刷怪、升级、掉宝、PK的枯燥体验,真的能维持玩家多久吗?后期端游为了工作室,连野外掉宝都不敢做了,在这种状态下如果还要玩家挂怪物升级,难道不是自己作死吗?&br&&br&就我个人的体验来讲,在我寻求使用外挂的时候,本身就已经处于一种「濒临流失」的状态了;而从同类游戏中我所看到的言论来讲,玩家说「用挂如果被封,那大不了就不玩了」----这种状态不是外挂带给我们的,而是游戏本身粗暴的成长体验和硬性拉长了成长曲线的行为造成的。&br&&br&开发者想要用数值和胜负心去吊玩家的时间和金钱,就要对玩家付不起代价而流失或者干脆铤而走险有心理预期;同理,开发者想要通过高荣耀和奖励,却设定一个大部分玩家难以企及的目标,就要对玩家不甘心失败而寻求帮助或者干脆铤而走险有心理预期。&br&&br&所以在我看来,没有一款著名的游戏是真正意义上死于外挂的----游戏的气质决定了游戏的受众,如果做了什么样的游戏没有什么样的觉悟,面对什么样的用户没有什么样的预估,那么与其说是名为外挂的寄生虫杀死了你,倒不如说你的死亡气息,吸引了寄生虫的注意。&br&&br&我突然想,很多单机游戏,修改了,就变得很没意思,我不能说这样的游戏都是坏游戏;而有的游戏,玩家会从根本上抵制,或者淡忘修改,甚至即使修改了,也会玩得津津有味。&br&&br&我敢说这样的游戏,都是好游戏。&br&&br&以不上!
前言: 以下内容可能包含:跑题、民科、逻辑漏洞、无干货、主观偏见、瞎比比、瞎比比、瞎比……等恶性内容。 请谨慎观看,善用反对。 对于一款网游来说,外挂就如同寄生虫一般,和大部分寄生虫一样,这种寄生会有三种结果。 「一」共生 「二」被宿主杀死 「…
当年有绿装。&br&当年随便爆件紫装就很满足。&br&当年40多级就可以来新手副本装B,记得当年见到一狂战士开双刀用大吸兴奋的不行。&br& 当年僵尸8000一位,悬空城1W,城主1W5,单带任意图也是这个价。&br& 但你还得拜师,因为要注意不知道有啥用的COF点。 &br&当年土罐下面小摊一把20级蓝色光剑小十万,刚转职找基友借钱买。 第一次开二刀兴奋的不行。&br& 一把极光脸贵成狗。&br& 当年见一路人穿着加十梵风衣和墨竹把我和小伙伴羡慕坏了。 &br&当时的梦想是把细雪之舞。 当时的细雪之舞样子巨好看。&br&当时的复活币从来不够用。&br&当时紫装就是奢望,粉装没想过,史诗没见过。&br&当时最拉风的刀是流星落。&br&当时我打不过城主宫殿。&br&也打不过随机深渊。&br&&br&&br&后来我想要的都有了。&br&我有两把流星落,我有满级号,我有史诗,我可以随意过王的遗迹。&br&但我一直单刷再没有朋友。&br&我不再非常仔细的纠结加点,因为无所谓。&br&我不再深思熟虑的考虑买哪组套装,因为现在都是假紫。&br&哦,对了,那时一个磷岩护肩贵成狗,我当时玩大***只想杀光所有玩狂战的
&br&谁还记得斩影三件套。&br&&br&现在可以随便充点卷换金币买装备。&br&我可以买到我当时梦想的一切装备。&br&但无论我再充多少钱。&br&那些灰色的名字都不会再亮起来。&br&也没有人会再拿跟梵风衣长的一样的防弹夹克骗我。&br&也没有人再会私信问我组不组队。&br&&br&我不开心。
当年有绿装。 当年随便爆件紫装就很满足。 当年40多级就可以来新手副本装B,记得当年见到一狂战士开双刀用大吸兴奋的不行。 当年僵尸8000一位,悬空城1W,城主1W5,单带任意图也是这个价。 但你还得拜师,因为要注意不知道有啥用的COF点。 当年土罐下面小摊…
我也来简单回答一下题主。&br&首先, 外挂是一门很大很注重实践的一门技术大类。&br&在这个技术大类之下还分很多小类。&br&一般来说分逆向,编写逻辑 这2方面&br&所谓逆向,也就是分析游戏的客户端,寻找相关功能的函数&br&而编写逻辑,如掉线重登,自动打怪,自动吃药 之类等等等。&br&但是实际上, 写一个挂,远远不止上述的2方面&br&比如说还要过游戏的保护,这个需要运用Window内核的知识。&br&以前的大神写挂都是单独一人完成的,这个需要懂的内容非常非常多。&br&我列举一下成为一个全能大神所需的知识:&br&首先,汇编的基础知识必须过硬,有良好的逆向经验。了解常用的数据结构(因为游戏的背包或者怪物之类的多用二叉树或者数组, 连基本的数据结构都不懂……那玩个蛋)&br&了解API,R3(Native API),R0(内核),Socket。熟悉一门编程语言(只会汇编也可以)&br&如果你能把上述的学精,就有成为大神(外挂类)的潜质。 &br&-------------------------写着写着突然不想写了,以后再补充吧--------------------------------------&br&竟然有人评论……那我继续写了。&br&&br&如果是对编译原理比较了解的基友,应该就知道。&br&一个静态函数是一个固定的CALL,一个struct的结构内容都是用偏移可以算出来所有成员的。&br&所以逆向游戏客户端,分析出游戏中的某些功能函数的地址,再加以分析出所传递的参数,模拟调用。这样一个简单的功能就完成了。&br&当然,这中间还牵扯到其他不少的东西, 比如说必须熟悉结构,&br&举个栗子:&br&当你看到一个参数他的内存形式如下:&br&0x11110&br&0x111110&br&0x11114&br&&br&这样的玩意,就很快可以联想到这是一个数组,还是一个vector。&br&这些除了要有逆向的功底以外,还需要有“逆向游戏的经验”, 因为游戏的参数都那德行,万变不离其宗。&br&除此之外, 游戏现在都有防多开的干涉。&br&在不谈驱动保护的前提下, 你需要熟悉Window的工作机制,特别是互斥的工作原理,当然,现在游戏保护不止是互斥判断多开,比如说进程路径重复,类名,窗口名,互斥,内存映射,判断文件是否存在等等之类的……所以你至少要把那本Window核心编程给看熟。&br&这方面的书籍, 我也没有太多的介绍, 现在有不少人是熟悉逆向,而不会过多的编程的“外挂作者”。 他们都并非靠对编译原理的理解去逆向游戏数据,而且靠“经验”去逆向游戏数据。&br&总的来说,我看他们都是在网上找教程看下,再加以练习,就能达到这个水准了。&br&&br&那么接下来再讲讲编程这块。&br&因为需要稳定不需要过多的人工量去看的挂机,所以你需要写得非常“智能”,简化操作流程,还要把角色的伤害跟玩家相提并论, 此过程听起来很简单, 操作起来非常麻烦。&br&首先多线程你要懂吧? 比如说你必须无时无刻都在判断人物Hp低于某个程度就得啃药了吧?总不能每写一句代码就写if判断一次血量吧?&br&还有某些全局数组或者vector之类的多线程操作,比较基础的互斥啊,临界区之类的你要用吧?&br&总而言之,多线程这块就是麻烦!这类书籍我也就不班门弄斧了,想必各种大神的推荐应该更有力。&br&接下去还需要懂Native API。 就是俗称的R3. 亦是巨硬没公开的API, 需要用这层去隐藏自己的DLL,防止游戏的检测。 还有多开之类的,一般都在这层完成的。&br&你需要懂一点PE文件格式,把大部分的Native API的运行方法,调用方式给弄懂。&br&还需要懂Socket网络编程.&br&因为 你需要怎么“验证”自己,达到给工作室收费的目的,&br&还有你需要怎么“验证”自己,达到防止被别人破解的目的&br&当然,牵扯到socket了,我是看了,会socket的,大部分都会数据库操作的。&br&要嘛是MSSQL,要嘛是MySQL。 这个方便查询和管理。(这个数据库对写挂木有硬性要求)&br&socket无非就是粘包之类的,超时之类的判断。 赶脚不需要学到很深。&br&当然,如果你还要弄脱机挂,底层的TCP协议是必须会的。&br&还有加密和解密算法得杠杠的,逆向功底也要杠杠的。&br&&br&我想下,编程这块应该就剩下个脚本了吧? 会一门脚本语言这个应该很easy。&br&还有应该懂一点算法, 比如说A*, dijkstra,之类的。&br&&br&剩下就是Window内核了,就是俗称的R0,驱动层。&br&……&br&就先写到这里了……以后想多了再补充。&br&&br&&br&------------------8.24号更新--------------------------------&br&有兄台问: 为何要精通汇编……&br&这……难道还有游戏的源码供你调试? &br&在木有游戏的源码下,只能看汇编……&br&&br&有兄台问:现在外挂的行情如何:&br&我只能说, 没几年前那么好赚了, 几年前在DNF大火的时候,养了一大批中国的外挂作者和工作室。 但是现在的游戏,防得越来越严了。&br&新人最难的就是入门, 而真正赚钱的东西,都被各家的前辈捂得严严实实的。&br&哪怕你是一个编程高手,逆向高手。 当你真正写出一个挂的时候,会发现,玛德被封号了。 为何不稳定? 5分钟掉一次线? 为何总是跟不上工作室的需求, 不知道弄什么功能出来才是工作室所需的,而工作室本身就不是很懂技术,说的东西总是含糊其词的…… 恨不得直接可以刷软妹币到他们的口袋。&br&&br&这个行业很讲经验, 对付封号的经验,跟工作室配合的经验,熟悉游戏的经验, 怎么才能用最短的时间,写出工作室最需要的功能。 &br&&br&顺便一提, 就是这些经验,都是需要时间的日积月累。 然而新人入门都倒在了这个门槛上,很少有人能够坚持个几年去不断摸索学习。&br&当然现在也有很多写挂的教程视频,请允许我对这种视频说一句:然并卵!&br&&br&真正赚到钱的作者,根本不会去在乎那点小钱,也不会拿这种共享的心态去分享这些经验,这些经验对于他们来说就是收入,他们公开了这些经验,很多人知道,就意味着很多游戏公司的反外挂部门也知道, 那就是打破自己的饭碗。 &br&&br&知乎很多大神,有很多反外挂的大神,也有很多写挂的大神都混在这里(所以我才匿名,免得被认出来)&br&&br&很多人进这行1年都能赚百万,有人5年都赚不到10万。 总是有高有低,有起有落的。&br&&br&就如同在国家严打黑客前,当年的***盗号,入侵教程如春笋般在各种网站上公开叫卖, 肆意挥霍的年代, 很多大神就是从那个(相对于现在这个年代的环境已经是超级好了)年代成长起来,以前是年代也是“相对”比较单纯,现在学渗透,不如以前的学习环境好, 但是长江后浪推前浪,后浪死在沙滩上,依然有人在这种国家要严打的环境下 还是成长到媲美 上一代大神的境界。&br&&br&最后给各位读者一句衷心的劝言:&br&没有一颗沉得住寂寞的心,不要轻易进这个行业&br&没有一颗2年都赚不到钱的觉悟,不要轻易进这个行业&br&没有一颗坚强的心(偷摸拐骗在这个行业处处可见),不要轻易进这个行业&br&&br&我也比较认同楼下的说法, :&br&技术的成长路线 全看个人,虽然这条路很偏,这门技术在“正统”的领域中,很少有用得上的。&br&&br&最后总结一下这门技术, 是非常注重“实践”和“调试”,&br&如果想增强一下对语言底层的理解,逻辑思维的增强,调试功底, 可以稍微浅入这个领域去学习一下。&br&&br&特别是调试功底~! &br&在木有源码,无法调试的情况下,甚至在不知道,出错是你的锅,还是游戏的锅。不知道为何运行一段时间崩溃后,疯狂查日志的寂寞。&br&&br&这个行业 也确实是比较“浮躁”的一个行业,功利心很强, 大家都是向着利益看齐。因为利益而解散的写挂团队我也见过太多了。 可以这么说,写挂团队解散有60%是赚不到钱,35%是利益纷争,5%是其他原因。&br&&br&---------先写到这里,虽然木有大神在行业混了8年的经验,也曾呆过这个行业一段时间,比较了解。 也很乐意分享各种见闻(经验分享我就不说了:毕竟这是灰色产业,明目张胆的说,会坑爹的。)---------------------------------&br&&br&&br&----------------------------------------------------------------&br&嘿嘿, 好长时间没来更新了, 发现挺多赞的。
那就再更一发。&br&老夫来说一下, 如果要完成一个“完整的工作室内存外挂”, 需要什么功能, 需要哪些技术。&br&&br&首先:老夫只拿我自己做过的例子来举例, 不代表其他人的做法也是一样&br&第一步: 写一个控制台。 我是用C#来写(MFC太烂了, 又长又臭。), 方便工作室操作, 一般是存放帐号,还有操作一些配置文件(比如说设置低于%? 就吃药, 设置了收货【邮件或者交易】角色名之类等等诸如此类)。 为了防止别人认出来, 就不丢图了。 老夫找一张类似的图片&br&&br&&img src=&/fa128a1cdfcff3bed4ad_b.png& data-rawwidth=&554& data-rawheight=&361& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/fa128a1cdfcff3bed4ad_r.png&&&br&基本就做这个玩意。 大部分都是读取配置文件, 做一些界面交互的功能。 写好List。 和一些界面操作之类的。&br&基本就是dataGridview操作, StreamReader, StreamWriter, 各种拖拉控件。 完事。&br&&br&&br&第二步:&br&然后老夫会用cpp写一个DLL。 用来跟C#的界面交互。 利用内存共享来和游戏的DLL交互信息. &br&基本这个就用到内存共享, CreateFileMapping, MapViewOfFile, OpenProcess, 诸如此类。
然后基本就是各种判断, 比如说掉线呐, 超时呐, 状态呐。 还有对在线帐号做各种判断操作, 比如说刷完 的角色要保存日志, 该删的删, 该留的留。 还要做登录初始化处理之类的。 &br&&br&第三步:&br&写注入(基本都有现成的, 为了流程规范! 还是单独列出来好了。 OOP思想已经祸害了老夫了)&br&一般常用的注入很多, 比如说APC注入,输入法注入, DLL劫持。 OEP改入口。 远线程注入。 无模块注入(一般是申请一块内存, 然后把整个DLL复制过去。 修复导入表,重定位后,加载dllmain), 还有驱动级的一大堆就不一一细说了。
注入方法五花八门,不管是哪种方法, 只要有效, 能防止游戏检测到,又可以用。 那就是一个成功的注入。&br&&br&第四步:&br&逆向游戏功能(其实这个才是第二步,注入是第一步)&br&这里也分2种, 一种是先找遍历, 一种是先找发包&br&//&br&找游戏的明文发包, 这个可以大概说一下, 因为一般来说, 建立tcp连接, 都是需要connect, 然后send 或者 recv之类的。&br&但是一般来说, 基本都是send都是经过单次或者多次加密后的密文封包, 所以并没有太大意思, 有些甚至是搞了多线程, 一个线程检查一个全局队列之类的然后send, 另一个线程负责push。
比如说基三就是这样干的!&br&当然往上回溯之类的现在已经不怎么好用了。
这里面的篇幅太长太长了, 就不一一细说了, 因为里面还有很多小技巧的东西, 很多关于经验, 感觉之类的事。&br&//&br&遍历一般是指, 周围怪物, Npc, 技能, 背包, UI之类的。 从林林种种的数据结构中, 找到自己想要的数据。 &br&比如说怪物是用树状结构保存的, 但是每一个CMonster 都是一个超级大的结构。 他里面还包含了很多类,结构, 也可能继承了N个类, 也有N个指针,N个虚函数。&br&很多我们都是不需要的, 所以需要一一细分, 比如说, 只要怪物HP,MP, 角度, 坐标,之类的。 像怪物的形状, 外形, 颜色之类的,我们根本不care!&br&// &br&然后就可以和明文发包结合了。
&br&举个栗子, 使用技能函数&br&无法就是&br&static UseSkill(dwSkillId, dwTargetId)&br&{&br&send(............)&br&}&br&所以你找到你明文发包的CALL。
那么你只需要在CALL头部下一个断点即可。 &br&基本内容就是只要SkillId和TargetId, &br&比如说&br&卖, 也一般就只有NpcId, ItemId, Count之类的。 游戏不一样, 可能做法不一样。&br&&br&从这一步, 可以实现相当多的功能, 比如说自身的HP&? 就使用物品。&br&可以实现自动打怪,捡物, 做任务之类的………………&br&这一步其实需要的功能很复杂, 但是技术含量我认为并不高。
时间做久了, 就是写业务逻辑的事。&br&&br&第五步:&br&就应该来到脚本这块了。 如果是用lua写脚本的话。 那基本就是封装几个函数的事。 比如说交任务, 接任务, Move, Npc对话之类的。 反正大部分游戏不都那个尿性嘛?整天跑来跑去, 跟几个Npc对对话, 虐虐小怪, 跟Npc美女谈笑风生。&br&这块就是体力活了。&br&&br&第六步:&br&把控制台, 控制台DLL, 游戏DLL结合起来。 比如说血量控制呐, 超时判断呐, 怪物过滤表之类的要与控制台交互起来。&br&&br&第七步:&br&socket, 要给工作室写收费系统。
这一步工作量也不少。
前面几步是跟游戏斗智斗力, 这一步是跟破解者斗智斗力, 比如说有很多阴险的检测. 什么删系统, 格式化之类的。
&br&&br&第八步:&br&基本这一步就可以到封号的步骤了,
以前游戏封号五花八门, 也有很多规则可循的。&br&比如说某个区域就检测加速, 某个时间段就检测一次。 检测到就晾个几天再把你封号。 还有CRC校验代码段, 上传DLL, 按键检测, API检测………………&br&我说几个例子, 某游戏, 就在检测你模拟鼠标, 比如说正常人的鼠标, 是有轨迹的移动过去的。 他就给你检测你的鼠标是否“瞬移”出现在某处, 还有键盘的按下和弹起时间, 太快了要遭殃!(这种都有权值的, 大意就是分数。 超过及格线, 基本就晾个几天就必封了!)&br&比如说还有堆栈回溯, 查看调用CALL是否在本模块中………………&br&据说TX跟暴雪 学了一个新招, 做一个Loader加载器。
然后随机从服务器下载一段shellcode。 然后运行这段代码, 把结果返回给服务器。
本地毫无痕迹! 而且下载回来的代码全部是vm混淆过的。&br&咳咳, 里面还有各种奇招, 就不一一阐述了!&br&&br&回头一想, 也发现漏了很多步骤, 比如说TX的就有TP保护。 盛大网易的有HS和NP保护。 所以还需要驱动层说。 比如说TP是DebugPort清0之类的。 NP老版本可以解密配置文件剥离。
还有重载内核, 用VT, 自己重写异常处理之类的一大堆手段可以过保护。&br&&br&也有游戏多开没说, 还有隐藏自身这块也没说……&br&发现写了N多了。 就先说到这里了。
有空下次再更新!&br&赞多了再更!&br&&br&------------------------------------------------------------------&br&长夜漫漫, 无心睡眠。 那就来更一发吧!&br&这次直接上教程和代码(用TX的某游戏来演示, 只进行技术研究, 禁止用于非法用途! )&br&&br&&img src=&/5b97ad17aa9fcfa0e08fc_b.png& data-rawwidth=&530& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&530& data-original=&/5b97ad17aa9fcfa0e08fc_r.png&&祭出CE!
开始从人物HP下手&br&&img src=&/534e304ceb8_b.png& data-rawwidth=&310& data-rawheight=&512& class=&content_image& width=&310&&&br&开始找小怪攻击自己来掉血&br&&img src=&/2f64f0db7b9ded3f970f94e_b.png& data-rawwidth=&876& data-rawheight=&355& class=&origin_image zh-lightbox-thumb& width=&876& data-original=&/2f64f0db7b9ded3f970f94e_r.png&&找到了!&br&索引第0,1,3个是当前HP
2,4是MAXHP&br&接下来打开OD! (怎么附加进程这里略过……这个又可以说一个一本书那么厚的文章的如何对抗TP反调试)&br&&img src=&/7acc812cf5a82c9f87104bcaab918b62_b.png& data-rawwidth=&294& data-rawheight=&246& class=&content_image& width=&294&&0x2E70=11888(因为已经回满血了) &br&&img src=&/eb754b5ad3d0da79c0476e_b.png& data-rawwidth=&498& data-rawheight=&573& class=&origin_image zh-lightbox-thumb& width=&498& data-original=&/eb754b5ad3d0da79c0476e_r.png&&下一个硬件访问断点!&br&&br&&br&&br&&img src=&/d7d78c37ed4cba918d93e9bcc7a7d997_b.png& data-rawwidth=&1070& data-rawheight=&835& class=&origin_image zh-lightbox-thumb& width=&1070& data-original=&/d7d78c37ed4cba918d93e9bcc7a7d997_r.png&&&br&&div class=&highlight&&&pre&&code class=&language-ca65&&&span class=&mi&&004705&/span&&span class=&n&&E1&/span&
&span class=&mi&&8&/span&&span class=&n&&B87&/span& &span class=&n&&C0000000&/span&
&span class=&n&&MOV&/span& &span class=&n&&EAX&/span&&span class=&p&&,&/span&&span class=&n&&DWORD&/span& &span class=&n&&PTR&/span& &span class=&nl&&DS:&/span&&span class=&p&&[&/span&&span class=&n&&EDI&/span&&span class=&o&&+&/span&&span class=&n&&C0&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&从这句代码可以看出, 这个角色当前HP 是 EDI + 0xC0.&br&那么你可以猜EDI就是当前人物角色指针.&br&&img src=&/e16ed4f3037a_b.png& data-rawwidth=&337& data-rawheight=&229& class=&content_image& width=&337&&那么我们继续回溯这个指针是怎么来的!&br&&img src=&/f10aba3bd7bcd32c3d96fdb_b.png& data-rawwidth=&1208& data-rawheight=&567& class=&origin_image zh-lightbox-thumb& width=&1208& data-original=&/f10aba3bd7bcd32c3d96fdb_r.png&&&div class=&highlight&&&pre&&code class=&language-ca65&&&span class=&mi&&&/span&
&span class=&mi&&8&/span&&span class=&n&&BB8&/span& &span class=&mi&&&/span&
&span class=&n&&MOV&/span& &span class=&n&&EDI&/span&&span class=&p&&,&/span&&span class=&n&&DWORD&/span& &span class=&n&&PTR&/span& &span class=&nl&&DS:&/span&&span class=&p&&[&/span&&span class=&n&&EAX&/span&&span class=&o&&+&/span&&span class=&mi&&80&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&&img src=&/5d22df156ed81f513ccd3c_b.png& data-rawwidth=&1224& data-rawheight=&578& class=&origin_image zh-lightbox-thumb& width=&1224& data-original=&/5d22df156ed81f513ccd3c_r.png&&继续往上翻。 就可以得出人物血量= [[[11B0A9C]+34]+80]+0C0&br&&img src=&/97a3b6b8eee64e89ae0c219f360fe665_b.png& data-rawwidth=&321& data-rawheight=&338& class=&content_image& width=&321&&这里11B0A9C 是一个全局静态类&br&如果对C++这块稍微有点了解的就知道了。 这种情况不过是类里面有类/结构 变量/指针&br&比如说&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&k&&class&/span& &span class=&nc&&CBns2&/span&
&span class=&p&&{&/span&
&span class=&p&&...........&/span&
&span class=&p&&}&/span&
&span class=&k&&struct&/span& &span class=&n&&strcut1&/span&
&span class=&p&&{&/span&
&span class=&p&&........&/span&
&span class=&p&&}&/span&
&span class=&k&&class&/span& &span class=&nc&&CBns1&/span&
&span class=&p&&{&/span&
&span class=&p&&.......&/span&
&span class=&p&&.......&/span&
&span class=&n&&CBns2&/span& &span class=&n&&CBns2_&/span&&span class=&p&&;&/span&
&span class=&n&&strcut1&/span& &span class=&n&&strcut1_&/span&&span class=&p&&;&/span&
&span class=&n&&CBns2&/span&&span class=&o&&*&/span& &span class=&n&&pCBns2_&/span&&span class=&p&&;&/span&
&span class=&n&&strcut1&/span&&span class=&o&&*&/span& &span class=&n&&pstrcut1_&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&&br&当然也不一定是这样的。 推测罢了。&br&// 注意, 这里的11B0A9C 是静态指针, 一般来说是不会变的。 如果会变的。 他有可能是属于DLL的全局指针, 因为win7有地址随机。 所以不能这样直接写。暂时先说这个情况&br&// 把DLL注入到游戏的情况下, 否则只能用OpenProcess + ReadProcMemory的方式读取&br&然后就可以写代码来实时获取人物血量了! &br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&n&&DWORD&/span& &span class=&nf&&ReadDWORD&/span&&span class=&p&&(&/span&&span class=&n&&_In_&/span& &span class=&n&&DWORD&/span& &span class=&n&&dwAddr&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&DWORD&/span& &span class=&n&&dwValue&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&IsBadCodePtr&/span&&span class=&p&&(&/span&&span class=&n&&FARPROC&/span&&span class=&p&&(&/span&&span class=&n&&dwAddr&/span&&span class=&p&&)))&/span&
&span class=&n&&dwValue&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&p&&(&/span&&span class=&n&&DWORD&/span&&span class=&o&&*&/span&&span class=&p&&)&/span&&span class=&n&&dwAddr&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span& &span class=&n&&dwValue&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&DWORD&/span& &span class=&n&&WINAPI&/span& &span class=&nf&&_WorkThread&/span&&span class=&p&&(&/span&&span class=&n&&LPVOID&/span& &span class=&n&&lpParm&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&nb&&true&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&DWORD&/span& &span class=&n&&dwHp&/span& &span class=&o&&=&/span& &span class=&n&&ReadDWORD&/span&&span class=&p&&(&/span&&span class=&n&&ReadDWORD&/span&&span class=&p&&(&/span&&span class=&n&&ReadDWORD&/span&&span class=&p&&(&/span&&span class=&n&&ReadDWORD&/span&&span class=&p&&(&/span&&span class=&mh&&0x11B0A9C&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&mh&&0x34&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&mh&&0x80&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&mh&&0xC0&/span&&span class=&p&&);&/span&
&span class=&o&&::&/span&&span class=&n&&Sleep&/span&&span class=&p&&(&/span&&span class=&mi&&100&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&这里就可以获取到人物HP了! MAXHP略过, 方法同上!&br&接下去就可以继续逆向游戏功能&br&比如说要做一个吃药的功能。 当HP & %50的时候, 就自动吃药. 伪代码如下&br&while(true)&br&{&br&
::Sleep(100);&br&
if(GetPercentHp() & 50 && ExistItem(回血道具) && GetItemCD(回血道具) == 0)&br&
UseItem(回血道具)&br&}&br&&br&……不知不觉已经凌晨2点了。 下次有机会再把上面的逆向和代码写完。&br&记得点赞!&br&&br&///////////////////////////////////////////////////////////////////////////////////////&br&继续更!&br&接下来做找明文发包CALL。 一般游戏处理是 明文打包-&加密包-&send&br&过程略……发包就在这里&br&&img src=&/1fa2d69e5677e1caf6daf8d_b.png& data-rawwidth=&1055& data-rawheight=&841& class=&origin_image zh-lightbox-thumb& width=&1055& data-original=&/1fa2d69e5677e1caf6daf8d_r.png&&&br&啃一瓶药. &br&下断点!&br&&img src=&/772cbbe51149d62cfbfb31ae6b2d0def_b.png& data-rawwidth=&1065& data-rawheight=&851& class=&origin_image zh-lightbox-thumb& width=&1065& data-original=&/772cbbe51149d62cfbfb31ae6b2d0def_r.png&&从调用堆栈可以看到调用的函数地址&br&&img src=&/6f727e48a54c5e248de2c2_b.png& data-rawwidth=&986& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&986& data-original=&/6f727e48a54c5e248de2c2_r.png&&然后一个一个分析参数。 &br&首先逆向游戏是需要先对游戏的数据结构有一定了解才能模拟调用。 &br&比如说这里的&br&PUSH 30&br&CALL 00CDF02E&br&就是申请 0x30大小的内存大小嘛&br&&img src=&/a95a56fbfc7_b.png& data-rawwidth=&963& data-rawheight=&1009& class=&origin_image zh-lightbox-thumb& width=&963& data-original=&/a95a56fbfc7_r.png&&然后从这一层可以看到代码大概如下, 只要把0x30的参数按原来的形式填进去, 就能send&br&&br&那个10002从其他地方分析(略)可以得出, 1是指背包位置, 最后一个2是指类型。 2是指背包.&br&所以如果背包第二个物品就是20002, 背包第三个物品就是30002.&br&EAX && 0x10就是获取背包位置&br&申请的内存是MOV ESI,EAX. &br&所以MOV WORD PTR DS:[ESI+10],AX&br&就是&br&*(WORD*)(ESI + 0x10) = 背包位置;&br&&br&然后接下去看看别的参数&br&&img src=&/afe5c5fe62c416_b.png& data-rawwidth=&907& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&907& data-original=&/afe5c5fe62c416_r.png&&先将申请的内存清0&br&&img src=&/00bed15fbe3fc35c5abf36c0c27c5221_b.png& data-rawwidth=&1143& data-rawheight=&937& class=&origin_image zh-lightbox-thumb& width=&1143& data-original=&/00bed15fbe3fc35c5abf36c0c27c5221_r.png&&可以看出来这个0x30大小的数组内容是这些. &br&基本上就是0x10是填物品位置。&br&然后0x28和0x2C填0xFFFFFFFF&br&然后干货就是0x18,0x1C,0x20了&br&&br&然后接下去继续返回上一层继续找EBX的来源会发现他其实就是[[[11F57AC]+34]+80]&br&所以&br&*(DWORD*)(ESI + 0x18) = [[[[11F57AC]+34]+80]+8]&br&*(DWORD*)(ESI + 0x1C) = [[[[11F57AC]+34]+80]+C]&br&&br&至于0x29嘛, 刚刚准备写的时候发现&br&&img src=&/bdfbba95be9cf50d4e97f51_b.png& data-rawwidth=&331& data-rawheight=&152& class=&content_image& width=&331&&算了。 就写到这里啦。 &br&&br&感觉下次得上欧美服或者韩服去才行。 国服真是越来越难调试了。&br&&br&// by 7.29&br&想要我私信的自己先想好问什么问题好嘛?&br&前面一大堆人我都私信过了, 结果一大堆都是连问问题都问不清的人, 剩下的一堆就是无视了我的私信。&br&最后还有1个想让我教他的,我也教了差不多2个星期。 结果两天打渔三天晒网. &br&劝各位一句:只要是学编程相关的, 自认不是天才的情况下, 还是老老实实每天敲8个小时代码(看书), 不然你这样学到30岁都不知道能不能学有所成。&br&&br&// by 8.13&br&我挺可以分享行业见闻的, 但是不代表也可以分享我个人的隐私, 跟其他人交流过经常都问你赚了多少钱, 搞了哪些游戏之类的……等等诸如此类的问题, 我拒绝回答敏感性的问题!&br&&br&&br&// by 8.17&br&论如何修改魔兽3的攻击为混乱攻击, 护甲是神圣护甲&br&&img src=&/f556b3ebfc74abbc70e3_b.png& data-rawwidth=&1228& data-rawheight=&356& class=&origin_image zh-lightbox-thumb& width=&1228& data-original=&/f556b3ebfc74abbc70e3_r.png&&改成&br&&img src=&/8d8fba476fd78f977166f_b.png& data-rawwidth=&1235& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&1235& data-original=&/8d8fba476fd78f977166f_r.png&&&br&&br&0x1:&br&在做之前要想好'切入点',
就是游戏在哪会调用到攻击类型这个玩意呢?&br&比如说可以在使用技能(包括普通攻击)之后, 造成伤害之前是需要获取的。&br&但是也不好入手, 因为使用技能的判断太多了, 不好区分。&br&又或者说。 可以这样!&br&&img src=&/7bfc2cbcf5fc8e643b7d1da_b.png& data-rawwidth=&1117& data-rawheight=&285& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&/7bfc2cbcf5fc8e643b7d1da_r.png&&把鼠标放到攻击上面, 他'应该'会获取当前的攻击类型,然后转换成Text -& Update 到界面&br&, 好, 接下去就试试这招!&br&&br&………………&br&但是在获取这个攻击类型之前, 还要获取一个东西, 就是获取该英雄的Object.&br&如何在茫茫人海里面把该英雄找出来, 因为每一个英雄都有自己的攻击种类, 所以第一件事就是要找到自身的Object指针!&br&&br&从人物HP入手, 买点装备丢装备来达到人物HP不断变化的目的. 最终找到了&br&&img src=&/397e13b912ba4e3e10dbd544de1d83de_b.png& data-rawwidth=&1099& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&1099& data-original=&/397e13b912ba4e3e10dbd544de1d83de_r.png&&一个是HP一个是MAXHP&br&随便掉点血就知道第一个是HP, 第二个是MAXHP.&br&附加OD, 在HP下访问断点&br&&br&&img src=&/4f6bd8f297fc34a_b.png& data-rawwidth=&659& data-rawheight=&789& class=&origin_image zh-lightbox-thumb& width=&659& data-original=&/4f6bd8f297fc34a_r.png&&&img src=&/e698c4edbc37e_b.png& data-rawwidth=&886& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&886& data-original=&/e698c4edbc37e_r.png&&&br&看上一层, &br&&br&&div class=&highlight&&&pre&&code class=&language-asy&&&span class=&mo&&023&/span&&span class=&n&&C8C1B&/span&
&span class=&o&&|&/span&&span class=&p&&.&/span&
&span class=&mi&&8&/span&&span class=&n&&BBE&/span& &span class=&mi&&&/span& &span class=&n&&mov&/span&
&span class=&n&&edi&/span&&span class=&p&&,&/span& &span class=&n&&dword&/span& &span class=&n&&ptr&/span& &span class=&p&&[&/span&&span class=&n&&esi&/span&&span class=&o&&+&/span&&span class=&mi&&248&/span&&span class=&p&&]&/span&
&span class=&p&&;&/span&
&span class=&n&&HP&/span&
&/code&&/pre&&/div&ESI就是人物指针. 往上回溯, 看下ESI是怎么传递的&br&&br&一直翻啊翻, 翻到函数头了&br&&img src=&/69ee98ac198f1ea80a4c39c4411aed68_b.png& data-rawwidth=&753& data-rawheight=&341& class=&origin_image zh-lightbox-thumb& width=&753& data-original=&/69ee98ac198f1ea80a4c39c4411aed68_r.png&&ESI=ECX. 一般ECX或者ESI传递的, 都是this指针, 就是类指针.&br&比如说 Class::AAA() 里面默认有一个参数传递this指针. 汇编自动生成, 但是代码省略.&br&&img src=&/fdbb8485fa_b.png& data-rawwidth=&753& data-rawheight=&120& class=&origin_image zh-lightbox-thumb& width=&753& data-original=&/fdbb8485fa_r.png&&同理, 顺便做个记号, 因为你总不可能记0x????? 老夫记忆力不行.&br&&img src=&/68a2a78a40e6e3ad2b194e9c23cce62f_b.png& data-rawwidth=&912& data-rawheight=&135& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/68a2a78a40e6e3ad2b194e9c23cce62f_r.png&&继续回溯!&br&&img src=&/c18ac5a4dca7_b.png& data-rawwidth=&1210& data-rawheight=&142& class=&origin_image zh-lightbox-thumb& width=&1210& data-original=&/c18ac5a4dca7_r.png&&&br&函数头&br&&img src=&/304ce33fcf15dd01b5dec3ec9cc9f099_b.png& data-rawwidth=&928& data-rawheight=&107& class=&origin_image zh-lightbox-thumb& width=&928& data-original=&/304ce33fcf15dd01b5dec3ec9cc9f099_r.png&&继续回溯&br&&img src=&/2f93cbfd4c_b.png& data-rawwidth=&817& data-rawheight=&554& class=&origin_image zh-lightbox-thumb& width=&817& data-original=&/2f93cbfd4c_r.png&&&br&发现了这样! 很明显就是一个递归嘛!&br&先不管这个递归, 直接先找到上一层, 因为如果你一直卡在这个递归里面, 万一你上一层也是N个递归或者说是一条死路呢? 所以你得先寻找到根源, 再做详细分析!&br&继续函数头部下断点, 那么你会发现&br&&img src=&/eb83c7c7b2bdaf7e2df805_b.png& data-rawwidth=&1498& data-rawheight=&539& class=&origin_image zh-lightbox-thumb& width=&1498& data-original=&/eb83c7c7b2bdaf7e2df805_r.png&&&br&他的[ESP]=266E02B&br&&img src=&/86ede7c5455_b.png& data-rawwidth=&718& data-rawheight=&156& class=&origin_image zh-lightbox-thumb& width=&718& data-original=&/86ede7c5455_r.png&&&br&也就是这里. 所以要过滤这个!使用条件断点!&br&[ESP]!=266E02B&br&&img src=&/3bc417d71d_b.png& data-rawwidth=&1504& data-rawheight=&419& class=&origin_image zh-lightbox-thumb& width=&1504& data-original=&/3bc417d71d_r.png&&&br&&img src=&/93be7dab7c174be1cc3946b_b.png& data-rawwidth=&883& data-rawheight=&149& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&/93be7dab7c174be1cc3946b_r.png&&总算找到Base了.&br&那么我们再来分析这个递归&br&&img src=&/358a346ccd8a_b.png& data-rawwidth=&1031& data-rawheight=&719& class=&origin_image zh-lightbox-thumb& width=&1031& data-original=&/358a346ccd8a_r.png&&&br&好了。然后就可以动手了写代码了.&br&首先因为这个RootBase是在DLL里面的, 因为DLL的加载地址不同, 所以解析出的Base也不同, 这个需要知道PE文件的如何计算偏移的。&br&我就直接粗暴一点, 暴力搜索内存&br&&img src=&/843b49bc92c166ab34952_b.png& data-rawwidth=&941& data-rawheight=&416& class=&origin_image zh-lightbox-thumb& width=&941& data-original=&/843b49bc92c166ab34952_r.png&&&img src=&/6a6e3e2edec8aabdafdb_b.png& data-rawwidth=&791& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&791& data-original=&/6a6e3e2edec8aabdafdb_r.png&&&img src=&/bd4d5c4d70_b.png& data-rawwidth=&385& data-rawheight=&502& class=&content_image& width=&385&&&img src=&/a9ecea3038ecc_b.png& data-rawwidth=&971& data-rawheight=&628& class=&origin_image zh-lightbox-thumb& width=&971& data-original=&/a9ecea3038ecc_r.png&&MFC做个注入DLL…… 不要问我为嘛用MFC,因为它是VS自带的,方便立马用。反正关了灯都一样. &br&&br&&img src=&/9f95ee250ee1_b.png& data-rawwidth=&824& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&824& data-original=&/9f95ee250ee1_r.png&&&br&&br&&img src=&/edf87de1aa13b323c3a995b5620200dd_b.png& data-rawwidth=&583& data-rawheight=&209& class=&origin_image zh-lightbox-thumb& width=&583& data-original=&/edf87de1aa13b323c3a995b5620200dd_r.png&&随便写一个。 不要太讲究了。 &br&&br&编译! 注入! 测试! 结果如下:&br&&img src=&/afbf90b6f7cdd_b.png& data-rawwidth=&121& data-rawheight=&418& class=&content_image& width=&121&&好啦。然后发现了辣么多个Base, 然后找名字!&br&&br&&br&从名字入手. 这个英雄叫'虚入梦'. 顺便这个游戏是UTF-8编码(略过如何求证的).&br&所以这个英雄名称对应的编码是=EE6A2A6&br&&img src=&/fc7ecf9d39ad_b.png& data-rawwidth=&243& data-rawheight=&190& class=&content_image& width=&243&&打开CE, 搜一下&br&&img src=&/d4dff0a32b1e0eeafc7121c_b.png& data-rawwidth=&515& data-rawheight=&404& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&/d4dff0a32b1e0eeafc7121c_r.png&&务必要记住把 扫'只读'内存勾上&br&然后直接一个一个修改这个Text, 看下哪个是对应的名称. 比如说&br&&img src=&/72f7aa6ad384d9adf29a1d_b.png& data-rawwidth=&362& data-rawheight=&183& class=&content_image& width=&362&&手动修改一个&br&&img src=&/c42ce206a4acc93b7a0b_b.png& data-rawwidth=&619& data-rawheight=&268& class=&origin_image zh-lightbox-thumb& width=&619& data-original=&/c42ce206a4acc93b7a0b_r.png&&&img src=&/eedca09cbd5a7bbfaba7d0_b.png& data-rawwidth=&559& data-rawheight=&194& class=&origin_image zh-lightbox-thumb& width=&559& data-original=&/eedca09cbd5a7bbfaba7d0_r.png&&运气好, 第一个就是。 &br&如果没变化, 那就一个一个往下改。 记得如果不是的话, 要改回去. 再改下一个。 &br&也可以用二分&修改&(查找)法, 直接一次性改一半. 如果不存在的话, 那肯定在另一半。时间复杂度O()=O(logn) 必须学以致用!!!&br&&br&接下来就是开启OD, 附加游戏.&br&&img src=&/862b689f27c3d0eede9459_b.png& data-rawwidth=&617& data-rawheight=&625& class=&origin_image zh-lightbox-thumb& width=&617& data-original=&/862b689f27c3d0eede9459_r.png&&下一个访问断点.&br&&img src=&/a17eeef91b896_b.png& data-rawwidth=&556& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&556& data-original=&/a17eeef91b896_r.png&&断下来了, 就是一个字符串循环复制, 返回到上一层CALL&br&&img src=&/536fd04b7de658af7ef3e_b.png& data-rawwidth=&921& data-rawheight=&213& class=&origin_image zh-lightbox-thumb& width=&921& data-original=&/536fd04b7de658af7ef3e_r.png&&eax就是人物对象指针.
edi就是一个缓冲区, 把人物指针的Name复制到缓冲区.&br&&img src=&/362e6daff3_b.png& data-rawwidth=&960& data-rawheight=&464& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/362e6daff3_r.png&&继续回溯&br&&img src=&/1df162ddac6647d73abceb_b.png& data-rawwidth=&903& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&903& data-original=&/1df162ddac6647d73abceb_r.png&&这个CALL就可以用了。
&br&&div class=&highlight&&&pre&&code class=&language-asy&&&span class=&n&&PUSH&/span& &span class=&mh&&0x200&/span&
&span class=&n&&PUSH&/span& &span class=&n&&Buffer&/span&
&span class=&n&&MOV&/span& &span class=&n&&ECX&/span&&span class=&p&&,&/span& &span class=&n&&pObjectPointer&/span&
&span class=&n&&CALL&/span& &span class=&mf&&235F&/span&&span class=&mi&&640&/span&
&/code&&/pre&&/div&&br&然而我在观察地址的时候, 就观察出来&br&&img src=&/20a94d93dba_b.png& data-rawwidth=&1225& data-rawheight=&136& class=&origin_image zh-lightbox-thumb& width=&1225& data-original=&/20a94d93dba_r.png&&&br&因为他们2个地址是一毛一样的!&br&&img src=&/5dd3beaaceea9c75a5383_b.png& data-rawwidth=&1457& data-rawheight=&435& class=&origin_image zh-lightbox-thumb& width=&1457& data-original=&/5dd3beaaceea9c75a5383_r.png&&ECX=[ESI+238]&br&0DDF3CC4=[14C]&br&&br&&img src=&/33b1a3785ceadcb3b5e81b6_b.png& data-rawwidth=&1375& data-rawheight=&624& class=&origin_image zh-lightbox-thumb& width=&1375& data-original=&/33b1a3785ceadcb3b5e81b6_r.png&&其实往上跟也有可能可以关联起来, 但是我懒得继续回溯了……&br&&img src=&/afd08d1cb851_b.png& data-rawwidth=&119& data-rawheight=&373& class=&content_image& width=&119&&所以……&br&&img src=&/5bbca7a1da_b.png& data-rawwidth=&680& data-rawheight=&292& class=&origin_image zh-lightbox-thumb& width=&680& data-original=&/5bbca7a1da_r.png&&&br&&img src=&/987ba2c5c9d8d6a14159_b.png& data-rawwidth=&439& data-rawheight=&81& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&/987ba2c5c9d8d6a14159_r.png&&&br&&img src=&/3df9dfafcfa41e_b.png& data-rawwidth=&192& data-rawheight=&374& class=&content_image& width=&192&&发现了有些地址可能是其他分类的吧? &br&分类判断懒得写了。 干脆&br&&img src=&/2daa296d0bfadeb6b7cf_b.png& data-rawwidth=&328& data-rawheight=&43& class=&content_image& width=&328&&&br&&img src=&/62f088a5daca02cdb92a5_b.png& data-rawwidth=&1454& data-rawheight=&750& class=&origin_image zh-lightbox-thumb& width=&1454& data-original=&/62f088a5daca02cdb92a5_r.png&&结果就是&br&&img src=&/b915effcf48ed_b.png& data-rawwidth=&532& data-rawheight=&386& class=&origin_image zh-lightbox-thumb& width=&532& data-original=&/b915effcf48ed_r.png&&好啦。 至少有一个是对的. &br&因为刚才游戏不小心被我弄崩了。我就顺便重开而且换了个游戏.&br&暂时目的达到了. 获取到当前角色. (遍历所有英雄小兵之类的暂时没这个需求,不做)&br&&br&下一步就是修改攻击种类:&br&&img src=&/b4fb55e45f299d440f178923_b.png& data-rawwidth=&1205& data-rawheight=&547& class=&origin_image zh-lightbox-thumb& width=&1205& data-original=&/b4fb55e45f299d440f178923_r.png&&按照刚才的步骤, 搜索显示的Text&br&&img src=&/177cd69cd55aa98b9173c_b.png& data-rawwidth=&921& data-rawheight=&477& class=&origin_image zh-lightbox-thumb& width=&921& data-original=&/177cd69cd55aa98b9173c_r.png&&&br&2分搜索大法好, 3次即可到达。&br&下访问断点&br&&img src=&/1ccd89e8ceb913e9630e65_b.png& data-rawwidth=&721& data-rawheight=&802& class=&origin_image zh-lightbox-thumb& width=&721& data-original=&/1ccd89e8ceb913e9630e65_r.png&&惯例的字符串复制操作, 返回到上一个函数!&br&&br&&br&&img src=&/60ca3f8dd396f_b.png& data-rawwidth=&914& data-rawheight=&421& class=&origin_image zh-lightbox-thumb& width=&914& data-original=&/60ca3f8dd396f_r.png&&&br&EAX就是Text, &br&&img src=&/128c6e8b61bc01e7b4d289ebcfe286af_b.png& data-rawwidth=&1185& data-rawheight=&675& class=&origin_image zh-lightbox-thumb& width=&1185& data-original=&/128c6e8b61bc01e7b4d289ebcfe286af_r.png&&上面的MOV EAX, [ESP+14]. 就是从上一个函数传递过来的参数. 返回去看好一下.&br&&br&上一层CALL看参数&br&&img src=&/22f933ffa35e7906ddb9c6aea623edcf_b.png& data-rawwidth=&1169& data-rawheight=&736& class=&origin_image zh-lightbox-thumb& width=&1169& data-original=&/22f933ffa35e7906ddb9c6aea623edcf_r.png&&第一个参数&br&&br&&br&第二个参数&br&&img src=&/2fae35e0c4_b.png& data-rawwidth=&627& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&627& data-original=&/2fae35e0c4_r.png&&就是上上张图, 就懒得复制了&br&&br&第三个参数&br&&img src=&/563aada8d9b5e5f51ac9e8f_b.png& data-rawwidth=&977& data-rawheight=&816& class=&origin_image zh-lightbox-thumb& width=&977& data-original=&/563aada8d9b5e5f51ac9e8f_r.png&&&img src=&/b7e6b24bec2_b.png& data-rawwidth=&426& data-rawheight=&136& class=&origin_image zh-lightbox-thumb& width=&426& data-original=&/b7e6b24bec2_r.png&&就是这个玩意。 那么我们要找的是种类。 也就是第二个参数=[ESP+0BC]&br&然后往上分析……过程略, 多断点几次的事, 我就不废话了。 &br&&br&然后往上慢慢下断看参数, 直到……&br&&img src=&/1afec82ac1c30c17a8bf9_b.png& data-rawwidth=&1461& data-rawheight=&832& class=&origin_image zh-lightbox-thumb& width=&1461& data-original=&/1afec82ac1c30c17a8bf9_r.png&&&br&&img src=&/edc41b96e8e8_b.png& data-rawwidth=&1511& data-rawheight=&446& class=&origin_image zh-lightbox-thumb& width=&1511& data-original=&/edc41b96e8e8_r.png&&mov
edx, dword ptr [esp+10]&br&mov
ecx, dword ptr [edx+2ADD3B0]&br&&br&&img src=&/eba612405eecc7b1abca41cefe4314f2_b.png& data-rawwidth=&1212& data-rawheight=&198& class=&origin_image zh-lightbox-thumb& width=&1212& data-original=&/eba612405eecc7b1abca41cefe4314f2_r.png&&接下去就找[ESP+34]&br&&img src=&/db2bbe2282910_b.png& data-rawwidth=&1203& data-rawheight=&529& class=&origin_image zh-lightbox-thumb& width=&1203& data-original=&/db2bbe2282910_r.png&&既然这样, 那么我们试试.&br&首先&br&&img src=&/a6b9a79c7ef98edf798b9_b.png& data-rawwidth=&648& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&/a6b9a79c7ef98edf798b9_r.png&&&br&所以 [0F923CC4] + 1E8 = EDI&br&EAX = 攻击种类 = [EDI + 0 * 4 + 0xF4]. (已经探明EBX=0)&br&所以……&br&&img src=&/587fff5c99ac6b1dba5e543d15263d50_b.png& data-rawwidth=&583& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&583& data-original=&/587fff5c99ac6b1dba5e543d15263d50_r.png&&&br&我们换一个有混乱攻击的号就知道。 混乱攻击的时候。 这个值是=5的。&br&所以我们改成5试试。&br&&img src=&/41b71650bfd81153feed8de_b.png& data-rawwidth=&1126& data-rawheight=&361& class=&origin_image zh-lightbox-thumb& width=&1126& data-original=&/41b71650bfd81153feed8de_r.png&&嘿嘿!&br&然后是不是有效。 最上面的那2张图有数值测试!&br&顺便…… 肯定是联网无效的, 因为有数值校验的。可以单机爽一下!&br&而且……哪怕你用各种***图, 暂时老夫还没发现哪个可以改攻击类型!&br&神圣护甲同理, 我就多此一举了。&br&还有几张图顺便贴了&br&&img src=&/23ed798ab3b_b.png& data-rawwidth=&663& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&663& data-original=&/23ed798ab3b_r.png&&&img src=&/fb60ffb7ca984e6a25d6028_b.png& data-rawwidth=&1210& data-rawheight=&783& class=&origin_image zh-lightbox-thumb& width=&1210& data-original=&/fb60ffb7ca984e6a25d6028_r.png&&&br&这篇文章到这里就结束了。 以后在这篇文章也不会更新技术类的话题了。
我也来简单回答一下题主。 首先, 外挂是一门很大很注重实践的一门技术大类。 在这个技术大类之下还分很多小类。 一般来说分逆向,编写逻辑 这2方面 所谓逆向,也就是分析游戏的客户端,寻找相关功能的函数 而编写逻辑,如掉线重登,自动打怪,自动吃药 之类…
FPS游戏从未能很好的解决外挂问题;&br&暴雪对外挂的惩处治理向来非常严格;&br&&br&这两点碰撞在一起,造就了一个巨大的悬念:暴雪能不能整治好OW的外挂?&br&这个问题甚至比“OW能不能超越LOL?”更吸引人,外挂不整治好,一切休谈。&br&&br&从这几天的情况看,高分段外挂比较泛滥,而低分段的普通玩家其实遇到的不多,那为何引起如此声势呢?&br&外挂造就了“不信任”的环境,一个普通玩家,他可能10盘里只遇到1盘是有挂的,但这会导致他产生怀疑心理:对面这么准,会不会是挂?这种怀疑会一直跟随他,种子一旦种下就很难清除,甚至即使是获胜,他也会怀疑自己这方是不是有挂?&br&(另外评论里有提到现在很多人都看直播,而直播的人都在高分段,遇到外挂多,更使人产生“外挂泛滥”的印象,加剧了玩家之间的不信任感)&br&Dota2的游戏环境好,想必大家是公认的,这个游戏里玩家输了一把之后,大多觉得己方不给力,或者对面确实牛逼,但很少会有人去想:对面是不是开挂了?&br&这就是“信任”的问题。&br&这种“信任”被破坏是可怕的,对游戏体验破坏非常大,人一旦有了这种怀疑的念头怎么还能好好地玩游戏呢!LOL之前就有个趋势,遇到个玩的好的泽拉斯、大嘴,就不禁怀疑是不是脚本?但其破坏力远远比不上FPS里的挂。&br&&br&从这点上来说,暴雪和网易已经晚了一步。良好的游戏环境和玩家之间的信任感,毁起来容易,想要恢复就难的多。&br&&br&有人说暴雪向来秋后算账,但用之前隔段时间就大批量封号的方法显然行不通,D3、WOW封了号,就得重新练级,重新收集装备,成本相对比较大,而OW呢?重新买一个端起***就可以突突突,用的挂的人根本就不在乎这198,买的挂都比这个值钱,更别说还有工作室开挂带老板上分这种手段。&br&&br&说白了,如果不能快速地对开挂者进行惩罚,你再怎么大规模封号都是无用。有人说正义只会迟到,不会缺席。但在这场和外挂的斗争中,&b&迟到的正义非正义&/b&。&br&&br&我说了这么多废话,也说不出怎么解决,我非常期待暴雪给出一个***,能否破解”FPS网游开挂“这一历史性难题,应该就在这几天,拭目以待。
FPS游戏从未能很好的解决外挂问题; 暴雪对外挂的惩处治理向来非常严格; 这两点碰撞在一起,造就了一个巨大的悬念:暴雪能不能整治好OW的外挂? 这个问题甚至比“OW能不能超越LOL?”更吸引人,外挂不整治好,一切休谈。 从这几天的情况看,高分段外挂比较…
相关:游戏研发技术,做过外挂,也防过外挂。&br&&br&一句话概括游戏修改器的原理:在既定的游戏逻辑基础上,插入新的逻辑或者修改逻辑对应的数据。&br&&br&这样是不是太抽象了?来,咱先介绍一下游戏修改,或者说外挂的类型和原理。&br&&br&1. 输入模拟&br&模拟用户的输入,例如键盘、鼠标、重力感应、摇杆等等。这种是最简单的方式,并且,严格地说,这并不算外挂,只是辅助软件。最著名的软件要数PC上的按键精灵,早期网游的挂机外挂,几乎都是按键精灵变种而来的。&br&这种外挂的防护方法最简单也最困难。简单在,只需验证玩家是否是机器人,也就是验证码就能解决。难在不影响用户体验。还记得当年的盛大冒险岛里,打着Boss突然出来,让人虎躯一震的验证码么?(好像暴露年龄了?)&br&&br&2. 修改文件数据&br&就是修改游戏过程中存在本地的数据。特别对于单机游戏而言,玩家的金币数、等级啥的,肯定得存在硬盘上的某个地方。但可能是加了密,不过只要存储在本地,一定就能破解,对,一定。对应的嘛,XX存档修改器之类的就是了。&br&什么,你问我有没有不把数据存到本地的单机游戏?&br&---还记得当年FC的通关密码么?&br&&br&顺带回答题主的问题&br&a. 难道没有个人游戏数据是储存在本机上的吗?&br&有,存储分两类,一类是无关数据,比如你上次退出某个界面时,光标放在哪个按钮上,这种无关痛痒的数据。另一类是游戏数据,对,比如你的攻击力、防御力,为了提升计算速度、节省流量,这些东西可能会存储在本地,但服务端一般都会做一次校验,除非做游戏的人脑袋秀逗了。&br&b. 这些大量的数据游戏公司真的有必要全部储存吗?&br&有,游戏,特别是网游,数据表,或者说配置表,数量大到你难以想象。而且这些数据通常静态数据,也就是大家都一样,对服务端来说也不会是太大的压力。举个例子吧,如果你的宠物成长没有随机性,那么同一个宠物同一个等级的所有数据都是一样的。&br&&br&3. 修改内存数据&br&程序运行过程中,数据都是在内存里的。通过搜内存,即可直接修改游戏数据(如果游戏没做防护措施的话)。常见的,金山游侠、八门神器,甚至金手指,都是此类原理。&br&&br&4. 截包&br&对于网游来说,数据都是封装在一个一个数据包里,发送到服务器的。只要截取从你电脑发出去的游戏包,找到对应的数据,修改即可。但实际上,这是最困难的修改方式。原因很简单,数据包是加密的,而且和本地数据的加密不同的是,数据包通常用的是非对称加密算法,例如RSA,不理解的可以扩展阅读一下:&a href=&///?target=http%3A///blog/2013/06/rsa_algorithm_part_one.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RSA算法原理(一)&i class=&icon-external&&&/i&&/a&&br&懒得读的这里解释一下,非对称加密算法的特点是,加密密码和解密密码不一样,天知道服务端用的是什么密码解密。&br&&br&5. Hook&br&hook的意思是钩子,可以这么解释,原来有一个函数,会返回你现在的金钱数,然后你把这个函数勾住,换成你自己的函数,返回一个&a href=&tel:& class=& wrap external&&&/a&的金钱,是不是发财啦?&br&玩PC游戏的看下游戏目录下,是不是能发现很多DLL文件?这些就是游戏里的一个一个函数,也许其中某一个,就放着返回你的金钱数的函数。&br&对于盗版软件的破解,这也是常用手法之一。&br&&br&6. 其他&br&只有想不到,没有做不到。自己去发现,也能有惊喜。例如,修改系统时间加金币啥的。
相关:游戏研发技术,做过外挂,也防过外挂。 一句话概括游戏修改器的原理:在既定的游戏逻辑基础上,插入新的逻辑或者修改逻辑对应的数据。 这样是不是太抽象了?来,咱先介绍一下游戏修改,或者说外挂的类型和原理。 1. 输入模拟 模拟用户的输入,例如键…
已有帐号?
无法登录?
社交帐号登录

参考资料

 

随机推荐