[Exchange and share] 关于微信Linux原生版在 V23 RC2 上启动闪退问题的简单分析
Tofloor
poster avatar
178******17
deepin
2024-08-11 19:25
Author

问题描述

在使用 V23 RC2 版本后, 发现从应用商店下载的原生微信 Linux 版本打不开了, 具体的现象是出现了登录框在刷新二维码的时候直接退出.

而相同版本在 V20.09 上就能正常打开.

从商店的评论里可以看到有其他人也遇到了这个问题, 而且他还尝试了命令行启动时发现会报错:

/opt/apps/store.spark-app.wechat-linux-spark/files/launch.sh

而报错的内容如下

libpng warning: iCCP: known incorrect sRGB profile

然后在网上搜索相关内容, 发现找不到解决这个问题的内容, 所以就暂时放弃了原生微信, 又过了一段时间, 发现网上还是找不到相关解决方案, 所以尝试自己去分析下原因.

简单分析

  1. 对比了两个版本微信的相关文件的 md5, 基本是一模一样的, 排除微信版本的因素.

  2. 因为命令行有 libpng 报错, 所以还尝试了将 20.09 的 libpng 文件拷贝过来发现问题依旧存在.

  3. 在 20.09 系统上使用 launch.sh 脚本启动, 也会报 libpng 的报错, 所以排除是 libpng 的问题.

  4. 通过 ldd 命令查看 v23 和 v20.09 上 webchat 的依赖 so, 然后把差异的 so 拷贝到 libs 文件夹, 发现问题依旧存在, 基本排除了是依赖的问题.

  5. 看了下 files/wechat 文件是个 linux 下的可执行文件, 所以尝试使用 gdb 来启动

    • 拷贝了一份 launch.sh 用来修改, 在最后一行 wechat 路径前面加上 gdb --args
    • 启动时会进入 gdb 调试模式, 然后 r 运行, 发现程序挂在了如下位置
    #0  __strcpy_avx2 () at ../sysdeps/x86_64/multiarch/strcpy-avx2.S:222
    #1  0x00007ffff0010bba in uos_get_hddsninfo () from /usr/lib/license/libuosdevicea.so
    
    • 从堆栈可以看到是在 libuosdevicea.so 中有个 uos_get_hddsninfo 函数调用 strcpy 拷贝字符串的时候崩掉了, 可能是传入了空指针之类的
    • 从函数名看到是 uos 获取某个信息时出问题了, 其他的也看不出啥信息了.

通过上面的分析, 发现问题出在如下文件的 uos_get_hddsninfo 函数中

/opt/apps/store.spark-app.wechat-linux-spark/files/license/usr/lib/license/libuosdevicea.so

继续分析

使用搜索引擎搜索相关内容, 在使用 uos_get_hddsninfo 搜索时找到了如下链接

https://aur.archlinux.org/packages/wechat-universal-bwrap?O=70

这个是 archlinux 社区的一个讨论帖子, 里面末尾有给出一段代码, 是用来替代 libuosdevicea.so 文件的

将内容拷贝到 1.c 文件中, 使用如下命令编译

gcc 1.c -fpic -shared -o libuosdevicea.so

然后将编译出来的 libuosdevicea.so 覆盖掉原先的

/opt/apps/store.spark-app.wechat-linux-spark/files/license/usr/lib/license/libuosdevicea.so

再次打开微信 Linux 版, 就能正常打开了, 也刷出了二维码, 不过我却犹豫了下, 没有去扫码登录.

写在最后

其实微信 wine 版在 V23 上用着已经非常流畅了, 感觉比 v20.09 上启动快多了, 只是稍微有种强迫症吧, 想着能用原生的就用原生的.

现在这个原生的微信虽然能打开了, 但是被我修改过了, 我又不想用了, 还是等官方出正式版本的时候, 比 wine 版好用的时候再说吧.

另外, 上面的内容都是从网上搜索到的, 特别是最后那段代码, 我也不确定是否是安全的, 所以如果有人想尝试的话还是要慎重点.

