.net wpf程序 移花接木

news2025/2/24 7:04:42

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

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

生成以后把文件后缀改成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 这个类可以帮助你获取控件对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建 Hadoop 生态集群大数据监控告警平台

目录 一、部署 prometheus 环境 1.1 下载安装包 1.2 解压安装 1.3 修改配置文件 1.3.1 hadoop-env.sh 1.3.2 prometheus_config.yml 1.3.3 zkServer.sh 1.3.4 prometheus_zookeeper.yaml 1.3.5 alertmanager.yml 1.3.6 prometheus.yml 1.3.7 config.yml 1.3.8 t…

群峰系统是什么,群峰系统源码,群峰系统2.0

群峰体系是什么?它与第三方的团购软件有何不同? 近来有不少做生活团购服务商,餐饮商家,团购合作伙伴的朋友,时常听到群丰体系,了解到这是一个官方平台。其实,群峰系统已经成为了群峰的一大助力&…

鲲山科技:引入和鲸 ModelWhale,实现量化策略的高效迭代

量化投资是数据科学在金融行业的应用。 2023 年,量化行业的超额收益开始收敛,量化私募如何形成自身核心竞争力? 和鲸拜访客户鲲山科技(深圳),揭示其“弯道超车”的独家秘诀。 群体作战 年初至今&#xff…

【备忘录】小技巧,使用IDEA的模板功能快速开发新项目

很多时候我们为了测试某个功能,经常需要创建新的项目,使用spring.io或者阿里的start创建很方便,但是步骤还是相对繁琐的,IDEA提供了一个非常好用且强大的模板功能,让我们能快速创建项目 一、项目模板操作 IDEA版本202…

flutter 开发中的问题与技巧

一、概述 刚开始上手 flutter 开发的时候,总会遇到这样那样的小问题,而官方文档又没有明确说明不能这样使用,本文总结了一些开发中经常会遇到的一些问题和一些开发小技巧。 二、常见问题 1、Expanded 组件只能在 Row、Column、Flex 中使用 C…

修改http_charfinder.py使能在python311环境中运行

需要修改两个函数&#xff0c;第一个是init函数&#xff0c;修改如下&#xff1a; async def init(loop, address, port): # <1> # app web.Application(looploop) # <2> # app.router.add_route(GET, /, home) # <3> app web.Application(…

AVPro Movie Capture☀️三、Unity录屏:录制摄像机指定区域

文章目录 🟥 录屏效果展示🟨 插件使用方法1️⃣ 导入插件2️⃣ 测试3️⃣ 移植到你的项目🟥 录屏效果展示 本插件是博主基于 “AVPro Movie Capture” 自制插件,该插件实现了: 录制摄像机指定区域画面的功能只有开始录制和停止录制两个API,简单不复杂其余功能完全基于…

【交付高质量,用户高增长】-用户增长质量保证方法论 | 京东云技术团队

前言 俗话说&#xff0c;“测试是质量的守护者”&#xff0c;但单凭测试本身却远远不够。大多数情况下&#xff0c;测试像“一面镜子”&#xff0c;照出系统的面貌&#xff0c;给开发者提供修改代码的依据&#xff0c;这个“照镜子”的过程&#xff0c;就是质量评估的过程&…

架构案例2017(五十二)

第5题 阅读以下关于Web系统架构设计的叙述&#xff0c;在答题纸上回答问题1至问题3.【说明】某电子商务企业因发展良好&#xff0c;客户量逐步增大&#xff0c;企业业务不断扩充&#xff0c;导致其原有的B2C商品交易平台己不能满足现有业务需求。因此&#xff0c;该企业委托某…

Bootstrap-媒体类型

加上媒体查询之后&#xff0c;只有在特定的设备之下才能起作用&#xff01;&#xff01;&#xff01;

【JWT】解密JWT:让您的Web应用程序更安全、更高效的神秘令牌

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于JWTElementUI的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.JWT是什么 JWT工作原理 JWT验证…

使用 flex 弹性盒保持容器均分布局

使用 flex 弹性盒保持容器均分布局 css 代码 .container {display: flex;width: 100%;height: 100vh; }.part {flex-grow: 1; /* 设置这个值就可以实现均匀分布&#xff0c;但是里面有内容会自动撑开 */flex-basis: 0; /* 为了防止自动撑开&#xff0c;设置基础值为 0 */ }如…

日常中msvcr120.dll丢失怎样修复?总结5个msvcr120.dll丢失的修复教程

在我日常的计算机维护工作中&#xff0c;经常遇到一些用户报告他们在运行某些程序时遇到了“MSVCR120.dll丢失”的问题。这是一个常见的DLL文件丢失或损坏问题&#xff0c;可能会对用户的计算机操作造成不便。在这篇心得体会中&#xff0c;我将分享一些关于这个问题的场景以及如…

JS截取url上面的参数

手动截取封装 function getUrlParams(url location.href) {let urlStr url.split(?)[1] || let obj {};let paramsArr urlStr.split(&)for (let i 0, len paramsArr.length; i < len; i) {const num paramsArr[i].indexOf()let arr [paramsArr[i].substring(0,…

vue监听watch或mutations

/mutations vue监听watch watch监听的属性的方法可以有两个值&#xff0c;一个新值&#xff0c;一个旧值 方法1: watch:{myVlaue:function(val,oldVal){}}方法2: //深度监听 watch:{pageSizeSel:{deep:true,handler:function () {this.pageCode1;this.getData();}},}当姓或…

这8款浏览器兼容性测试工具,用了以后测试效率可以“起飞”~~

浏览器的兼容性问题&#xff0c;是指不同浏览器使用内核及所支持的 HTML 等网页语言标准不同&#xff0c;用户客户端的环境不同造成的显示效果不能达到理想效果。 对于用户而言&#xff0c;无论使用哪款浏览器&#xff0c;期望看到的效果是正常的统一的。 市面上发布的浏览器…

【广州华锐互动】利用VR开展细胞基础实验教学有什么好处?

在科技发展的驱动下&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已被广泛应用于各个领域&#xff0c;包括教育和医学。尤其是在医学教育中&#xff0c;VR技术已成为一种革新传统教学模式的有效工具。本文将探讨使用VR进行细胞基础实验教学的优势。 首先&#xff0c;VR技…

java中将金币格式化千分符和保留两位小数

public static String formatAmount(String amountStr) {try {// 将字符串金额解析为双精度类型double amount Double.parseDouble(amountStr);System.out.println("格式化之前: " amount);// 创建一个格式化器&#xff0c;设置千分位分隔符和保留两位小数NumberFo…

Diffusion Model论文/DALL E 2

B站视频学习记录 Ho J, Jain A, Abbeel P. Denoising diffusion probabilistic models[J]. Advances in neural information processing systems, 2020, 33: 6840-6851. Atwood J, Towsley D. Diffusion-convolutional neural networks[J]. Advances in neural information pro…

Python入门基础知识新手必备(赶紧收藏)

01 基本的类 python最基础、最常用的类主要有int整形&#xff0c;float浮点型&#xff0c;str字符串&#xff0c;list列表&#xff0c;dict字典&#xff0c;set集合&#xff0c;tuple元组等等。int整形、float浮点型一般用于给变量赋值&#xff0c;tuple元组属于不可变对象&am…