前面说启动bin下面Lithtech.exe并出现了新的错误。先看下bin的目录结构
既然lt是出名引擎,那么是否可以用网上lt的介绍,命令行进行启动呢?
可以在网上找下lt的启动的后面的参数参考。 比如 出名 “No One Lives Forever”, 或者网上流传的 “Jupiter_Ent”,命令行类似如下 :
LITHTECH.EXE -cmdfile nolfcmds.txt
-windowtitle "No One Lives Forever Demo" -rez E:\Game\NOLF +multiplayer 0 +DisableMusic 0 +DisableSound 0 +DisableTripBuf 0 +DisableHardwareCursor 0 +consoleenable 0 +numconsolelines 0 +runworld WORLDS\t01s03
手动去各种尝试命令行启动和参数修改都失败,看来还是要进行调试了。首先尝试直接用x64打开lt进行调试,经过调试发现,他会获取父进程,并且和 “bimain.exe” 字符串进行比较,如果不对就会报错,这里我们用x64去调试,父进程明显不对,这也是一个对bin下面的程序的一个保护,防止外挂等程序随意通过命令调用。
那么就走入一个死循环了,如果用bitmain来启动就导致Lithtech.exe(简称lt)无法attach,如果不用他启动,lt里面又要检测。
后面我想到,反正bimain检查环境那些都不用,那么我直接伪造一个bimain.exe, 啥事都不干,就只做启动,并且启动的时候通过c++启动接口,让lt启动时候就是挂起状态,这样就可以进行附加了。说干就干。如下是bimain的代码。
CString strCmdLine = _T("\"E:\\shushijie\\BelleIsle\\Bin\\LithTech.exe\"
-rez ..\\Data -ver 1102 -Windowtitle \"Belle Isle\" -ScreenWidth 800 -ScreenHeight 600");
//启动等待调试
if(!CreateProcess(0,strCmdLine.GetBuffer(),NULL,NULL,FALSE,CREATE_SUSPENDED ,NULL,NULL,&si,&pi))
此处,在创建进程的时候用到了“CREATE_SUSPENDED”参数,就是这个子进程启动会处于挂起状态。并且exe打包为bitmain。 如此这般放到bin目录中,尝试下。
启动后按照上面的代码,只是出现了一个命令行窗口,其他啥反应没有了。
启动的子进程错误窗口没有弹出。打开任务管理器》性能》打开资源监视器》
发现果然有个lithtech.exe处于暂停状态 :)
现在先用x64附加此进程,断在入口处,并在弹窗处如前面一样下好断点, 附加后并在 资源监视器 右键恢复运行。现在可以进行正常调试了。
经过调试发现此程序会利用硬件id等生成一段可能是安装认证的唯一id,并且每次启动的时候会验证此id。 验证的办法是查看bin目录下面是否有一个文件名为此id的文件。
具体不知道,我怀疑是当时卖光盘的一个搞法。貌似也没啥其他实际作用。 反正我拷贝过来的没有这个文件,每个人的id可能不同,调试的地方可以根据FPU中看到此id,复制出来,手动建立一个。
到此再点击bimain.exe重新启动。经过几个经典的动画闪屏界面后进入到登陆界面:
由于日服服务器已经停止,所以这里继续输入账号和密码会报服务器错误。
但是由于能进入到这个界面,而程序的主要资源在 Data目录下面,里面的资源都经过了自定义的格式或者说是加密的方式进行存储,通用lt引擎解析方式无法打开这些资源。
到这个界面时候,中间有些闪屏界面,准备过程,以及ui 、背景这些都需要使用到data下面的文件,那么下一篇会进行核心data目录的文件监控以及解密分析。