首页
社区
课程
招聘
[原创]给.net程序打内存补丁(1)
发表于: 2006-8-23 22:37 18775

[原创]给.net程序打内存补丁(1)

2006-8-23 22:37
18775

给.net程序打内存补丁(1)
by:tankaiha[NE365]
2006.8.23
any problem: visit http://vxer.cn

    内存补丁在破解中的作用不多说了,Win32平台下的内存补丁技术大家也都很熟悉,这里主要讲.Net平台下可执行程序的内存补丁。换一个说法,叫动态地改变正在执行的.Net可执行程序的指令(或数据)。传统的技术在.Net下不能用了吗?也不是,但是给JIT即时编译MSIL代码生成的asm代码打补丁,难度有点大。我们需要的,是直接在MSIL的基础上进行修改。此技术我也在学习中,学一点写一点,有错误请大家指正。

    前置知识及参考文献(文献都可在google中搜到,MSDN中还有很多相关文档):
1、MSIL基本知识

2、Rewrite MSIL Code on the Fly with the .NET Framework Profiling API (Aleksandr Mikunov)
3、Modifying IL at runtime (Julien Couvreur's)
4、The .NET Profiling API and the DNProfiler Tool (Matt Pietrek)
5、.Net FrameWork SDK中的相关文档
    如果有可能,在阅读本文之前先阅读上面的文献,这样会轻松一些。

一、.Net Profiling API
    什么是.Net Profiling API,从字面上看就是这种API可以提供.Net运行情况的概况。而实际情况是它提供的功能远远不只如此,动态修改MSIL代码就是用的这些API。如果你已经看了上面的参考文献,应该已经知道它是干吗的。
    通俗的说,Profiling API是.Net平台提供的底层接口之一(还有Debug和Metadata相关的,待续),通过该接口提供的方法,我们可以得到(及控制)以下过程的相关信息:
Application的开始/结束
Assembly的载入/卸载
Methods的开始/结束
Module的载入/卸载
Class的类的载入/卸载
线程
与COM接口的互操作
托管/非托管代码的即时编译
等等……
    基本上.Net的核心操作都可以通过Profiling API来得到信息。

二、使用Profiling API
    这里结合一个例子说,因为该接口太复杂,不可能一下学完全部的功能。我们结合这篇文章(在 .NET Framework 2.0 中,没有任何代码能够逃避 Profiling API 的分析)中的例子,在其基础上修改,加入我们需要的功能。修改的方法应用了参考文献2的方法。
    先去网上搜索上面的文章,把它的附件下来,解压。有四个目录,我们关心的就是Profiler目录中的文件。
    Profiling API是通过编译成dll文件,注册为系统的com服务而实现的。(对com我不熟悉,不多说),因此,你见到的profiler的例子通常都是三个文件:ProfilerCallback.h,ProfilerCallback.cpp,Profiler.cpp。前两个是实现Profiler的核心功能代码,最后一个只是实现了dll的基本构架。我们需要的就是在ProfilerCallback.cpp添加代码实现功能。
    首先找到CProfilerCallback::JITCompilationStarted,顾名思义,当JIT引擎开始编译MSIL代码的时候,会执行这里的代码。CProfilerCallback是什么?看一下定义:
class CProfilerCallback : public ICorProfilerCallback2
它就是作者实现的类,继承自.Net的核心接口ICorProfilerCallback2。这里的2应该代表是针对.Net 2.0的。(我试过,.net v1.1和v2.0下分别生成的Profiler,对不同版本的执行程序有时存在兼容性问题。)ICorProfilerCallback2接口很复杂,但琐碎的工作都由作者做好了,我们只是使用现成的类。

三、修改的目标
    目标程序是一个简单的程序,如图:

代码如下(在VS2005中编译,运行于.Net FrameWork 2.0):

namespace tmp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(textBox1.Text!="tankaiha")
            {
                MessageBox.Show("Wrong!");
            }
            else
            {
                MessageBox.Show("You get it");
            }
        }
    }
}
	GetFullMethodName (functionId, wszMethod, NAME_BUFFER_SIZE);
	if (lstrcmpW(wszMethod,wszTarget)!=0)
	{
		goto exit;
	}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
牛x。支持hmx
2006-8-23 22:43
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
3

支持的说,感谢如此好文!
2006-8-24 09:58
0
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
tankaiha对.net很有研究,期待续篇
2006-8-24 11:21
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
5
.NET完全不懂啊~~
2006-8-24 15:58
0
雪    币: 222
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
好文章,顶上去
2006-8-24 23:57
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
拜读过LZ好几篇.NET相关的文章了,都很有新意,强
2006-8-25 00:54
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
8
不懂.NET,先收藏,以后慢慢学习
2006-8-25 15:25
0
雪    币: 690
活跃值: (1826)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
学习
2006-8-25 17:02
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好好学习.天天向上,看不懂,我来顶。
2006-8-25 21:18
0
雪    币: 97697
活跃值: (200834)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
sustain.
2006-8-25 21:20
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
最初由 kanxue 发布
tankaiha对.net很有研究,期待续篇


看到国内的.Net技术文章和研究大部分还处于02和03年左右甚至以前英文论文的翻版,心里
很不是滋味。但是没办法,我们不可能一口吃个胖子,还要一步一步来。

其实,国内很多优秀的程序员都能很好地读英文资料,可惜没人有时间用心将手头的大堆资
料译成中文的供大家研究。

语言的差别很可怕,大家有空了尽量多学学英文,学好它,才能赶上它、打败它,外国其
实也有很多人拼命学习中国的东西。
2006-8-27 23:18
0
雪    币: 5275
活跃值: (456)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
13
楼上说的是啊,最近刚开始看到这些文章,而且在1篇里已经将参考的几个文章列出了。
但是.net的研究始终人不多,就算研究的好的也是资料无共享,毕竟人家的成果已经商业化了。
2006-8-28 09:44
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
.Net Profiling API比较难学懂,我是否能向你们请教.
.Net Profiling API能动态修改运行中的.NET程序么?即IL托管代码内存补丁.
Thanks
2009-1-13 23:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好象演示的文件都是在命令行模式下运行的,profile.dll 似乎不能监视我的.net windows XP程序的事件,而且没有output.log文件产生,请问大鸟们,profile.dll如何记录非控制台.net的事件.
感谢
2009-1-17 14:51
0
雪    币: 149
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
收藏下,慢慢学习; 也希望和大家一起交流
2009-2-8 18:17
0
游客
登录 | 注册 方可回帖
返回
//