Facebook Web 端 PWD_BROWSER 密码加密算法还原

加密流程: 从网页源码中取出 key_id 和 public_key,形如:key_id = 34,public_key = ”a6918ee2a5688ff4a860644109c7042384698d70d36844ec1d643e2a66052869“ 生成随机 AES GCM 密钥,用生成的密钥创建一个 AEG GCM 加密,iv 填充 12 字节 0,additionalData 为秒级时间戳,tag 为 16 字节0 用前面从网页里面提取出的公钥使用 Sealed Box 算法(Curve25519 + XSalsa20 + Poly1305)加密 AES GCM KEY 得到加密结果 最终将前面的结果拼接起来用标准 base64 编码 拼接结构如下: [header] ... 阅读更多

Centos7.9 下 Docker 安装 Mysql、Nginx、Redis 命令记录

安装 Docker yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker Docker 安装 Nginx 1.26 mkdir -p /docker/nginx/{html,logs} docker run -d \ --name nginx \ -p 80:80 \ --re ... 阅读更多

在 Android AArch64 上用 QBDI trace 时避免 C++ 异常导致 abort

用 qbdi trace 跑一段目标函数时,如果目标函数里会间接调用到某个会抛 C++ 异常的函数(内部用 __cxa_throw),进程经常会直接 abort 原因: QBDI 把执行交给“原生”跑被调函数时,会在栈上改掉返回地址,让函数返回时回到 QBDI 的 trampoline。C++ 异常在找 catch 时会按栈上的返回地址做 unwind;这时看到的是 QBDI 的地址,没有对应的异常处理信息,就被当成未处理异常 → 直接 abort。所以:会 throw 的那段代码不能在被 QBDI 插桩/控制的这条“假栈链”里,要么别插桩它,要么别让它出现在你 trace 的这条调用链的“插桩范围”里。 解决思 ... 阅读更多

关于 Android frida-server 注入痕迹残留 zygote

在研究 libpairipcore.so 反调试时发现一件很奇怪的事情,只要手机上曾经启动过 frida-server,目标 app 也能检测到,卸载重新安装都没用,除非使用 adb shell stop;start 重启 framework 框架。 我就在想是不是 frida-server 在系统中有残留?为什么重启 framework 之后就能打开?带着疑惑,我问了下gpt,它说是 frida-server 启动后会影响到 zygote 进程,可能改变了某些内存布局。如果真是这样,那就能解释通为什么卸载重装也打不开了,因为所有 app 都是从 zygote 进程 fork 孵化出来的,新的 app 进程会继承 zygote 的所有内存信息,等于说 frida-server 痕迹也会被继承 ... 阅读更多

Android ADB 调试命令:start -D 与 set-debug-app

adb shell am start -D -n <包名>/<启动类> 立即启动应用,等待调试器连接,仅本次启动生效,当 native crash(SIGSEGV / SIGABRT 等)发生时系统不会向进程发送 signal SIGSTOP 信号,进程直接崩溃。 adb shell am set-debug-app -w <包名> 设置应用为可调试状态,立即启动应用,等待调试器连接,持久有效,当 native crash(SIGSEGV / SIGABRT 等)发生时系统会向进程发送 signal SIGSTOP 信号,这时候可以用lldb或者gdb调试器附加上去就能直接进崩溃现场(寄存器 / 栈 / 内存都在)。 清除设置使用 adb shell am ... 阅读更多

编译 curl-7.88.1 with openssl zlib 教程

很久没接触C++方面的代码了,编译起来有些生疏,避免以后再次踩坑,所以记录一下。 我以静态方式编译了这些库,并且都使用了带有 Visual C++ Redistributable 的环境,也就是 Visual Studio 的 MT/MTd 模式。这样编译出来的程序自带 C++ 运行库,无需额外依赖 环境 windows10 企业版 visual studio 2015 准备文件 curl-7.88.1 https://curl.se/download/curl-7.88.1.zip zlib131 https://zlib.net/zlib131.zip openssl1.1.1w https://codeload.github.com/openssl/openssl/tar.gz/ref ... 阅读更多

Frida Hook so 动态链接库文件 .init_array 段中的函数

在开始之前,我们先回顾下 so 的大概加载流程 do_dlopen -> soinfo::call_constructors() -> call_array -> call_function call_array 负责按顺序调用 .init_array 或 .fini_array 中注册的函数指针,这些函数通常是在 .so 加载后初始化时或卸载前需要执行的钩子函数。 也就是说,我们想 hook 住 .init_array 里面的函数就必须在 call_array 执行之前,一般我们会想到 hook android_dlopen_ext 函数,就像下面这样: Interceptor.attach(Module.getExportByName(null, 'android_dl ... 阅读更多

修改 WeChatWin.dll 实现 PC 版微信无限多开

PC微信x64版本 [3.9.12.51] 在电脑上成功登录第一个微信实例后,尝试启动第二个微信时,系统会自动将第一个微信窗口激活并置顶以阻止我们运行第二个微信。推测其内部可能调用了 BringWindowToTop 或 SetForegroundWindow 函数。为验证这一点,我们使用 x64dbg 对上述函数设置断点。 不出所料,确实在 BringWindowToTop 处断下来了 接着观察堆栈窗口,查看是从哪里调用的 BringWindowToTop,在堆栈中双击“返回到 wechatwin.TlsGetData+AC6273 自 ???”这一项,进入调用位置。 跳转后,定位到地址 00007FFE792D74A3 处,分析调用 BringWindowToTop 的上下文。 发现 0 ... 阅读更多

修改 WeChatWin.dll 实现 PC 版微信语音/视频弹窗屏蔽

在使用 PC 版微信时,遇到这样一个问题:在打游戏或进行全屏操作时,微信的语音/视频通话弹窗会突然跳出,打断当前任务,造成不便,很让人抓狂。 微信设置中虽然提供了关闭“语音和视频通话通知声音”的选项,但实测发现,该设置只能关闭提示音,并不能阻止弹窗本身的出现。 为了解决这个问题,本文尝试通过修改 WeChatWin.dll 的方式来实现对通话弹窗的屏蔽。 实现原理 可以发现每当收到视频或语音电话时这个弹窗总是固定出现在桌面的右下角,内部的代码实现应该就是:创建窗口(CreateWindowExW)—->移动窗口(SetWindowPos),经过分析,也确实如此,那么只需要阻止创建窗口即可,语音/视频弹框的窗口类名是 ILinkVoipTrayWnd 根据这个类名来阻止。 好 ... 阅读更多