-
-
[原创].net wpf程序 移花接木
-
发表于:
2016-9-11 20:27
9026
-
最近在研究C# .net桌面程序。非常有趣
软件是国外作者写的 公司要求修改翻译
从最初的开源变成闭源再到加壳. 一路让我这个小小的职员好蛋疼.
软件是VS2015 C# WPF 程序 在不脱壳的情况下 实现挂钩类托管函数 遍历WPF控件汉化
首先通过各种手段脱壳目标程序,哪怕是不能运行都没关系。只要找到程序main函数。,找到Main的命名空间,然后自己创建一个一样的WPF程序 和他的命名空间一样就可以
这里我的目标程序命名空间是 MainApp
生成以后把文件后缀改成DLL
之后我们创建一个 C# winform 程序删除程序中默认的对话框 添加引用上面生成的文件
因为目标程序是WPF 程序 所以还得添加默认程序集
WindowsBase 和 PresentationFramework
下面开始写代码
using HookDetour;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Load
{
//这里是一个开源的hook库 根据名字自己google
class hookClass : IMethodMonitor
{
[MethodImpl(MethodImplOptions.NoInlining)]
[Monitor("System.Windows", "Application")] //目标方法的名称空间,类名
public static void LoadComponent(Uri resourceLocator,bool b)
{
Console.WriteLine(resourceLocator);
//mainwindow.baml
var uri = new System.Uri(@"pack://application:,,,/MainApp;component/MainWindow.xaml");
old_LoadComponent(uri, b);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Original] //原函数标记
public static void old_LoadComponent(Uri resourceLocator, bool b)
{
Console.WriteLine("null");
}
}
static class Program
{
static MainApp.App pMainApp;
private static void AppRun(object sender, object args)
{
//在这里开始干坏事
Console.WriteLine("程序已经启动");
}
[STAThread]
static void Main()
{
//建立目标程序导出的类 储存起来,方便找对应方法和变量
pMainApp = new MainApp.App();
//需要程序托管之类的操作需要初始化以后才能干,这里监听 Startup
pMainApp.Startup += new System.Windows.StartupEventHandler(AppRun);
//部分.net 程序查找不到自身目录资源,需要HOOK添加空间名
//这个HOOK 不一定需要,有些程序加壳以后会自行修复这个问题,
//hook LoadComponent 这个函数
hookClass hk = new hookClass();
var hookfun = hk.GetType().GetMethod("LoadComponent");
var hookori = hk.GetType().GetMethod("old_LoadComponent");
//通过 MainApp.App 得到父类 ,根据父类查找 LoadComponent函数
MethodInfo LoadComponentFunction = pMainApp.GetType().BaseType.GetMethod("LoadComponent", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, System.Type.DefaultBinder, new Type[] { typeof(Uri),typeof(bool) },null);
IDetour engine = DetourFactory.CreateDetourEngine();
engine.Patch(LoadComponentFunction, hookfun, hookori);
pMainApp.InitializeComponent();
pMainApp.Run();
}
}
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-9-15 10:12
被kanxue编辑
,原因: