.net wpf程序 移花接木

这篇具有很好参考价值的文章主要介绍了.net wpf程序 移花接木。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在研究C# .net桌面程序。非常有趣
软件是国外作者写的 公司要求修改翻译
从最初的开源变成闭源再到加壳. 一路让我这个小小的职员好蛋疼.
软件是VS2015 C# WPF 程序 在不脱壳的情况下 实现挂钩类托管函数 遍历WPF控件汉化

首先通过各种手段脱壳目标程序,哪怕是不能运行都没关系。只要找到程序main函数。,找到Main的命名空间,然后自己创建一个一样的WPF程序 和他的命名空间一样就可以
这里我的目标程序命名空间是 MainApp
.net wpf程序 移花接木,软件开发,.net,wpf

生成以后把文件后缀改成DLL
之后我们创建一个 C# winform 程序删除程序中默认的对话框 添加引用上面生成的文件
因为目标程序是WPF 程序 所以还得添加默认程序集
WindowsBase 和 PresentationFramework
下面开始写代码
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

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();

        }

    }

}



到了这里程序已经启动好了。把目标程序启动了以后 程序进程看见的就是自己的进程,
运行内容就是目标程序内容
然后根据反射调用和获取目标程序的函数和变量

这里需要注意的是有些.net壳会导致无法 Assembly.LoadFrom 失败,
但是你编写的程序是VS已经帮你加载到程序里面了。所以可以通过遍历获取到Assembly
目标程序包含的程序集也可以通过这个方式查找,然后根据Assembly获取对应类的函数
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//这里节省资源,我就把Assembly储存起来了

public static Assembly GetAssembly()

{

    if (m_MainAppAssembly == null)

    {

        foreach (Assembly ay in AppDomain.CurrentDomain.GetAssemblies())

        {

            if (ay.FullName.IndexOf("AppMain") > -1)

            {

                m_CatchemAssembly = ay;

                break;

            }

        }

    }

    return m_MainAppAssembly ;

}



获取到Assembly 基本上你可以控制整个程序的流程了
 


//根据Assembly得到MianApp.MainWindow类 然后在类里找到 GlobalValue 变量
Assembly amy = GetAssembly();
var GlobalValue = amy.GetType("MianApp.MainWindow").GetField("GlobalValue");
//得到变量内容,参数是对应的对象
GlobalValue.GetValue(null);
//设置变量内容
GlobalValue.SetValue(null, "GGGG");



剩下的就是挂钩了  当然建议你还是使用第三方的库
pMainApp.GetType().GetMethod("LoadComponent").MethodHandle.GetFunctionPointer();

这样就可以获取 LoadComponent 的函数地址, 如果你不知道目标类有什么函数的话可以通过
GetMethods 来获取到,记得查看参数BindingFlags 选项,这个选项可以影响到你获取的结果
如果函数名有相同的 需要自己定义参数类型获取,不然会抛异常

这里值得注意的是 GetFunctionPointer 函数不一定就能返回正确的结果,在加壳的程序里
你有可能获取的地址是错误的,因为程序没执行过这个函数。所以你可以选择等待程序调用过
这个函数你再去挂钩,或者自己手动调用一次,随便传入参数。捕获一下异常,然后再挂钩。

遍历WPF控件 获取到主窗口对象然后 VisualTreeHelper 这个类可以帮助你获取控件对象文章来源地址https://www.toymoban.com/news/detail-726210.html

