永德老哥ლ lewvan850307
关注数: 33 粉丝数: 36 发帖数: 599 关注贴吧数: 19
1.29更新后不能再延续BT玩法的一点思考 事实:1月29日更新后,由吧友发现,之前由各路IT技术宅制作的BT医生,各项属性都变成1了,无论轻度BT的3x280,或者是重度BT的3x65535,再或者是超重度BT的3x99999...,都难逃厄运。再者,又有吧友发现,通过各种手段将属性培训满格后,退出游戏再次进入后,各项属性又变成了1... 作为一名程序猿,我觉得开发商不可能不知道超脱力存在BT医生的漏洞,只是修复时间早晚的问题。很明显,这个漏洞属于设计漏洞,医生的数据没有保存在游戏服务器上,只是完全存放在二维码名片里,二维码里数据是什么样的,扫描出来的就是什么样的医生。 然而今天的新版本,说明开发商已经着手修复本缺陷了,所以出现了本文开头描述的现象。 但是仔细琢磨一下,设计缺陷不可能很快被修复。从现象来看,应该只是在游戏客户端加了个检查,如果三围属性中的某一项超过某个最大值,或者三围相加之和超过了某个最大值,则认为数据异常,将三围直接置为1.且该检查可能只在游戏启动的时候进行。具体是怎么检查的,只有开发商清楚,玩家只能通过黑盒测试的方法不断摸索。 开发商的这种规避方法,我觉得是短时间内能够实施部署的最好的屏蔽这一缺陷的方法了,在此必须给开发商点个赞! 今天更新之后,由于医生的数据不能再BT了,一定程度上避免了利用BT医生赚取大量金币和黄油的现象。但是貌似仍然允许出现3个专家属性的医生。 另外,如果想完全堵住这一漏洞,我认为需要将玩家的院长医生属性数据保存在服务器端,二维码中仅保留一个ID,当其他玩家扫描二位码时,从服务器获取医生属性。当然,要做好这件事情不会这么简单,还有很多其他场景和细节需要考虑。 就妄自揣摩到这里吧。
非图片文件<-->BMP文件转换器源码 由于我的电脑一直没有修好,所以要对这个软件进行改进有点困难,所以把它贴出来希望有识之士能继续我的工作,继续把这个“没多大用处”的小软件做得更有用,更完善。如果在修改后能保留我作为原作者的一些信息,我将非常高兴,这样你也会每天都过得快乐的!目前的版本就叫做1.0好了,如果某位大侠进行了改进,最好能在这里留言以通知我一声,并把作品发给我一份,谢谢。由于受字数限制,这里仅贴出最重要的用于处理两种的自定义类CConvertionFile的代码可以到我的百度空间找到完整工程代码:http://hi.baidu.com/lewvan/blog/item/de6fc2fd9efbc446d7887df8.html//Header File---------------------------------------------------------------------------------------------------------// ConvertionFile.h: interface for the CConvertionFile class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_CONVERTIONFILE_H__28B233F3_EDC4_44B5_A9F8_AAC8D1D17E74__INCLUDED_)#define AFX_CONVERTIONFILE_H__28B233F3_EDC4_44B5_A9F8_AAC8D1D17E74__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define ORIGINAL_FILE 1#define CONVERTED_FILE 2#define MAX_FILE_NAME_LEN 256#define FILE_NOT_LOADED -1#define FILE_STRUCT_ERROR -2class CConvertionFile : public CFile {public:CString m_strOriginalFileName;CString m_strConvertedFileName;UINT m_nOriginalFileLen;UINT m_nConvertedFileLen;CFile m_fOriginalFile;BOOL m_bOriginalFileLoaded;BOOL m_bConvertedFileLoaded;CFile m_fConvertedFile;UINT m_nLineGap;UINT m_nPixelX;UINT m_nPixelY;UINT m_nVolumn;UINT m_nConvertedFileRawDataOffset;int m_nError;public:CConvertionFile();virtual ~CConvertionFile();BOOL LoadFrom(const CString strFilePathName,UINT nMode);BOOL ConvertTo(const CString strFilePath);BOOL RestoreTo(const CString strFilePath);BOOL DoAnalyzeOriginalFile();BOOL DoAnalyzeConvertedFile();void Close();CString AnalyzeFileException(int nCause);};#endif // !defined(AFX_CONVERTIONFILE_H__28B233F3_EDC4_44B5_A9F8_AAC8D1D17E74__INCLUDED_)//Cpp File-----------------------------------------------------------------------------------------------------------// ConvertionFile.cpp: implementation of the CConvertionFile class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Converter.h"#include "ConvertionFile.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CConvertionFile::CConvertionFile(){m_bOriginalFileLoaded=FALSE;m_bConvertedFileLoaded=FALSE;m_nLineGap=0;m_nPixelX=0;m_nPixelY=0;m_nOriginalFileLen=0;m_nConvertedFileLen=0;m_nConvertedFileRawDataOffset=0;}CConvertionFile::~CConvertionFile(){}BOOL CConvertionFile::LoadFrom(const CString strPathName,UINT nMode){BOOL nRes=FALSE;if(nMode==ORIGINAL_FILE){ nRes=m_fOriginalFile.Open(strPathName,CFile::modeRead); if(nRes) { m_nOriginalFileLen=m_fOriginalFile.GetLength(); m_strOriginalFileName=m_fOriginalFile.GetFileName(); m_bOriginalFileLoaded=TRUE; nRes=DoAnalyzeOriginalFile(); }}else if(nMode==CONVERTED_FILE){ nRes=m_fConvertedFile.Open(strPathName,CFile::modeRead); if(nRes) { m_nConvertedFileLen=m_fConvertedFile.GetLength(); m_strConvertedFileName=m_fConvertedFile.GetFileName(); m_bConvertedFileLoaded=TRUE; nRes=DoAnalyzeConvertedFile(); }}return nRes;}
1 下一页