[+] 支持 Weixin 4.0

This commit is contained in:
辉鸭蛋 2024-11-06 23:57:27 +08:00
parent 0f29f67708
commit 39bc37717e
10 changed files with 218 additions and 13 deletions

File diff suppressed because one or more lines are too long

View File

@ -16,8 +16,8 @@ namespace RevokeMsgPatcher
return new Bag return new Bag
{ {
Apps = AppConfig(), Apps = AppConfig(),
LatestVersion = "1.9", LatestVersion = "2.0",
PatchVersion = 20240929, PatchVersion = 20241106,
Notice = "", Notice = "",
NoticeUrl = "", NoticeUrl = "",
}; };
@ -34,6 +34,7 @@ namespace RevokeMsgPatcher
return new Dictionary<string, App> return new Dictionary<string, App>
{ {
{ "Wechat" , Wechat() }, { "Wechat" , Wechat() },
{ "Weixin" , Weixin() },
{ "QQ" , QQ() }, { "QQ" , QQ() },
{ "TIM" , TIM() }, { "TIM" , TIM() },
{ "QQLite" , QQLite() }, { "QQLite" , QQLite() },
@ -1389,5 +1390,49 @@ namespace RevokeMsgPatcher
} }
}; };
} }
public App Weixin()
{
return new App
{
Name = "Weixin",
FileTargetInfos = new Dictionary<string, TargetInfo>
{
{
"Weixin.dll",
new TargetInfo
{
Name = "Weixin.dll",
RelativePath = "Weixin.dll",
StartVersion = "1.0.0.0"
}
}
},
FileCommonModifyInfos = new Dictionary<string, List<CommonModifyInfo>>
{
{
"Weixin.dll",
new List<CommonModifyInfo>
{
new CommonModifyInfo
{
Name="Weixin.dll",
StartVersion="4.0.0.0",
EndVersion="",
ReplacePatterns = new List<ReplacePattern>
{
new ReplacePattern
{
Search = ByteUtil.HexStringToByteArray("57 53 48 83 EC 20 48 89 CE 80 3D D1 F7 DC 05 00 75 21 48 B8"),
Replace = ByteUtil.HexStringToByteArray("57 53 48 83 EC 20 48 89 CE 80 3D D1 F7 DC 05 00 EB 21 48 B8"),
Category = "防撤回"
}
}
}
}
}
}
};
}
} }
} }

View File

@ -97,6 +97,7 @@
<None Include="Data\1.7\patch.json" /> <None Include="Data\1.7\patch.json" />
<None Include="Data\1.8\patch.json" /> <None Include="Data\1.8\patch.json" />
<None Include="Data\1.9\patch.json" /> <None Include="Data\1.9\patch.json" />
<None Include="Data\2.0\patch.json" />
<None Include="Properties\Settings.settings"> <None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator> <Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput> <LastGenOutput>Settings.Designer.cs</LastGenOutput>

View File

