程序分析实例 - 无双大蛇(Orochi)

解密QQ消息文件格式 QQ的消息实际上是存放在本地的,位于"QQ安装目录/QQ号码/MsgEx.db"内。关于QQ消息文件格式的文章,网上有不少,但是没有一篇是完整并且可重现。结合QQ聊天记录察看器 5.1,我做了一些研究,重现了读取并显示历史消息的完整过程。一个很好的学习QQ相关算法的实例,是它的Linux版本LumaQQ首先,MsgEx.db文件的大致结构可以参考QQ聊天记录查看器 5.3 华军版IStorage的 阅读详情

下面以对KOEI的无双大蛇的一个bug的研究为例,介绍程序分析的基本方法。

无双大蛇是KOEI公司推出的一款动作类游戏,3.20日发布了日文PC版。
在游戏过程中发现,进入某些战斗的时候程序会陷入死循环,具体表现是在菜单中选择战斗场景之后,画面变黑,但是一直不出现战前配置的界面。Alt+F4关闭主窗口之后,还可以在任务管理器中找到它的进程。
因为是进入战斗场景时发生的问题,猜测可能是读取或者解析场景数据的时候发生了错误。因为无双系列的数据量较大,通常场景数据不会保存在内存中,而是直接从文件读取,所以先用SysInternals中的procmon工具对文件读写进行监控,以便定位场景数据。
监控之后发现程序在使用ReadFile一次性读取大量数据(>35M)的时候失败(procmon中给出的错误信息是insufficient resource),然后程序一直在重试,从而导致了死循环。
使用关键字“ReadFile "insufficient resource"”Google了一下,没有发现太有价值的线索。
我自己写了个测试程序读取相同位置相同数量的数据,没有任何问题。因此暂时无法准确定位读取失败的原因。

正好要对大蛇的主程序进行分析,所以也顺便研究一下这个bug。
首先,因为自己的测试程序可以成功读取,所以怀疑是读取参数的原因导致ReadFile失败。因为ReadFile本身通常不会带参数(虽然最后一个参数是用于指定overlap的,但是通常很少用到),所以先研究CreateFile调用时传递的参数。
很快定位到程序中打开数据文件的代码,发现它在CreateFile的时候传递了FILE_FLAG_NO_BUFFERING参数。MSDN了一下,里面只提到使用该参数需要注意一些对齐的问题。
修改了我自己的测试程序,加入了FILE_FLAG_NO_BUFFERING参数。这次终于重现了bug,查看GetLastError的返回值,发现确实是ERROR_NO_SYSTEM_RESOURCES。
再次使用Google,加入新获得了两个关键字FILE_FLAG_NO_BUFFERING和ERROR_NO_SYSTEM_RESOURCES,可以找到更多相关的链接。浏览之后,基本可以肯定是一次性读入过多的数据导致的问题。
http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.kernel/2005-02/0489.html

因为问题实际上并不是FILE_FLAG_NO_BUFFERING参数导致的,所以我们去掉这个关键字。另外我觉得很多人应该会把该行为当成bug(因为MSDN上并没有提及),所以在关键字中加入bug,以期望进一步验证我的判断。然后重新搜索,得到了一个非常有价值的链接:
http://svn.icculus.org/physfs/trunk/lzma/C/Archive/7z/7zMain.c?view=markup&sortdir=down&pathrev=923
里面明确提到了这个问题
/*
   ReadFile and WriteFile functions in Windows have BUG:
   If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1)
   from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES
   (Insufficient system resources exist to complete the requested service).
*/

这说明,当碰到了bug,并且你已经掌握了较为详尽的出错相关信息的时候,可以直接通过Google的codesearch,或者koders网站在开源软件的代码中进行搜索,以充分利用前人的分析结果。(其实MFC的源代码注释中也有很多类似的信息)

当然最后修复这个bug就很简单了,自己写一个以4M为单位读取文件的代码,然后做个内存补丁即可。 

藏经阁保护方式研究 藏经阁是比较著名的盗版系列,它对盗版光盘采取了保护措施。如果你将里面的安装程序拷贝到硬盘直接安装的话,会出现如下的提示:你买的不是gamez88的盘,请去退盘显然猫腻在光盘上。如果你用UltraISO打开光盘,可以看到隐藏的9999目录,里面有一个300000000字节的8888.dat文件(注:每期盘的隐藏文件都不尽相同)我们用ProcMon跟踪一下就会发现,安装程序会尝试打开隐藏文件。根据 阅读详情

相关推荐

C++ Internals: VC RTTI - 基本数据结构

