msmvc 发表于 2024-7-4 23:34

某源代码转WORD工具hook破解

本帖最后由 msmvc 于 2024-7-5 10:42 编辑

原贴在这里
某源代码转WORD工具破解免注册分析
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1938766&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline&page=1


2024/07/05
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的方法





具体hook方法
1.创建hook方法的类库工程,一个dll
代码:
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;
                }
      }

      
      public class MyHookClass
      {

               
                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进程注入
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成功后要等一会就能看到效果






redapple2015 发表于 2024-7-5 08:58

本帖最后由 redapple2015 于 2024-7-5 08:59 编辑

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

msmvc 发表于 2024-7-4 23:36

本帖最后由 msmvc 于 2024-7-5 17:56 编辑

已解决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,等一会即可看到效果



HookS2D.cs
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;
                }
      }
}

Source2DocLoader:
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");
                }
      }
}

我的工程:

lml0126 发表于 2024-7-5 07:56

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

LuckyClover 发表于 2024-7-5 08:19

厉害的,感谢分享

XXTK 发表于 2024-7-5 08:55

留下慢慢研究

msmvc 发表于 2024-7-5 09:21

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

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

redapple2015 发表于 2024-7-5 09:23

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

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

msmvc 发表于 2024-7-5 09:25

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

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

redapple2015 发表于 2024-7-5 09:28

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

最近看C++,平时写的很少。C++还是很基础的。
页: [1] 2 3 4 5 6 7
查看完整版本: 某源代码转WORD工具hook破解