@ -64,6 +64,7 @@
this.panelNotice = new System.Windows.Forms.Panel(); this.panelNotice = new System.Windows.Forms.Panel();
this.labelNotice = new System.Windows.Forms.Label(); this.labelNotice = new System.Windows.Forms.Label();
this.rbtQQNT = new System.Windows.Forms.RadioButton(); this.rbtQQNT = new System.Windows.Forms.RadioButton();
this.rbtWeixin = new System.Windows.Forms.RadioButton();
this.menuStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout();
this.panelNotice.SuspendLayout(); this.panelNotice.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
@ -178,7 +179,6 @@
this.rbtWechat.Name = "rbtWechat"; this.rbtWechat.Name = "rbtWechat";
this.rbtWechat.Size = new System.Drawing.Size(47, 16); this.rbtWechat.Size = new System.Drawing.Size(47, 16);
this.rbtWechat.TabIndex = 12; this.rbtWechat.TabIndex = 12;
this.rbtWechat.TabStop = true;
this.rbtWechat.Text = "微信"; this.rbtWechat.Text = "微信";
this.rbtWechat.UseVisualStyleBackColor = true; this.rbtWechat.UseVisualStyleBackColor = true;
this.rbtWechat.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged); this.rbtWechat.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged);
@ -186,7 +186,7 @@
// rbtQQ // rbtQQ
// //
this.rbtQQ.AutoSize = true; this.rbtQQ.AutoSize = true;
this.rbtQQ.Location = new System.Drawing.Point(190, 36); this.rbtQQ.Location = new System.Drawing.Point(254, 36);
this.rbtQQ.Name = "rbtQQ"; this.rbtQQ.Name = "rbtQQ";
this.rbtQQ.Size = new System.Drawing.Size(35, 16); this.rbtQQ.Size = new System.Drawing.Size(35, 16);
this.rbtQQ.TabIndex = 13; this.rbtQQ.TabIndex = 13;
@ -197,7 +197,7 @@
// rbtTIM // rbtTIM
// //
this.rbtTIM.AutoSize = true; this.rbtTIM.AutoSize = true;
this.rbtTIM.Location = new System.Drawing.Point(236, 36); this.rbtTIM.Location = new System.Drawing.Point(300, 36);
this.rbtTIM.Name = "rbtTIM"; this.rbtTIM.Name = "rbtTIM";
this.rbtTIM.Size = new System.Drawing.Size(41, 16); this.rbtTIM.Size = new System.Drawing.Size(41, 16);
this.rbtTIM.TabIndex = 14; this.rbtTIM.TabIndex = 14;
@ -217,7 +217,7 @@
// rbtQQLite // rbtQQLite
// //
this.rbtQQLite.AutoSize = true; this.rbtQQLite.AutoSize = true;
this.rbtQQLite.Location = new System.Drawing.Point(285, 36); this.rbtQQLite.Location = new System.Drawing.Point(349, 36);
this.rbtQQLite.Name = "rbtQQLite"; this.rbtQQLite.Name = "rbtQQLite";
this.rbtQQLite.Size = new System.Drawing.Size(71, 16); this.rbtQQLite.Size = new System.Drawing.Size(71, 16);
this.rbtQQLite.TabIndex = 18; this.rbtQQLite.TabIndex = 18;
@ -376,7 +376,7 @@
// rbtQQNT // rbtQQNT
// //
this.rbtQQNT.AutoSize = true; this.rbtQQNT.AutoSize = true;
this.rbtQQNT.Location = new System.Drawing.Point(135, 36); this.rbtQQNT.Location = new System.Drawing.Point(199, 36);
this.rbtQQNT.Name = "rbtQQNT"; this.rbtQQNT.Name = "rbtQQNT";
this.rbtQQNT.Size = new System.Drawing.Size(47, 16); this.rbtQQNT.Size = new System.Drawing.Size(47, 16);
this.rbtQQNT.TabIndex = 24; this.rbtQQNT.TabIndex = 24;
@ -384,6 +384,17 @@
this.rbtQQNT.UseVisualStyleBackColor = true; this.rbtQQNT.UseVisualStyleBackColor = true;
this.rbtQQNT.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged); this.rbtQQNT.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged);
// //
// rbtWeixin
//
this.rbtWeixin.AutoSize = true;
this.rbtWeixin.Location = new System.Drawing.Point(134, 36);
this.rbtWeixin.Name = "rbtWeixin";
this.rbtWeixin.Size = new System.Drawing.Size(65, 16);
this.rbtWeixin.TabIndex = 25;
this.rbtWeixin.Text = "微信4.0";
this.rbtWeixin.UseVisualStyleBackColor = true;
this.rbtWeixin.CheckedChanged += new System.EventHandler(this.radioButtons_CheckedChanged);
//
// FormMain // FormMain
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
@ -409,6 +420,7 @@
this.Controls.Add(this.linkLabel1); this.Controls.Add(this.linkLabel1);
this.Controls.Add(this.label1); this.Controls.Add(this.label1);
this.Controls.Add(this.menuStrip1); this.Controls.Add(this.menuStrip1);
this.Controls.Add(this.rbtWeixin);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip1; this.MainMenuStrip = this.menuStrip1;
this.MinimumSize = new System.Drawing.Size(504, 144); this.MinimumSize = new System.Drawing.Size(504, 144);
@ -459,6 +471,7 @@
private System.Windows.Forms.Panel panelNotice; private System.Windows.Forms.Panel panelNotice;
private System.Windows.Forms.Label labelNotice; private System.Windows.Forms.Label labelNotice;
private System.Windows.Forms.RadioButton rbtQQNT; private System.Windows.Forms.RadioButton rbtQQNT;
private System.Windows.Forms.RadioButton rbtWeixin;
} }
} }