最后坐等 deepin V23 正式版.

Reply Favorite View the author
All Replies
f@deepin
deepin
2024-08-11 19:57
#1

我补充个备选方案

flatpak install com.tencent.WeChat

image.png

Reply View the author
LINUX小白菜
deepin
2024-08-11 21:08
#2

linux微信用着用着就不见了,我还以为只有我的电脑上是这样,原来不止如此。

Reply View the author
我是昵称
deepin
2024-08-11 21:19
#3

这个libuosdevicea.so库的uos_get_hddsninfo函数看命名应该是获取硬盘序列号信息的,是不是硬盘相关导致的?

Reply View the author
神末shenmo
deepin
Spark-App
2024-08-11 21:21
#4

libuosdevicea会查找UOS的验证信息

目前商店里上架的方案是用Bwrap模拟验证信息,而不是破解uosdevicea,因为不想冒版权风险

正常来说是能过验证的,你这个过不了的情况比较奇怪,我这里不能复现...

Reply View the author
hinata
deepin
2024-08-11 21:28
#5

我以为是我电脑的问题

Reply View the author
字甲达宾
deepin
2024-08-12 09:42
#6

顺便也说一个:腾讯家的 linuxqq 启动时,也会执行一个 带路径的命令

/bin/lsblk

用于查看硬盘分区信息。

从上面的 weichat 分析看,算是常规操作了

Reply View the author
蓝鲸
deepin
2024-08-12 09:51
#7

分析地好详细啊,膜拜like

Reply View the author
fishtca
deepin
2024-11-01 21:08
#8
It has been deleted!
fishtca
deepin
2024-11-01 21:40
#9

1.c的代码

/*
 * licensestub - compat layer for libuosdevicea
 * Copyright (C) 2024 Zephyr Lykos 
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */
#define _GNU_SOURCE

#include 

// MAC address with colon stripped
void uos_get_mac(char* out) {
    if (out) {
        strcpy(out, "000000000000");
    }
}

void uos_get_hddsninfo(char* out) {
    if (out) {
        strcpy(out, "SN");
    }
}

// MD5 of hddsninfo
void uos_get_hwserial(char* out) {
    if (out) {
        strcpy(out, "92666505ce75444ee14be2ebc2f10a60");
    }
}

// Hardcoded
void uos_get_mb_sn(char* out) {
    if (out) {
        strcpy(out, "E50022008800015957007202c59a1a8-3981-2020-0810-204909000000");
    }
}

void uos_get_osver(char* out) {
    if (out) {
        strcpy(out, "UnionTech OS Desktop");
    }
}

void uos_get_licensetoken(char* out) {
    if (out) {
        strcpy(out, "djEsdjEsMSwyLDk5QUFFN0FBQVdRQjk5OFhKS0FIU1QyOTQsMTAsOTI2NjY1MDVjZTc1NDQ0ZWUxNGJlMmViYzJmMTBhNjAsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE6ZjA3NjAwYzZkNmMyMDkyMDBkMzE5YzU2OThmNTc3MGRlYWY1NjAyZTY5MzUxZTczNjI2NjlhNzIyZTBkNTJiOTNhYzk0MmM3YTNkZTgxNjIxMmUwMDA1NTUwODg4N2NlMDQ4ODMyNTExY2JhNGFiMjdmYzlmZjMyYzFiNTYwNjMwZDI3ZDI2NmE5ZGIxZDQ0N2QxYjNlNTNlNTVlOTY1MmU5YTU4OGY0NWYzMTMwZDE0NDc4MTRhM2FmZjRlZGNmYmNkZjhjMmFiMDc5OWYwNGVmYmQ2NjdiNGYwYzEwNDhkYzExNjYwZWU1NTdlNTdmNzBlNjA1N2I0NThkMDgyOA==");
    }
}

int uos_is_active() {
    return 0;
}
Reply View the author