某源代码转WORD工具hook破解

查看 101|回复 9
作者:msmvc   
原贴在这里
某源代码转WORD工具破解免注册分析
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1938766&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline&page=1
[color=]2024/07/05
[color=]1楼更新了代码,可以直接hook原来的exe
这里使用Lib.Harmony进行hook,以下内容是在脱壳后hook的
根据原贴的分析,需要hook三处:一个方法和两个静态字段
1. XASuMaoUtils.ValidReg.onlineValid(),这里要hook后返回true
2.Source2Doc.RegState.expiredTime,设置为2099/12/31
3.Source2Doc.RegState.AlreadyReg,设置为1(即枚举值 SoftwareState.Valid,值为1)
注意:这里有访问修饰符的问题,为了验证能hook成功,我用dnspy先把访问修饰符先给改成了public
左边是我修正过的,右边是原来的,暂时还没找到hook interanl class的方法



onlinevalid.png (47.97 KB, 下载次数: 0)
下载附件
2024-7-4 22:55 上传




onlinevalid1.png (52.82 KB, 下载次数: 0)
下载附件
2024-7-4 23:04 上传



regstate.png (45.24 KB, 下载次数: 0)
下载附件
2024-7-4 22:55 上传




regstate1.png (45.6 KB, 下载次数: 0)
下载附件
2024-7-4 23:04 上传

具体hook方法
1.创建hook方法的类库工程,一个dll
代码:
[C#] 纯文本查看 复制代码namespace Source2DocInject
{
        public class HookS2D
        {
                public static int Inject(string str)
                {
                        MessageBox.Show("Inject Start");
                        var harmony = new Harmony("a.b.c");
                        harmony.PatchAll();
                        MessageBox.Show("Inject Ok");
                        return 0;
                }
        }
        [HarmonyPatch(typeof(XASuMaoUtils.ValidReg), "onlineValid")]
        public class MyHookClass
        {
                [HarmonyPrefix]
                private static bool Prefix(ref bool __result)
                {
                        // onlineValid() method return ture;
                        __result = true;
//特别说明:以下两行代码花了我5天的业余时间才hook成,
                        PatchStaticField(typeof(Source2Doc.RegState), "expiredTime", Convert.ToDateTime("2099/12/31"));
                        PatchStaticField(typeof(Source2Doc.RegState), "AlreadyReg", 1);
                        return false;
                }
                public static void PatchStaticField(Type classType, string fieldName, object newValue)
                {
                        FieldInfo fieldInfo = classType.GetField(fieldName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
                        if (fieldInfo != null)
                        {
                                fieldInfo.SetValue(null, newValue); // 设置新值
                        }
                        else
                        {
                                throw new ArgumentException("Field not found", fieldName);
                        }
                }
        }
}
2.创建loader工程,用于启动原始exe以及注入hook dll到exe的进程中
工程通过nuget安装 HoLLy.ManagedInjector,用于.net进程注入
[C#] 纯文本查看 复制代码Process process = new Process();
                        process.StartInfo.FileName = "Source2Doc.exe";  // 可执行文件的路径
                        process.StartInfo.WorkingDirectory = @"."; // 可选,设置工作目录
                        process.Start();
                        Thread.Sleep(2000);
                        string pathFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Source2DocInject.dll");
                        var p = new InjectableProcess(Convert.ToUInt32(process.Id));
                        p.Inject(pathFile, "Source2DocInject.HookS2D", "Inject");
最后上个成功能图,Hook成功后要等一会就能看到效果


スクリーンショット 2024-07-05 003008.png (52.04 KB, 下载次数: 0)
下载附件
2024-7-4 23:30 上传



スクリーンショット 2024-07-05 003137.png (34.58 KB, 下载次数: 0)
下载附件
2024-7-4 23:32 上传

下载次数, 下载附件

redapple2015   

到现在为止还没研究明白hook。我现在有个问题,把dll注入文件中,能不能把dll写在exe资源里面,具体没搞明白。
msmvc
OP
  

已解决hook internal class的问题
使用从 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1938766&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline&page=1
下载的原文件,即可hook成功
HookS2D编译成的dll, 要hook的exe(没有脱壳也没有修改过的exe),和Source2DocLoader.exe放在同一文件夹,启动Source2DocLoader.exe,等一会即可看到效果
[color=]HookS2D.cs
[C#] 纯文本查看 复制代码namespace Source2DocHooks
{
        public class HookS2D
        {
                public static int Inject(string str)
                {
                        var harmony = new Harmony("a.b.c");
                        var asm = Assembly.LoadFrom("Source2Doc.exe");
                        var types = asm.GetTypes();
                        var type = types.FirstOrDefault(x => x.Name == "ValidReg");
                        MethodInfo privateMethod = type.GetMethod("onlineValid", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                        var original = privateMethod;
                        var prefix = typeof(HookS2D).GetMethod("onlineValid_prefix", BindingFlags.Static | BindingFlags.NonPublic);
                        harmony.Patch(original, prefix: new HarmonyLib.HarmonyMethod(prefix));
                        var type2 = types.FirstOrDefault(x => x.Name == "RegState");
                        FieldInfo fieldInfo1 = type2.GetField("expiredTime", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
                        fieldInfo1.SetValue(null, Convert.ToDateTime("2099/12/31"));
                        FieldInfo fieldInfo2 = type2.GetField("AlreadyReg", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
                        fieldInfo2.SetValue(null, 1);
                        MessageBox.Show("Inject Ok");
                        return 0;
                }
                private static bool onlineValid_prefix(ref bool __result)
                {
                        __result = true;
                        return false;
                }
        }
}
[color=]Source2DocLoader:

[C#] 纯文本查看 复制代码namespace Source2DocLoader
{
        class Program
        {
                static void Main(string[] args)
                {
                        Process process = new Process();
                        process.StartInfo.FileName = "Source2Doc.exe";
                        process.StartInfo.WorkingDirectory = @".";
                        process.Start();
                        Thread.Sleep(2000);
                        string pathFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Source2DocHooks.dll");
                        var p = new InjectableProcess(Convert.ToUInt32(process.Id));
                        p.Inject(pathFile, "Source2DocHooks.HookS2D", "Inject");
                }
        }
}
我的工程:

hooks.7z
(1.63 MB, 下载次数: 8)
2024-7-5 17:56 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB

lml0126   

HoLLy.ManagedInjector之类的库还有哪些能支持x64
LuckyClover   

厉害的,感谢分享
XXTK   

留下慢慢研究
msmvc
OP
  


redapple2015 发表于 2024-7-5 08:58
到现在为止还没研究明白hook。我现在有个问题,把dll注入文件中,能不能把dll写在exe资源里面,具体没搞明 ...

我觉得应该是可以的,具体整个sample,然后一点一点的尝试,
先有目标,再找解决方法
redapple2015   


msmvc 发表于 2024-7-5 09:21
我觉得应该是可以的,具体整个sample,然后一点一点的尝试,
先有目标,再找解决方法

谢谢了,还在学习的很多。
msmvc
OP
  


redapple2015 发表于 2024-7-5 09:23
谢谢了,还在学习的很多。

如果使用.net,建议系统的学习一下,
redapple2015   


msmvc 发表于 2024-7-5 09:25
如果使用.net,建议系统的学习一下,

最近看C++,平时写的很少。C++还是很基础的。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部