iOS逆向分析和注入-微信防撤回

2021-02-14 大餅的技術之旅

微信公眾號:passerbycrk-weixin
如有問題或建議,請公眾號留言

複習iOS逆向知識,以微信消息防撤回為例,一步一步分析調試,到完成插件注入。

環境配置

越獄iPhone 5s (iOS 10.1.1) 並安裝了以下軟體:

OpenSSH: 實現在越獄手機上遠程進行 ssh 服務,通過 ssh,即可以通過終端連接 iPhone 進行控制。
dumpdecrypted: 砸殼工具。
Cycript: 腳本語言工具,用於 hook 正在運行的進程,並實時注入代碼。
debugserver: 用於連接手機進行 lldb 調試的工具。用 Xcode 在手機上進行 app 調試即可在iPhone目錄的 /Developer/usr/bin/ 中生成。

蘋果電腦 (macOS High Sierra 10.13.3) 並安裝了以下軟體:

frida-ios-dump: 砸殼利器。
class_dump: dump 目標對象的 class 信息的工具。
Hopper_Disassembler: 靜態分析工具。
usbmuxd: 埠轉發,可以讓我們通過 usb 連接手機進行 ssh、lldb 調試等。
lldb: 調試神器,用過的都說好 (/Applications/Xcode.app/Contents/Developer/usr/bin/lldb)。
theos: 插件編寫IDE。

流程概述砸殼

推薦使用frida-ios-dump,下面會分別以frida-ios-dump和dumpdecrypted為例進行砸殼,實際情況任選一個使用即可。

frida-ios-dump

1.獲取app信息 frida-ios-dump -l

# frida-ios-dump -l
 PID  Name            Identifier
 ----  -
92311  微信              com.tencent.xin
   -  App Store       com.apple.AppStore
   -  Cydia           com.saurik.Cydia
   -  FaceTime        com.apple.facetime
   -  Safari          com.apple.mobilesafari
   ...

2.根據app信息進行砸殼 frida-ios-dump [bundle id|name]


Start the target app com.tencent.xin
Dumping 微信 to /var/folders/7b/c3cyxy3j0t7_tgnt0dh5wc240000gn/T
start dump /var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/WeChat
WeChat.fid: 100%|█████████████████████████████████████████████████| 71.8M/71.8M [00:06<00:00, 11.1MB/s]
start dump /private/var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/Frameworks/WCDB.framework/WCDB
WCDB.fid: 100%|███████████████████████████████████████████████████| 2.49M/2.49M [00:00<00:00, 9.10MB/s]
start dump /private/var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/Frameworks/MMCommon.framework/MMCommon
MMCommon.fid: 100%|█████████████████████████████████████████████████| 979k/979k [00:00<00:00, 7.56MB/s]
start dump /private/var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/Frameworks/MultiMedia.framework/MultiMedia
MultiMedia.fid: 100%|█████████████████████████████████████████████| 6.61M/6.61M [00:00<00:00, 10.8MB/s]
start dump /private/var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/Frameworks/mars.framework/mars
mars.fid: 100%|███████████████████████████████████████████████████| 8.49M/8.49M [00:00<00:00, 11.2MB/s]
network_setting.html: 139MB [00:25, 5.62MB/s]
0.00B [00:00, ?B/s]
Generating "微信.ipa"

砸殼成功後會在當前目錄下生成去殼後的安裝包微信.ipa。

dumpdecrypted

1.獲取app安裝路徑 ps -e | grep /var/

# ps -e | grep /var/
92817 ??         0:16.99 /var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/WeChat
92867 ??         0:00.20 /private/var/containers/Bundle/Application/FD3685C9-80D5-419E-B106-DF466545003E/News.app/PlugIns/NewsNotificationServiceExtension.appex/NewsNotificationServiceExtension
93182 ttys000    0:00.02 grep /var/

2.根據app安裝路徑進行砸殼 DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/app/executablename

# DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/WeChat
mach-o decryption dumper
DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
[+] detected 64bit ARM binary in memory.
[+] offset to cryptid found: @0x1000b4cf8(from 0x1000b4000) = cf8
[+] Found encrypted data at address 00004000 of length 59457536 bytes - type 1.
[+] Opening /private/var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/WeChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a plain MACH-O image
[+] Opening WeChat.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset cf8
[+] Closing original file
[+] Closing dump file        

成功後會在當前目錄下生成WeChat.decrypted,也就是砸殼後的執行文件。

分析調試Cycript (動態分析工具)

官網: http://www.cycript.org/

Cycript允許開發人員調試和修改iOS和Mac OS X上運行的應用程式。
Cycript是一個理解Objective-C語法的javascript解釋器,它能夠掛鈎正在運行的進程,能夠在運行時修改應用的很多東西。

調試命令 cycript [-p <pid|name>]
可以先通過 ps -e | grep /var命令找到對應pid

# cycript -p WeChat
cy# [[[UIWindow keyWindow] rootViewController] _printHierarchy].toString()
`<MMTabBarController 0x14606ae00>, state: appeared, view: <UILayoutContainerView 0x145da6420>
  | <MMUINavigationController 0x146179800>, state: appeared, view: <UILayoutContainerView 0x145d99460>
  |    | <NewMainFrameViewController 0x1460ff600>, state: disappeared, view: <MMUIHookView 0x145d8efa0> not in the window
  |    | <BaseMsgContentViewController 0x146983e00>, state: appeared, view: <UIView 0x145d7d440>
  | <MMUINavigationController 0x14618b000>, state: disappeared, view: <UILayoutContainerView 0x145d9dda0> not in the window
  |    | <ContactsViewController 0x146191000>, state: disappeared, view:  (view not loaded)
  | <MMUINavigationController 0x14613a800>, state: disappeared, view: <UILayoutContainerView 0x145da0ec0> not in the window
  |    | <FindFriendEntryViewController 0x146859200>, state: disappeared, view:  (view not loaded)
  | <MMUINavigationController 0x1461a4e00>, state: disappeared, view: <UILayoutContainerView 0x145da3950> not in the window
  |    | <MoreViewController 0x146172c00>, state: disappeared, view:  (view not loaded)`

Logify (靜態分析工具-追蹤)

介紹: http://iphonedevwiki.net/index.php/Logify

Logify是一種實用工具,可以將類的頭文件(.h文件)作為輸入,並生成MobileSubstrate文件(.xm文件)。
作用:能自動Hook該類所有的方法,並生成列印日誌信息代碼,方便開發人員看到在使用過程中調用了某些方法。

# logify.pl BaseMsgContentViewController.h > Tweak.xm

Logos 語法

介紹: http://iphonedevwiki.net/index.php/Logos

可以在MobileSubstrate文件(.xm文件)中使用的語法

Theos-NIC 

介紹: http://iphonedevwiki.net/index.php/NIC

Theos NIC templates內置了多種種Theos工程類型的模板。
用於編寫iOS越獄設備的插件。

創建一個追蹤logify的插件工程:

# nic.pl
NIC 2.0 - New Instance Creator

 [1.] iphone/activator_event
 [2.] iphone/application_modern
 [3.] iphone/cydget
 [4.] iphone/flipswitch_switch
 [5.] iphone/framework
 [6.] iphone/ios7_notification_center_widget
 [7.] iphone/library
 [8.] iphone/notification_center_widget
 [9.] iphone/preference_bundle_modern
 [10.] iphone/tool
 [11.] iphone/tweak
 [12.] iphone/xpc_service
Choose a Template (required): 11
Project Name (required): TWeak-Logify-WX
Package Name [com.yourcompany.tweak-logify-wx]: cn.theos.tweak.wx.logify
Author/Maintainer Name [dabing]: author name
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.tencent.xin
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak in tweaklogifywx/...
Done.

工程文件結構如下:

# tree
.
└── tweaklogifywx
   ├── Makefile
   ├── TWeakLogifyWX.plist
   ├── Tweak.xm
   └── control

將Logify生成的Tweak.xm覆蓋掉工程中的Tweak.xm
用文本編輯器打開Makefile文件,在文件的開頭增加iOS設備的ip地址和ssh埠等信息:

