前言
近日“国产之光”原神游戏PC端开服了,结果过不了多久有网友曝出,该游戏的安装程序会关闭一切名为“Launcher.exe”的程序:
对于这种情况,笔者闻所未闻,身体微微一震,除了震惊之余更多的是感叹其神技。这意义不明的关闭到底是个怎么回事?
为此,正在学习逆向的笔者打算一探究竟,于是就有了本篇文章。
流言验证
当然是先试试网上所说的情况是否属实。先用Visual studio编译一个名为Launcher.exe的项目(功能并不重要),打开后运行原神安装包:
然后点击安装,此时会提醒你客户端正在运行:
点击确定,没错,Launcher.exe没了,然后就安装了:
这安装器的背景图上仅有一人,似乎预示了程序被关闭,杀进一切,颇有孤高王者谁能敌的气概。
准备工作
既然流言验证成功了,接下来我们就要为逆向做准备了。
查壳:
Nullsoft PiMP Stub是个什么东西,一开始笔者也有这样的疑问,其实坛友早已问过并已有答案:
我们把安装程序的exe改成zip试试,确实能看到安装后的资源:
既然不是壳,那我们直接拖进x32dbg运起来即可。
寻找终结程序的函数
从结果推原因,从它能结束别的进程来看可以推测应该是用了 TerminateProcess
这个API并下断:(可以在符号列表里找)
运行后确实断下来了,断在一个叫nsprocess.dll的DLL里:
先看看这个nsprocess.dll的是什么?经过百度这个似乎是NSIS,也就是之前查壳查出来的Nullsoft PiMP Stub的一个插件DLL:
似乎不是很重要的信息,我们只明白了目前是在NSIS中的一个插件DLL里。既然如此,看看代码上面的call调用情况,了解个大概:
很明显,这过程一目了然,些少写过Hook,注入代码的坛友可能会知道,这里其实就是调用NtQuerySystemInformation函数来枚举进程,并使用lstrcmpiW来判断进程名是否为launcher.exe,最后再调用TerminateProcess来终结。
所以笔者个人觉得如果要修复这个问题,可以直接Hook TerminateProcess来修复。
结束名称源头
那么Launcher.exe这个字符串来源在哪里呢?如果我们找到了来源并且进行修改,是不是可以...(捂嘴)
[ebp+8]看到ebp加法运算就知道这个字符串是从调用者那里传过来的参数之一,那我们就根据栈回溯找找:
通过函数getTargetName拿到Launcher.exe名字,而函数的参数来源于一个固定的地址值[0040C0E0]+4:
本以为能够找到安装程序的领空,结果接下去无论是对这个内存区域打内存断点还是栈回溯都没法找到字符串的来源,可能是自己太菜了缘故,希望有万能的坛友们能找出来。
其实如果要改变字符串,可以在调用getTargetName函数之后将其函数结果更改即可。如改成QQ.exe那就会....
其他
在逆向的过程看到了一个奇怪的DLL:nsniuniuskin.dll,经百度一看:
似乎是一个国产的安装包插件,点进官网:
可以看到一些安装包的模板,让我们再看一看原神安装程序的安装界面:
好,有奖竞答,请问原神用了那个模板(滑稽)。
完。