返回目录网上资料比较少,ms还是有研究的价值 ^_^相关资源:Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTIReversing C++C++的RTTI一旦遇上了多重和虚继承,简直就是噩梦 -.-这里介绍一下VC中用来表示RTTI的内部数据结构(具体可以参考《Reversing C++》里的描述)。利用下面的程序可以

Van's House 5366

大神帮忙看看这个问题怎么解决

用模拟器运行程序时老是闪退!04-10 06:37:43.794 2611-3870/? W/GCM-GMS: Failed to get registration: java.io.IOException: AUTHENTICATION_FAILED04-10 06:38:03.761 3881-3881/? D/AndroidRuntime: >>>>>> ...

jokerkui的博客 9653

三国志游戏源代码(C语言)-----经典游戏的源码

用C语言编写的经典游戏的源码!在娱乐中不断进步!!! 很经典哦

DeviceIOControl与驱动层 - 缓冲区模式

IO交互模式中的DeviceIOControl与驱动层交互有三种:缓冲区模式、直接访问模式、其他模式,这里本人学习的是缓冲区访问模式,原理如图: 驱动中最好不要直接访问用户模式下的内存地址,使用缓冲区方式可以避免程序员访问内存模式下的内存地址。Win32API DeviceIoControl的内部,用户提供的输入缓冲区的内容呗复制到IRP中的pIrp->AssociateI...

weixin_33717117的博客 471

【分享】获取微信通讯录python代码形式实现

微信号”, “昵称”, “地区”, “备注”, “标签”, “签名”, “来源”5. 找到最后一个空格所在的位置(后一个就是真正的联系人了)当前微信号与上一个相同的时候,说明到底部了,可以跳出循环。3. 滚动鼠标到最顶部(防止已经滚动了一部分了)7.记录下上一个联系人的微信号。7. 无限循环按键盘下箭头。获取详情中的以下元素内容。6. 点击第一个联系人。4. 获取联系人列表。

程序员老狼专注开发aigc或客服系统应用 2892

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

Invalid Trajectory: start point deviates from current robot state more than 0.01

解决start point deviates from current robot state问题 在进行机械臂轨迹规划的时候,特别是连续轨迹运动,容易出现如下错误: 即机械臂当前的位置与规划时的起始位置不一致。 解决办法: 在相应位置添加:group.setStartStateToCurrentState(); 其官网描述如下: 意思是设置机械臂当前的状态作为运动初始状态。 ...

爱吃苦瓜的仓鼠陈的博客 2322

ODBC 连接数据库 SQL server 2008

1、打开【控制面板】-> 【系统和安全】 -> 【管理工具】-> 【数据源(ODBC)】  2、双击【数据源(ODBC)】-> 选中【系统DSN】 3、单击【添加】,会弹出如下对话框,选中【SQL server】->【完成】 4、弹出如下对话框,在【名称】中填入数据源名称 例如:我命名为: LocalServer,在【服务器】中填入计算机名或者IP地址,我连接

Christine的专栏 8515

调用GetLastError 错误代码 含义

2005 msdn url:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WINCE.v50.en/wcecoreos5/html/wce50lrfsystemerrorsnumericalorder.htm The following table shows possible system error values. Co

miyunhong的专栏 2万+

HWDB1.1数据集处理全攻略:从gnt文件到PNG图片的完整转换教程

本文提供了HWDB1.1数据集处理的完整教程,详细解析了gnt二进制文件格式,并给出了从文件解析、标签映射到批量转换为PNG图片的Python脚本。教程涵盖了环境准备、跨平台解压方案,以及为PyTorch等深度学习框架准备数据的最佳实践,是进行手写汉字识别研究不可或缺的实用指南。

2w3e4r5t6y的博客 627

RV1106的ISP配置实战:MIPI与LVDS接口的硬件连接与设备树优化

本文详细解析了RV1106芯片的ISP配置实战,重点对比了MIPI CSI-2与LVDS两种主流接口的硬件连接方案与数据流差异。通过手把手的设备树代码示例,深入讲解了单路MIPI与双路LVDS摄像头的配置要点、关键属性设置及常见避坑指南,并提供了从驱动加载检查到Media Controller工具使用的系统化调试方法,帮助开发者快速打通图像采集与处理全链路。

terraform7cloud的博客 469

【Planning】Trigger point

Purpose 当operation的status发生变化 或者operation被confirm, 定义在routing中的trigger point可以触发 certain functions in the...

crtwnvh4624的博客 231

HackRF实战:用Portapack扩展板玩转GPS信号模拟(附固件刷写教程)

