首页
社区
课程
招聘
[原创].net wpf程序 移花接木
发表于: 2016-9-11 20:27 9026

[原创].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编辑 ,原因:
收藏
免费 8
支持
分享
最新回复 (10)
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Good job,
2016-9-11 22:17
0
雪    币: 783
活跃值: (1121)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
3
这个思路很牛逼啊...我都没想到.
2016-9-12 04:02
0
雪    币: 213
活跃值: (267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
屌还是屌的,可是主窗口要不是 MainWindos.xaml呢,还有一些Field是怎么知道的呢?
2016-9-12 08:24
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
.net hook还是第一次见识,以前只是听说过。
2016-9-12 10:13
0
雪    币: 9034
活跃值: (6255)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
LoadComponent hook这个函数可以看到程序加载的是哪个xam 自己输出一下就好了
GetFields 可以获取到对象的所有变量
2016-9-12 13:06
0
雪    币: 783
活跃值: (1121)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
7
师傅请务必收我为徒.....
2016-9-12 13:48
0
雪    币: 122
活跃值: (117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这里的 MainApp 是不是,相当于目标程序了,还是说目标程序要另外 Assembly.LoadFrom
2021-4-4 21:53
0
雪    币: 9034
活跃值: (6255)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
Mradxz 这里的 MainApp 是不是,相当于目标程序了,还是说目标程序要另外 Assembly.LoadFrom[em_4]
目標程序不用加載,已經在引用中添加了
2021-4-5 01:43
0
雪    币: 122
活跃值: (117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

  

最后于 2021-4-8 15:56 被Mradxz编辑 ,原因:
2021-4-6 13:46
0
雪    币: 6270
活跃值: (3335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
挂钩函数那一步,貌似静态方法没问题,如果挂的是类的非静态方法就有问题了,实例调用这个方法的时候会进入hook,但是hook结束后无法返回原来地方了吧。
我hook库用的是IL层的,不知道大佬是不是直接hook的编译好的asm代码,请指点下
2022-3-3 23:22
0
游客
登录 | 注册 方可回帖
返回
//