THEOS_DEVICE_IP = localhost
THEOS_DEVICE_PORT = 2333
ARCHS = arm64
TRAGET = iphone:latest:9.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = TWeakLogifyWX
TWeakLogifyWX_FILES = Tweak.xm
logifyWX_FRAMEWORKS = UIKit Foundation CoreGraphics
logifyWX_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
   install.exec "killall -9 SpringBoard"

編譯打包安裝:

# make package install
> Making all for tweak TWeakLogifyWX…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (arm64)…
==> Linking tweak TWeakLogifyWX (arm64)…
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of iOS 7 [-Wdeprecated]
==> Generating debug symbols for TWeakLogifyWX (arm64)…
warning: no debug symbols in executable (-arch arm64)
==> Merging tweak TWeakLogifyWX…
==> Signing TWeakLogifyWX…
> Making stage for tweak TWeakLogifyWX…
dm.pl: building package `cn.theos.tweak.wx.logify:iphoneos-arm' in `./packages/cn.theos.tweak.wx.logify_0.0.1-1+debug_iphoneos-arm.deb'
==> Installing…
Selecting previously unselected package cn.theos.tweak.wx.logify.
(Reading database ... 2279 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking cn.theos.tweak.wx.logify (0.0.1-1+debug) ...
Setting up cn.theos.tweak.wx.logify (0.0.1-1+debug) ...
install.exec "killall -9 SpringBoard"

注意:一般該Tweak.xm仍然無法執行,需要進行修改:
去掉 .cxx_destruct 方法
將 HBLogDebug 改為 NSLog
去掉所有的 weak 屬性
將頭文件(.h文件)中的@class和@protocol聲明都拷貝至Tweak.xm (或去掉所有delegate並將所有參數對象類型改為id)。

安裝成功後會在設備中新增以下兩個文件:

/Library/MobileSubstrate/DynamicLibraries/TWeakLogifyWX.dylib
/Library/MobileSubstrate/DynamicLibraries/TWeakLogifyWX.plist

打開Cydia-已安裝可以看到插件已經安裝成功:

idevicesyslog (iOS日誌查看工具)

介紹: https://github.com/libimobiledevice/libimobiledevice

是libimobiledevice下的一個子工具,可以實時追蹤iOS設備日誌。

# idevicesyslog | grep "BaseMsgContentViewController"

重新運行app,執行收到消息和撤回消息的case,可以分別獲取兩份log:

接收消息log

撤回消息log

整理後log對比可以發現可疑方法調用
-[BaseMsgContentViewController OnMsgRevoked:n64MsgId:]

class-dump (靜態分析工具)

介紹: http://stevenygard.com/projects/class-dump/

這是一個檢查存儲在Mach-O文件Objective-C運行時信息的命令行實用工具。
能生成classes、categories、protocols定義的頭文件(.h文件)。(與otool -ov命令獲取的信息類似,但可讀性更高)

# class-dump -HA WeChat -o ./Headers

獲得頭文件以及方法的IMP address

例如:-[BaseMsgContentViewController OnMsgRevoked:n64MsgId:] // IMP=0x0000000102129454

Hopper Disassembler (分析工具)

介紹: https://www.hopperapp.com

是一款32位和64位的二進位反彙編器,反編譯和調試。可以使用此工具拆開你想要的任何二進位。

使用方法很簡單:將二進位文件拖入軟體中,等待處理完成即可。
(完整解析微信app需要很長一段時間,可以前置該流程進行解析處理)

lldb+debugserver (遠程調試) 

打開微信後,在連接至設備的控制臺中鍵入debugserver *:1234 -a "WeChat"啟動debugserver。
2.從控制臺打開新窗口,鍵入lldb進入調試,再鍵入debugserver *:1234 -a "WeChat"連接1234埠。


(此處連接需要一段時間,連接上後鍵入c(continue)命令後app就可以正常運行了)
連接成功後lldb窗口會出現以下內容:

(lldb) process connect connect:
Process 73244 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
   frame #0: 0x00000001900f5164 libsystem_kernel.dylib`__fcntl + 8
libsystem_kernel.dylib`__fcntl:
->  0x1900f5164 <+8>:  b.lo   0x1900f517c               ; <+32>
   0x1900f5168 <+12>: stp    x29, x30, [sp, #-0x10]!
   0x1900f516c <+16>: mov    x29, sp
   0x1900f5170 <+20>: bl     0x1900d9e8c               ; cerror
Target 0: (WeChat) stopped.
(lldb) c
Process 73244 resuming

獲取aslr的offset。(每次啟動都不同)
其中第一列[X]是image的序號,不用管;第二列是aslr的offset(也就是對應image的虛擬內存slide);第三列是image的全路徑和slide之後的基地址,也不用管~所以第二列就是我們需要的信息。

(lldb) image list -o -f
[  0] 0x0000000000048000 /var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/WeChat(0x0000000100048000)
[  1] 0x0000000104a20000 /Users/passerbycrk/Library/Developer/Xcode/iOS DeviceSupport/10.1.1 (14B100)/Symbols/usr/lib/dyld
[  2] 0x0000000104970000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x0000000104970000)
[  3] 0x000000000fab4000 /Users/passerbycrk/Library/Developer/Xcode/iOS DeviceSupport/10.1.1 (14B100)/Symbols/System/Library/Frameworks/CallKit.framework/CallKit
[  4] 0x000000000fab4000 /Users/passerbycrk/Library/Developer/Xcode/iOS DeviceSupport/10.1.1 (14B100)/Symbols/System/Library/Frameworks/Accelerate.framework/Accelerate
[  5] 0x000000000fab4000 /Users/passerbycrk/Library/Developer/Xcode/iOS DeviceSupport/10.1.1 (14B100)/Symbols/System/Library/Frameworks/Intents.framework/Intents
[  6] 0x000000000fab4000 /Users/passerbycrk/Library/Developer/Xcode/iOS DeviceSupport/10.1.1 (14B100)/Symbols/usr/lib/libbz2.1.0.dylib
[  7] 0x0000000104aa4000 /private/var/containers/Bundle/Application/FC7574FD-C99D-49DE-8130-AF824051424A/WeChat.app/Frameworks/WCDB.framework/WCDB(0x0000000104aa4000)
[  8] 0x000000000fab4000 /Users/passerbycrk/Library/Developer/Xcode/iOS DeviceSupport/10.1.1 (14B100)/Symbols/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore
...

得到aslr的offset:0x0000000000048000 (不同的發布版本偏移量不一定相同)
再根據class-dump獲得的頭文件,找到對應的方法,在後面可以看到IMP的offset。
-[BaseMsgContentViewController OnMsgRevoked:n64MsgId:] // IMP=0x0000000102129454
通過br命令設置斷點(aslr_offset + IMP_offset)

(lldb) br s -a '0x0000000000048000+0x0000000102129454'
Breakpoint 1: where = WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 4373492, address = 0x0000000102171454

重新操作消息撤回case後,進入斷點,鍵入bt命令:

Process 73244 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
   frame #0: 0x0000000102171454 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 4373492
WeChat`ClearDataItem::compareTime:
->  0x102171454 <+4373492>: stp    x24, x23, [sp, #-0x40]!
   0x102171458 <+4373496>: stp    x22, x21, [sp, #0x10]
   0x10217145c <+4373500>: stp    x20, x19, [sp, #0x20]
   0x102171460 <+4373504>: stp    x29, x30, [sp, #0x30]
Target 0: (WeChat) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
 * frame #0: 0x0000000102171454 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 4373492
   frame #1: 0x0000000104d5b980 MMCommon`_callExtension + 480
   frame #2: 0x0000000102ccfaac WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 16294476
   frame #3: 0x0000000102cda958 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 16339192
   frame #4: 0x0000000102cdb60c WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 16342444
   frame #5: 0x0000000104d5b980 MMCommon`_callExtension + 480
   frame #6: 0x0000000102f89414 WeChat`ClearSessionItem::compareVideo(std::__1::shared_ptr<ClearSessionItem> const&, std::__1::shared_ptr<ClearSessionItem> const&) + 1516048
   ...

python+Hopper Disassembler 獲取調用棧

>>> hex(0x0000000102171454-0x0000000000048000)
'0x102129454'
>>> hex(0x0000000102ccfaac-0x0000000000048000)
'0x102c87aac'

使用Hopper Disassembler可以定位調用方法名,此處我們發現可疑函數調用 -[CMessageMgr onRevokeMsg:]
編寫插件並注入

創建插件工程

# nic.pl
NIC 2.0 - New Instance Creator

 [1.] iphone/activator_event
 [2.] iphone/application_modern
 [3.] iphone/cydget
 [4.] iphone/flipswitch_switch
 [5.] iphone/framework
 [6.] iphone/ios7_notification_center_widget
 [7.] iphone/library
 [8.] iphone/notification_center_widget
 [9.] iphone/preference_bundle_modern
 [10.] iphone/tool
 [11.] iphone/tweak
 [12.] iphone/xpc_service
Choose a Template (required): 11
Project Name (required): Tweak-crack-WX
Package Name [com.yourcompany.tweak-crack-wx]:
Author/Maintainer Name [dabing]:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.tencent.xin
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak in tweakcrackwx/...
Done.

Tweak.xm

%hook CMessageMgr
- (void)onRevokeMsg:(id)arg1 {
   
}
%end

安裝


> Making all for tweak TweakcrackWX…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak TweakcrackWX…
dm.pl: building package `com.yourcompany.tweak-crack-wx:iphoneos-arm' in `./packages/com.yourcompany.tweak-crack-wx_0.0.1-2+debug_iphoneos-arm.deb'
==> Installing…
Selecting previously unselected package com.yourcompany.tweak-crack-wx.
(Reading database ... 2277 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking com.yourcompany.tweak-crack-wx (0.0.1-2+debug) ...
Setting up com.yourcompany.tweak-crack-wx (0.0.1-2+debug) ...
install.exec "killall -9 SpringBoard"

打開Cydia-已安裝可以看到插件已經安裝成功:


接下來重新運行微信,試試消息撤回的case,發現消息撤回已經被阻止了,任務完成~

(文章特意選了個軟柿子案例,實際情況可能不會這麼容易找到關鍵函數,需要反覆調試驗證)

相關焦點

  • 微信QQ防撤回的方法,終於被我找到了
    今日分享:微信防撤回作為主流的社交工具,微信承載了大部分人的社交需求,工作群、吃瓜群等各種群遍布在我們的微信上,但自從有了撤回這個功能,讓我們經常容易錯過許多精彩話題,甚至是兄弟之間的學習交流資源。小雷在職場摸爬滾打的這幾年,可謂是吃瓜第一人,而那些微信上的撤回對我來說一點用都沒有,正是掌握了防撤回技巧,才能不輕易錯過任何信息。方法很簡單,只需要打開小雷準備的神器,點擊安裝補丁即可,之後不管是社群還是單獨聊天就都能防撤回了。對了,這次是針對電腦端的微信,相比於手機,不需要掛程序,且大小只有100kb。想要嘗試的朋友可以到"雷科技"公眾號上面回復【668】即可。
  • 想知道女朋友到底撤回了什麼小秘密嗎,微信已經支持消息防撤回了
    想知道女朋友到底撤回了什麼小秘密嗎,微信已經支持消息防撤回了 現在的社交軟體都有一種 「後悔藥」,學名叫 「消息撤回功能」。我們用的最多的應該是微信。在微信當中,不管你是消息發錯了還是後悔了,只要長按消息內容點擊 「撤回」,對方沒看到的話,就永遠看不到了!
  • 剛剛微信防撤回來啦!簡單設置一下就能看到撤回的消息,太實用了
    今日分享:QQ、微信防撤回適用系統:安卓今天小雷非常自覺地克制住自己不摸魚認真工作,結果在小雷好不容易沉浸在工作裡的時候,手機突然就開始瘋狂震動,屏幕上滿滿新消息提醒,以為我的「魚友」(一起摸魚的好友簡稱)又給我八卦什麼好玩的了,結果等小雷我興致衝衝打開手機,結果想打人
  • 微信消息被撤回?閃照無法保存?一步設置完美解決!
    出撤回功能,對一些好奇心很強的朋友簡直是一種折磨。就在昨天筆者收到的一條重要的消息被撤回了,在網上找了很多方法,終於看到被撤回的消息了。今天,筆者就篩選了幾個比較簡單的方法來教大家如何查看被撤回的消息!
  • WX多開&消息防撤回安裝版+綠色版(帶撤回提示)
    簡介經常使用WX電腦版的用戶都會發現一個蛋疼的事情,那就是微信PC版不支持多開,也就是不能同時登陸多個帳號,這對於需要在電腦上登陸多個微信帳號的朋友來說肯定是極其的不方便。另外有的時候別人撤回了一些重要消息,會導致我們錯失部分重要內容。而這個綠色特別版本就支持多開,同時可以防撤回消息。
  • Android React Native應用逆向分析初探
    當前的行動裝置廠商很多,但是被廣泛使用的主流系統卻只有兩個,Android和iOS,因此現在大多數應用都會有兩個版本,Android版本和iOS版本。然而這兩種應用的開發方式卻完全不同,移動客戶端開發人員不得不分成兩個隊伍,分別開發Android應用和iOS應用,儘管這兩個應用的功能、界面、邏輯都是完全相同的,隱形中就帶來了重複造輪子的問題。
  • 一次性滿足你手機的所有功能,自動搶H包、定位、防撤回……
    本文轉載自【微信公眾號:手機電腦雙黑客 ,ID:heikestudio】全球虛擬定位?自動搶H包?一鍵改機?消息防撤回?語音消息轉發?步數修改器?7、免ROOT消息防撤回,還在猜想「她」說了什麼嗎,被撤回的消息就在眼前。8、免ROOT語音消息一鍵轉發,一鍵轉發語音消息,比翼專享。9、免ROOT步數修改器,晃一晃手機,步數High翻天,還能得HB。
  • 微信聊天女神撤回了啥,Python來搞定!
    但要說微信最讓人不爽的發明,消息撤回絕對能上榜那麼到底有沒有什麼辦法能夠知道對方撤回了什麼呢?表急,Python帶你搞定。一、模塊介紹用Python實現微信的撤回消息查看功能。這是一段地址,通過這個我們可以把圖片和語音保存下來。四、如保存好友發送的圖片和語音下面我們就要對好友發送的圖片和語音保存下來。
  • 微信轉帳可以撤回怎麼撤回?微信轉錯帳如何退回方法介紹
    微信轉帳能撤回嗎?微信轉帳怎麼撤回?微信轉帳可以撤回嗎?微信的轉帳功能是很便民的功能,但是很多小夥伴有時轉帳轉錯了,想要撤回,微信轉帳能撤回嗎,微信轉帳怎麼撤回,小編來為大家介紹。  微信轉帳能撤回嗎  微信轉帳是不能撤回的。
  • 想查看微信好友撤回的消息?Python幫你搞定
    要說微信最讓人噁心的發明,消息撤回絕對能上榜。比如你現在正和女朋友用微信聊著天,或者跟自己喜歡的女孩子聊著天,一個不留神,你沒注意到對方發的消息就被她及時撤回了,這時你很好奇,好奇她到底發了什麼?於是你打算問問她發了什麼,結果她回一句"沒什麼"。
  • ios微信共享位置怎麼改
    ios微信共享位置怎麼改?不論是蘋果手機還是安卓手機,都會使用微信這款手機軟體,我們的社交習慣已經在上面提現的淋漓盡致了。那麼大家知道ios微信共享位置怎麼改嗎?相信還有很多用戶還不是很清楚,下面就快和小編一起看看吧!
  • 【實用】教你查看,已經撤回的微信消息!這一招兒太有用了...
    不知道大家有沒有這樣的感覺,有時候你在給朋友發微信時,對方可能趁你不注意發了消息然後撤回了。當然了,因為資源有限,現在的應對方法只針對iPhone用戶防文字撤銷。步驟很簡單,看好:1.首先我們來打開iPhone的設置,選中通知欄。
  • 為什麼微信的撤回消息只能是2分鐘?微信團隊是這麼說的
    原標題為:《微信的撤回功能是如何「覆水回收」的》。為什麼發出去的消息可以輕鬆撤回,為什麼微信撤回消息只能是2分鐘?來看看微信團隊都是如何考慮的。一諾千金。古人有云,「一言既出,駟馬難追」,一句話說出了口,就是套上四匹駿馬拉的車也難追。
  • 這款APP不僅可以防止微信撤回消息,還能自動搶紅包
    當微信成為我們每日交流的主流軟體,紅包成為病毒時代的重要消遣。那麼,在當今這個紅包開掛,神仙打架的背景下,如何快人一步呢?今天就給大家介紹一下主流的搶紅包工具。言歸正傳,將微信通過創建應用安裝到太極,並下載好微X模塊後,打開微信,就能看到右上角多了三個點,這三點就是我們的主角-微X模塊,可以看到微X模塊的功能非常豐富,包括群聊管理、自動回復、朋友前、防撤回等多種實用功能,非常豐富,可以將微信的功能發揮到最大化。我們測試一下防撤回功能,可以看到,當對方撤回消息後,還能給出提示,真是相當貼心了。
  • 微信已撤回的消息無法查看?教你三招立刻查看撤回的消息
    自從微信推出了「撤回」功能外,對於有強迫症與強好奇心的人來說,簡直就是一種折磨。微信上的朋友發信息總是喜歡撤回,該怎麼查看已經被撤回的消息呢?網上有很多教人查看微信撤回消息的辦法,小編親自測試後覺得有三個辦法比較可用。
  • 微信怎樣查看對方撤回去的話?
    如果對方撤回後自從微信推出撤回功能後,對於有強烈好奇心的朋友來說,簡直是一種折磨,女神到此說了什麼呢?她是同意了還是拒絕了呢?查看微信撤回消息,方法很簡單,不需要第三方軟體。
  • 微信拍一拍怎麼撤回
    微信如果已經升級到最新版本了的話,是可以使用拍一拍功能的。但若是向好友發送了拍一拍的信息後又想撤回來的話,該怎麼操作呢?一起來看看吧。1、登陸手機微信後,找到想要發送拍一拍信息的好友頭像,然後打開它。  3、如果是第一次使用拍一拍功能的話,系統會提醒你在2分鐘內發送的拍一拍信息都是可以撤回的。
  • ios14微信選不了照片怎麼辦?ios14微信發圖片不顯示圖片解決方法...
    ios14微信為什麼升級完系統之後,微信中發圖片會沒有辦法顯示?遇到這種問題的人很多,微信大家經常會用,而且發圖片也是一個很重要的功能,這次我們就來看看ios14微信不能發圖片的處理方法是什麼吧。ios14微信發圖片不顯示圖片解決方法許多果粉發現,升級到iOS14之後,微信或者微博選擇不了圖片發送了,或者只能選擇1張圖片,這裡教大家如何解決這個問題。在升級完 iOS 14 後 ,第一次打開任意一款 App 時,系統會彈出如下圖所示的通知。
  • 你也有過微信「 撤回信息 」的時候吧
    本文轉載自【微信公眾號:阿飄為什麼不會飄,ID:a310411344】點擊藍字關注我UnfoldAlina Baraz;Galimatias - Urban Flora在微信的這麼多個功能裡面;我最喜歡的就是「 撤回 」因為我性格大大咧咧
  • 蘋果iPhone X微信如何撤回圖片消息?
    蘋果iPhone X微信如何撤回圖片消息?這是不少首次入手蘋果手機的用戶,遇到的問題之一。當然,對於安卓手機用戶來說,微信撤回圖片消息很簡單。(安卓手機)用戶長按剛剛發送的圖片,在彈出的菜單中選擇「撤回」,圖片即可被撤回。誠然,發送時間超過2分鐘就沒法撤回了。