本文详细介绍了如何使用HackRF与Portapack扩展板进行GPS信号模拟,包括固件刷写、信号生成与发射配置等实战操作。通过专业工具和优化技巧,读者可以掌握软件无线电的高级应用,解决手机定位难题,同时强调安全合规使用的重要性。

weixin_28717431的博客 362

Invalid Trajectory: start point deviates from current robot state more than

“Invalid Trajectory: start point deviates from current robot state more than …“ MoveIt 0.7.3+ ensures that the start state of the robot is near the current state before executing a trajectory. The che...

longbinliu的专栏 2516

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 816

模型预测控制(MPC)解析(二):单输入单输出系统

在上一篇中,为了便于说明,预测控制系统采用单输入单输出系统为例进行设计。由于系统模型使用的是状态空间方程,于是可以很容易的将这种设计方法可以扩展到多输入、多输出系统。

行者无疆的博客 8223

游戏资源提取软件介绍

注:资源的版权属相应的游戏公司所有,请勿将提取得到的资源用于非法的用途。中国EgoUnpacker    支持提取Studio e.go!公司的游戏。LeafUnpacker    支持提取Leaf公司的游戏。    这两款都是windseven的作品,采用类似于WinZip的界面,仅支持解包。不过他在ys168上的网盘已经不存在了。Kid Tools GUI v1.5 build 050905

Van's House 2万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RPGViewer - 游戏常用压缩算法的介绍和识别

deflatehttp://www.zlib.net/这是ZIP默认采用的压缩算法。ZIP格式使用非常广泛,不仅有开源的C实现-zlib,还有众多的商业解决方案。因此在游戏中采用deflate,可以大大降低编程的成本。很多国外游戏的档案都采用这种压缩算法,或者直接使用ZIP文件格式存储资源。目前不少国内厂商也开始采用deflate。默认ZIP使用的deflate,传入的WindowBits是-0x

Van's House 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉之云的“免CD”,盗版商的胜利?

(注:因为评论中有回复说mycrack和MENTING不是一个人。慎重起见,对文章内容作了修改) 虽然破解汉之云并不是一件很困难的事情,但是这么快就出现盗版还是有些出人意料。操刀此次破解的是“MENTING”(不知是否就是看雪论坛的那位MENTING?),和盗版商同流合污,特意将10M+的解密数据隐藏在了3G的垃圾之中。SecuRom 的脱壳早已不是什么秘密,ARTeam有详细的教程。SecuR

Van's House 7182

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDA Pro中"The database is corrupted"的解决办法

ida pro默认不允许你打开由其他用户创建的idb文件,这给逆向分析带来很多不便。经过研究发现,ida pro会在idb文件中存放ida.key的信息,用于标示创建者。因此我们需要用自己的ida.key中的内容进行替换。注: 替换之后,打开idb文件会提示校验失败,保存一下就好了。另外当idb以deflate方式存放的时候需要先解压缩之后再进行替换首先打开你的idb文件,查找"$ origina

Van's House 6300

DreamSpark

DreamSpark是Microsoft公司向大学在校学生提供免费软件资源的项目,需用使用edu.cn的邮箱进行注册验证。注册之后可以获得一个验证码,这个验证码可以用于获取产品序列号和下载软件。学生可以在非商业性个人教学课程学习和科研中免费使用这些产品。对于非Express版本的软件来说,中国学生实际的下载地址都会指向IP为202.112.35.244的ftp。ftp的用户名为你的用户id,密码为

Van's House 5243

用Winhex dump exe

为了顺利地dump,你需要准备一个内存编辑工具,比如Winhex(www.winhex.com/winhex )。下面是dump的具体步骤:首先运行exe,然后执行Winhex菜单中的“Tools”-“Open RAM...”找到你要dump的exe对应的进程,打开相应的exe。比如我们要dump Explorer.exe:点击OK,这样你就可以在Winhex的编辑窗口中看到该EXE在内存中的镜像

Van's House 5016

C++ Internals: VC RTTI - dynamic_cast (2)

返回目录下面进入正题,让我们见识一下dynamic_cast到底是如何实现的。首先,在你调用dynamic_cast之前,编译器会帮你进行语法检查。如果指针的静态类型和目标类型相同,那么就什么事情都不做。否则,首先对指针进行调整,使得它指向vftable,并将其和调整之后的指针、调整的偏移量、静态类型以及目标类型传递给内部的__RTDynamicCast函数。其中最后一个参数指明转换的是指针还是引

Van's House 4947
上一篇: RPGViewer - 游戏常用压缩算法的介绍和识别
下一篇: DreamSpark
vbvan
博客等级 码龄19年 132粉丝 40原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值