去掉 Xshell 的弹窗
参考文章[原创] Xshell、Xftp 免费版去除退出弹窗提示-新手实战,所有详细操作均出自此文章
反反调试
- 安装 x32dbg、x64dbg
- 安装 ScyllaHide(反反调试) 插件
- 配置插件参数,在 options 中选择
VMProtect x86/x64
设置弹窗断点
-
在弹窗处(本程序中为
CreateWindowExW
)处打断点,在命令行执行bp CreateWindowExW
,然后双击可以定位到断点位置。 -
在退出程序之前可以先禁用断点,以免影响其他弹窗命令的执行。
调用堆栈定位
-
在关闭窗口前启用弹窗断点,关闭窗口,此时未弹窗,说明程序卡在了
CreateWindowExW
。此时查看调用堆栈,寻找主程序中的一个调用点,找到最靠上的含有xshell
标识的调用点即可。双击跳转到该地址,参考原文中所述,此位置比调用弹窗的位置靠后。往上找,根据标识
<NSLICENSE_PersonalNotify>
可以定位到调用命令。找一个此命令上的push
命令打上断点。 -
重新运行程序,先禁用
CreateWindowExW
断点,在关闭窗口时再启用。程序退出后停在了之前打的push
断点。接下来需要逐步调试
call
命令中的相关指令是否包含了创建窗口相关的代码。当然这里原作者已经踩过坑了,整个call
都是在系统代码层面创建弹出窗口。这里有一个细节,作者在跳出
call
时使用了运行到用户代码。参考动态调试之——x64dbg的使用,这是由于call
的命令均在系统领空,是系统的代码段,无法修改,而执行运行到用户代码后跳转到了程序领空,这里才是调试程序需要的。 -
接下来就是如何让程序直接跳到
Exit Xshell
的位置。上面有一个je
,修改它即可。
修改和打补丁
-
右键单击
je
一行,选择汇编,将je
改为jmp
-
在代码修改行(代码区域都行),右键-补丁,选中主程序 xshell.exe 的修改,点击【修补文件】即可。
-
验证一下,发现关闭时确实没有弹窗了
手动修补
-
参考刚才修改位置的地址,可以将附近的地址一起加到搜索内容中达到精准查找的目的,这里搜索
74 11 6A 00 6A 07 6A 01
,其中74 11
代表刚才的je
指令,将74
修改为EB
-
验证一下效果,弹窗消失了,正常功能也不受影响
拓展应用——去掉自动检查更新弹窗
-
检查更新会弹出一个窗口,但是自动检查更新在一定的时间间隔内(默认7天)只会弹窗一次。除此之外,触发检查更新的另一个办法是点击菜单栏的【帮助】->【检查更新】
本来想使用之前设置的
CreateWindowExW
断点,但是一个比较难搞的事情是当 Xshell 窗口失去焦点以后菜单栏就会消失,而弹出的菜单栏本身又会受到CreateWindowExW
断点的影响导致后续调试无法进行(这也是作者强调CreateWindowExW
断点要合理设置启用和禁用的原因) -
换一个思路,检查更新的操作的名称肯定会被一个字符串存储,可以先定位到这个字符串所在的地址。全局搜索一下
update
发现一个比较合适的地址,双击进入打一个断点
点击检查更新,程序中断,但是发现断点不在主程序内
-
查看调用堆栈,找到最靠上的主程序调用
双击查看主程序,发现
call
调用更新函数的命令 -
然而这条命令之前没有什么跳转指令。于是直接将这一段指令最开始的部分(最后一个
int3
之后的第一条指令)修改为nop
+ret
给程序打上补丁,保存后运行,点击检查更新已经没有反应了,自动检查更新也随之失效。