吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3859|回复: 60
收起左侧

[.NET逆向] 某源代码转WORD工具hook破解

  [复制链接]
msmvc 发表于 2024-7-4 23:34
本帖最后由 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的方法

onlinevalid.png onlinevalid1.png

regstate.png regstate1.png

具体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

スクリーンショット 2024-07-05 003137.png



免费评分

参与人数 15威望 +1 吾爱币 +34 热心值 +14 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
zhuoyue123 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Rjt88 + 1 + 1 谢谢@Thanks!
iwolf + 1 + 1 用心讨论,共获提升!
bbonplus + 1 + 1 热心回复!
唐小样儿 + 1 + 1 我很赞同!
wanfon + 1 + 1 热心回复!
JUNWO999 + 1 + 1 用心讨论,共获提升!
为之奈何? + 1 + 1 我很赞同!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Issacclark1 + 1 谢谢@Thanks!
rookie12138 + 1 + 1 热心回复!
3yu3 + 1 + 1 用心讨论,共获提升!
XXTK + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
[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;
                }
        }
}


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, 下载次数: 70)

免费评分

参与人数 1热心值 +1 收起 理由
Wcneg + 1 用心讨论,共获提升!

查看全部评分

lml0126 发表于 2024-7-5 07:56
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++还是很基础的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 20:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表