到了这里,关于.net wpf程序 移花接木的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Inno Setup打包winform、wpf程序可判断VC++和.net环境

    官网链接: link 1、新建打包文件 2、填写 应用名称、版本号、公司名称、公司官网 3、选择安装路径 Custom是指定默认路径、Program Files folder是默认C盘根目录 4、选择程序启动exe文件 以及Addfolder选择全部运行文件 5、选择安装前显示文字 、安装中、安装后 这里我只选择了安装前

    2024年02月16日
    浏览(49)
  • 走进WPF之开发类似Visio软件

    当你想画一个流程图的时候,你会发现,很多软件要么需要秘钥,要么需要会员,这时我就在想,可不可自己制作一款流程图软件呢?本文以一个简单的小例子,简述如何利用WPF制作属于自己的流程图软件,仅供学习分享使用,如有不足之处,还请指正。 本示例主要通过WP

    2024年02月11日
    浏览(40)
  • Azure DevOps(一)基于 Net6.0 的 WPF 程序如何进行持续集成、持续编译

    我们是否正在为如何快速的编译、部署客户端应用程序而烦恼?这也是博主最近遇到的问题。目前博主所在公司主要做项目级的定制化开发,多以 C/S 架构的 WPF 程序为主,每次到了协助开发团队给实施团队编译好的要测试程序包时,就会出现多人协助,编译、打包好的二进制

    2023年04月19日
    浏览(43)
  • 桌面软件开发框架 Electron、Qt、WPF 和 WinForms 怎么选?

    Electron 是一个基于 Web 技术的跨平台桌面应用程序开发框架。它使用 HTML、CSS 和 JavaScript 来构建应用程序界面,并借助 Chromium 渲染引擎提供强大的页面渲染能力。Electron 的主要特点包括: 跨平台:Electron 可以在 Windows、macOS 和 Linux 等多个主流操作系统上运行,为开发者提供了

    2024年02月12日
    浏览(46)
  • .net 软件开发模式——三层架构

    三层架构是一种常用的软件开发架构模式,它将应用程序分为三个层次: 表示层、业务逻辑层和数据访问层 。每一层都有明确的职责和功能,分别负责用户交互、业务处理和数据存储等任务。这种架构模式的优点包括易于维护和扩展、更好的组织结构和代码重用性、更高的

    2024年02月10日
    浏览(52)
  • 一个.Net Core开发的开源动态壁纸软件

    推荐一个Github上Start超过10.8K的超火、好用、强大的、内置很多优美的动态壁纸软件。 这是基于.Net Core+WPF开发的、开源的动态壁纸软件,壁纸设置支持任何文件形式,包括:本地视频、网络视频、图片、Html、网络、Unity单机游戏、Godot游戏等;还支持自定义壁纸的属性,自定

    2024年02月05日
    浏览(45)
  • 【WPF.NET开发】WPF中的拖放

    WPF 中的拖放支持 数据传输 拖放事件 实现拖放 拖放示例 本主题概述 Windows Presentation Foundation (WPF) 应用程序中的拖放支持。 拖放通常指一种数据传输方法:使用鼠标(或一些其他指针设备)选择一个或多个对象,将其拖至用户界面 (UI) 中的某些所需拖放目标之上并放置。 拖

    2024年01月21日
    浏览(34)
  • 【WPF.NET开发】WPF中的窗口

    目录 1、窗口类 2、实现窗口 2.1 为 MSBuild 配置窗口 3、窗口生存期 3.1 打开窗口 3.2 窗口激活 3.3 关闭窗口 3.4 窗口生存期事件 4、窗口位置 4.1 最顶层窗口和 z 顺序 5、窗口大小 6、大小调整属性的优先级顺序 7、窗口状态 8、窗口外观 8.1 重设大小模式 8.2 Window style 8.3 任务栏显示

    2024年02月04日
    浏览(42)
  • 【WPF.NET开发】WPF中的文档

    文档类型 文档控件和文本布局 文档打包 XPS 文档 Windows Presentation Foundation (WPF) 提供丰富的文档功能,可创建旨在比前几代 Windows 更易于访问和读取的高保真内容文档。 除增强功能和质量外,WPF 还对文档显示、打包和安全性能提供集成服务。 本主题介绍 WPF 文档类型和文档打

    2024年01月17日
    浏览(44)
  • 【WPF.NET开发】WPF中的版式

    改进的文本质量和性能 丰富的版式 增强的国际文本支持 增强的字体支持 新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。

    2024年02月01日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包