某源代码转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:59 编辑
到现在为止还没研究明白hook。我现在有个问题,把dll注入文件中,能不能把dll写在exe资源里面,具体没搞明白。 本帖最后由 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");
}
}
}
我的工程: HoLLy.ManagedInjector之类的库还有哪些能支持x64 厉害的,感谢分享 留下慢慢研究 redapple2015 发表于 2024-7-5 08:58
到现在为止还没研究明白hook。我现在有个问题,把dll注入文件中,能不能把dll写在exe资源里面,具体没搞明 ...
我觉得应该是可以的,具体整个sample,然后一点一点的尝试,
先有目标,再找解决方法 msmvc 发表于 2024-7-5 09:21
我觉得应该是可以的,具体整个sample,然后一点一点的尝试,
先有目标,再找解决方法
谢谢了,还在学习的很多。 redapple2015 发表于 2024-7-5 09:23
谢谢了,还在学习的很多。
如果使用.net,建议系统的学习一下, msmvc 发表于 2024-7-5 09:25
如果使用.net,建议系统的学习一下,
最近看C++,平时写的很少。C++还是很基础的。