View File

@ -19,6 +19,7 @@ namespace RevokeMsgPatcher
private AppModifier modifier = null; private AppModifier modifier = null;
private WechatModifier wechatModifier = null; private WechatModifier wechatModifier = null;
private WeixinModifier weixinModifier = null;
private QQModifier qqModifier = null; private QQModifier qqModifier = null;
private TIMModifier timModifier = null; private TIMModifier timModifier = null;
private QQLiteModifier qqLiteModifier = null; private QQLiteModifier qqLiteModifier = null;
@ -42,12 +43,14 @@ namespace RevokeMsgPatcher
// 初始化每个应用对应的修改者 // 初始化每个应用对应的修改者
wechatModifier = new WechatModifier(bag.Apps["Wechat"]); wechatModifier = new WechatModifier(bag.Apps["Wechat"]);
weixinModifier = new WeixinModifier(bag.Apps["Weixin"]);
qqModifier = new QQModifier(bag.Apps["QQ"]); qqModifier = new QQModifier(bag.Apps["QQ"]);
timModifier = new TIMModifier(bag.Apps["TIM"]); timModifier = new TIMModifier(bag.Apps["TIM"]);
qqLiteModifier = new QQLiteModifier(bag.Apps["QQLite"]); qqLiteModifier = new QQLiteModifier(bag.Apps["QQLite"]);
qqntModifier = new QQNTModifier(bag.Apps["QQNT"]); qqntModifier = new QQNTModifier(bag.Apps["QQNT"]);
rbtWechat.Tag = wechatModifier; rbtWechat.Tag = wechatModifier;
rbtWeixin.Tag = weixinModifier;
rbtQQ.Tag = qqModifier; rbtQQ.Tag = qqModifier;
rbtTIM.Tag = timModifier; rbtTIM.Tag = timModifier;
rbtQQLite.Tag = qqLiteModifier; rbtQQLite.Tag = qqLiteModifier;
@ -347,6 +350,7 @@ namespace RevokeMsgPatcher
lblUpdatePachJson.ForeColor = Color.RoyalBlue; lblUpdatePachJson.ForeColor = Color.RoyalBlue;
wechatModifier.Config = newBag.Apps["Wechat"]; wechatModifier.Config = newBag.Apps["Wechat"];
weixinModifier.Config = newBag.Apps["Weixin"];
qqModifier.Config = newBag.Apps["QQ"]; qqModifier.Config = newBag.Apps["QQ"];
timModifier.Config = newBag.Apps["TIM"]; timModifier.Config = newBag.Apps["TIM"];
qqLiteModifier.Config = newBag.Apps["QQLite"]; qqLiteModifier.Config = newBag.Apps["QQLite"];
@ -384,6 +388,7 @@ namespace RevokeMsgPatcher
tips += "支持以下版本" + Environment.NewLine; tips += "支持以下版本" + Environment.NewLine;
tips += " ➯ 微信:" + wechatModifier.Config.GetSupportVersionStr() + Environment.NewLine; tips += " ➯ 微信:" + wechatModifier.Config.GetSupportVersionStr() + Environment.NewLine;
tips += " ➯ 微信4.0" + weixinModifier.Config.GetSupportVersionStr() + Environment.NewLine;
tips += " ➯ QQNT" + qqntModifier.Config.GetSupportVersionStr() + Environment.NewLine; tips += " ➯ QQNT" + qqntModifier.Config.GetSupportVersionStr() + Environment.NewLine;
tips += " ➯ QQ" + qqModifier.Config.GetSupportVersionStr() + Environment.NewLine; tips += " ➯ QQ" + qqModifier.Config.GetSupportVersionStr() + Environment.NewLine;
tips += " ➯ QQ轻聊版" + qqLiteModifier.Config.GetSupportVersionStr() + Environment.NewLine; tips += " ➯ QQ轻聊版" + qqLiteModifier.Config.GetSupportVersionStr() + Environment.NewLine;
@ -411,6 +416,10 @@ namespace RevokeMsgPatcher
{ {
modifier = (WechatModifier)rbtWechat.Tag; modifier = (WechatModifier)rbtWechat.Tag;
} }
else if (rbtWeixin.Checked)
{
modifier = (WeixinModifier)rbtWeixin.Tag;
}
else if (rbtQQ.Checked) else if (rbtQQ.Checked)
{ {
modifier = (QQModifier)rbtQQ.Tag; modifier = (QQModifier)rbtQQ.Tag;

View File

@ -34,7 +34,7 @@ namespace RevokeMsgPatcher.Modifier
string realPath = GetRealInstallPath(installPath); string realPath = GetRealInstallPath(installPath);
if (string.IsNullOrEmpty(realPath)) if (string.IsNullOrEmpty(realPath))
{ {
List<string> defaultPathList = PathUtil.GetDefaultInstallPaths(@"Tencent\QQ"); List<string> defaultPathList = PathUtil.GetDefaultInstallPaths(@"Tencent\Wechat");
foreach (string defaultPath in defaultPathList) foreach (string defaultPath in defaultPathList)
{ {
realPath = GetRealInstallPath(defaultPath); realPath = GetRealInstallPath(defaultPath);

View File

@ -0,0 +1,122 @@
using RevokeMsgPatcher.Model;
using RevokeMsgPatcher.Utils;
using System;
using System.Collections.Generic;
using System.IO;
namespace RevokeMsgPatcher.Modifier
{
class WeixinModifier : AppModifier
{
public WeixinModifier(App config)
{
this.config = config;
}
public override void AfterPatchSuccess()
{
}
public override void AfterPatchFail()
{
}
/// <summary>
/// 自动寻找获取微信安装路径
/// </summary>
/// <returns></returns>
public override string FindInstallPath()
{
try
{
string installPath = PathUtil.FindInstallPathFromRegistryWOW6432Node("Weixin");
string realPath = null;
if (!string.IsNullOrEmpty(installPath))
{
installPath = Path.GetDirectoryName(installPath);
realPath = GetRealInstallPath(installPath);
}
if (string.IsNullOrEmpty(realPath))
{
List<string> defaultPathList = PathUtil.GetDefaultInstallPaths(@"Tencent\Weixin");
foreach (string defaultPath in defaultPathList)
{
realPath = GetRealInstallPath(defaultPath);
if (!string.IsNullOrEmpty(realPath))
{
return defaultPath;
}
}
}
else
{
return realPath;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return null;
}
/// <summary>
/// 微信目录结构
/// </summary>
/// <param name="basePath"></param>
/// <returns></returns>
private string GetRealInstallPath(string basePath)
{
if (basePath == null)
{
return null;
}
DirectoryInfo[] directories = new DirectoryInfo(basePath).GetDirectories();
PathUtil.SortByLastWriteTimeDesc(ref directories); // 按修改时间倒序
foreach (DirectoryInfo folder in directories)
{
if (IsAllFilesExist(folder.FullName))
{
return folder.FullName;
}
}
return null;
}
/// <summary>
/// 获取整个APP的当前版本
/// </summary>
/// <returns></returns>
public override string GetVersion()
{
if (editors != null && editors.Count > 0)
{
foreach (FileHexEditor editor in editors)
{
if (editor.FileName == "Weixin.dll")
{
return editor.FileVersion;
}
}
}
return "";
}
//public override bool ValidateAndInitialize(string installPath)
//{
// // 判断是否是安装路径
// if (!IsAllBinaryFilesExist(installPath))
// {
// return false;
// }
// // 初始化十六进制文件编辑器
// // 并寻找与之配对的版本修改信息
// InitEditors(installPath);
// return true;
//}
}
}

File diff suppressed because one or more lines are too long

View File

@ -99,6 +99,7 @@
<Compile Include="Modifier\QQNTModifier.cs" /> <Compile Include="Modifier\QQNTModifier.cs" />
<Compile Include="Modifier\QQModifier.cs" /> <Compile Include="Modifier\QQModifier.cs" />
<Compile Include="Modifier\TIMModifier.cs" /> <Compile Include="Modifier\TIMModifier.cs" />
<Compile Include="Modifier\WeixinModifier.cs" />
<Compile Include="Modifier\WechatModifier.cs" /> <Compile Include="Modifier\WechatModifier.cs" />
<Compile Include="Utils\ByteUtil.cs" /> <Compile Include="Utils\ByteUtil.cs" />
<Compile Include="Utils\Device.cs" /> <Compile Include="Utils\Device.cs" />

View File

@ -21,6 +21,7 @@ namespace RevokeMsgPatcher.Utils
Console.WriteLine(keyName + " , " + programKey.GetValue("DisplayName") + " , " + programKey.GetValue("InstallLocation")); Console.WriteLine(keyName + " , " + programKey.GetValue("DisplayName") + " , " + programKey.GetValue("InstallLocation"));
programKey.Close(); programKey.Close();
} }
uninstallKey.Close(); uninstallKey.Close();
} }
@ -43,6 +44,7 @@ namespace RevokeMsgPatcher.Utils
{ {
return null; return null;
} }
object installLocation = key.GetValue("InstallLocation"); object installLocation = key.GetValue("InstallLocation");
key.Close(); key.Close();
if (installLocation != null && !string.IsNullOrEmpty(installLocation.ToString())) if (installLocation != null && !string.IsNullOrEmpty(installLocation.ToString()))
@ -54,6 +56,7 @@ namespace RevokeMsgPatcher.Utils
{ {
Console.WriteLine(e.Message); Console.WriteLine(e.Message);
} }
return null; return null;
} }
@ -67,17 +70,19 @@ namespace RevokeMsgPatcher.Utils
{ {
return null; return null;
} }
object installLocation = key.GetValue("UninstallString"); object installLocation = key.GetValue("UninstallString");
key.Close(); key.Close();
if (installLocation != null && !string.IsNullOrEmpty(installLocation.ToString())) if (installLocation != null && !string.IsNullOrEmpty(installLocation.ToString()))
{ {
return installLocation.ToString(); return installLocation.ToString().Replace("\"","");
} }
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine(e.Message); Console.WriteLine(e.Message);
} }
return null; return null;
} }
@ -98,7 +103,16 @@ namespace RevokeMsgPatcher.Utils
{ {
list.Add(path); list.Add(path);
} }
else
{
path = Path.Combine(d, $@"Program Files\{relativePath}");
if (Directory.Exists(path))
{
list.Add(path);
} }
}
}
return list; return list;
} }
@ -108,8 +122,7 @@ namespace RevokeMsgPatcher.Utils
/// <param name="dirs"></param> /// <param name="dirs"></param>
public static void SortByLastWriteTimeDesc(ref DirectoryInfo[] dirs) public static void SortByLastWriteTimeDesc(ref DirectoryInfo[] dirs)
{ {
Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return y.LastWriteTime.CompareTo(x.LastWriteTime); }); Array.Sort(dirs, delegate(DirectoryInfo x, DirectoryInfo y) { return y.LastWriteTime.CompareTo(x.LastWriteTime); });
} }
} }
} }