首页
社区
课程
招聘
7
[原创]Cecil学习笔记(1)
发表于: 2008-9-23 00:14 18591

[原创]Cecil学习笔记(1)

2008-9-23 00:14
18591

之前曾用微软的Phoenix RDK写过一个简单的流程反混淆工具,功能尚不完善。随着Phoenix库的不断升级,功能也随之增强,但与新版本的.NET有个兼容性问题始终无法解决。于是下决心将平台换到Cecil上来。同时还需要用到一个Cecil的子项目FlowAnalysis。
本文就是一篇Cecil与Cecil.FlowAnalysis的学习笔记,参考的对象主要是利用Cecil编写的工具及两个库本身的源代码。
    利用Cecil编写的工具已经有不少,其中Smart Assembly Explorer(以下简称SAE)算是非常经典的一个,最后更新的版本中还包括了FlowAnalysis库的使用;另一个很有名的是Reflector的插件ReflexIL。本文中使用的代码示例主要来自于SAE,在这里感谢一下其作者WiCKY HU无私地将这些代码分享出来。
1.  Cecil学习
1.1.  Cecil简介
    要说Cecil则不能不提MONO,MONO是一个致力于在 Linux, Solaris, Mac OS X, Windows, and Unix等多个系统上运行.NET程序的平台,而Cecil则是MONO下的一个子项目。简单地说,Cecil库用来修改符合ECMA CIL规范的.NET可执行文件。
    Cecil使用简单却功能强大,提供比.NET本身Reflection更多的操作功能,更重要的是它是开源的,于是深得许多大牛的喜爱。(数年前就有大牛推荐偶学这个库了,可惜当时没有实现。)MONO虽然没有提供Cecil的tut,但是Cecil库本身的代码是self pxplanation的,所以学习起来并不困难,再加上有许多开源的工具,学起来更是方便。Cecil开源项目的网址是:http://groups.google.com/group/mono-cecil/web/projects-using-cecil。
1.2.  Cecil总体结构
    用Reflector载入Cecil.dll并查看其结构,可以发现Cecil主要由七个名称空间构成(有时在Reflector中查看比直接阅读源代码还轻松些,特别是对于这种整体结构的把握),如图1所示。

图1  Reflector中查看Cecil的整体结构

    分别浏览各名称空间,便可了解各空间中代码的主要功能。
1.2.1.  Mono.Cecil空间
主要包含一些:
(1)一些.NET关键概念(或者说元数据表)的定义,如AssemblyDefinition、ModuleDefinition、MethodDefinition、EventDefinition等。这些定义的名称直接代表了相应的元数据概念,都是很好理解的,代表了这些概念的MONO实现(或都说Cecil实现)。
(2)一些关键标志的定义,如AssemblyKind:

1
2
3
4
5
6
public enum AssemblyKind
{
    Dll,
    Console,
    Windows
}
1
2
3
4
5
6
7
8
9
10
public enum Code
{
    Nop,
    Break,
    Ldarg_0,
    Ldarg_1,
    Ldarg_2,
    Ldarg_3,
    Ldloc_0,
    //
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
public sealed class Instruction : ICodeVisitable
{
    // Fields
    private Instruction m_next;
    private int m_offset;
    private OpCode m_opCode;
    private object m_operand;
    private Instruction m_previous;
    private SequencePoint m_sequencePoint;
 
    // Methods
    internal Instruction(OpCode opCode);
    internal Instruction(OpCode opCode, object operand);
    internal Instruction(int offset, OpCode opCode);
    internal Instruction(int offset, OpCode opCode, object operand);
    public void Accept(ICodeVisitor visitor);
    public int GetSize();
 
    // Properties
    public Instruction Next { get; set; }
    public int Offset { get; set; }
    public OpCode OpCode { get; set; }
    public object Operand { get; set; }
    public Instruction Previous { get; set; }
    public SequencePoint SequencePoint { get; set; }
}
1
2
3
4
5
6
7
8
9
//代替换指令为ins,worker为CilWorker
    int size = ins.GetSize();
    ins.OpCode = OpCodes.Nop;
    ins.Operand = null;
    for (int i = 1; i < size; i++)
    {
        Instruction instr = worker.Create(OpCodes.Nop);
        worker.InsertAfter(ins, instr);
    }
1
2
3
4
5
CilWorker _worker;
...
_worker.InsertBefore(target_instruction, some_instruction);  //这里对代码进行修改
...
AssemblyFactory.SaveAssembly(asm_def, saveFileName);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public override void VisitMethodDefinition(MethodDefinition method)
{
    MethodTable methodTable = this.m_tableWriter.GetMethodTable();
    MethodRow row = this.m_rowWriter.CreateMethodRow(RVA.Zero, method.ImplAttributes, method.Attributes, this.m_mdWriter.AddString(method.Name), this.m_sigWriter.AddMethodDefSig(this.GetMethodDefSig(method)), this.m_paramIndex);
    methodTable.Rows.Add(row);
    this.m_methodStack.Add(method);
    method.MetadataToken = new MetadataToken(TokenType.Method, (uint) methodTable.Rows.Count);
    this.m_methodIndex++;
    if (RequiresParameterRow(method.ReturnType))
    {
        this.InsertParameter(this.m_tableWriter.GetParamTable(), method.ReturnType.Parameter, 0);
    }
    this.VisitParameterDefinitionCollection(method.Parameters);
}

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

上传的附件:
  • 1.JPG (8.97kb,1096次下载)
  • 2.JPG (29.33kb,1098次下载)
  • 3.JPG (33.39kb,1091次下载)
  • 1.rar (148.72kb,101次下载)
收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-1-4 01:21
伟叔叔
为你点赞~
2023-11-20 00:00
QinBeast
为你点赞~
2023-8-28 00:31
PLEBFE
为你点赞~
2023-8-24 02:44
shinratensei
为你点赞~
2023-8-3 00:30
心游尘世外
为你点赞~
2023-7-25 00:09
飘零丶
为你点赞~
2023-7-12 00:03
最新回复 (16)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
沙发,学习~~~~~~
2008-9-23 00:55
0
雪    币: 136
活跃值: (220)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
hehe 只能学习
2008-9-23 06:18
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
完全看不懂~
2008-9-23 08:34
0
雪    币: 215
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主新书啥时候出版啊
2008-9-23 09:31
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
6
占位学习......
2008-9-23 11:13
0
雪    币: 716
活跃值: (162)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
7
看不懂啊,。。。
2008-9-23 13:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收起来,有空再看。
2008-9-23 21:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
强,楼主,这个文章写的非常好!
2008-9-24 13:29
0
雪    币: 210
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
迷糊,完全不懂.
2008-9-24 22:17
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不懂,学习~
2008-9-25 09:14
0
雪    币: 690
活跃值: (1873)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
学习一下。。。
2008-9-25 13:15
0
雪    币: 149
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不理解,不过我还见过用。net压缩类混淆的
2008-10-9 21:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
smart assembly explorer这个没找到下载的呢?
哪位能告诉一下,谢谢.
2008-11-10 11:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
应该是simple assembly explorer吧:
http://simpledotnet.googlepages.com/simpleassemblyexplorer
2008-11-10 11:21
0
雪    币: 560
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习了!!!!
2010-7-10 09:05
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
Very good, studying!
2014-4-5 23:35
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册