首页
社区
课程
招聘
[讨论]net 入门讨论
发表于: 2010-4-1 21:58 10398

[讨论]net 入门讨论

2010-4-1 21:58
10398
关注.net 有一周了,即使有了tankaiha大师的入门贴后,还是不得要领。
按照reflector+ildasm+ilasm 这个步骤。我将.exe用ILdsam打开后代码如下:
.method private hidebysig static void Main(string[] args) cil managed
{
    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
    .entrypoint
    .maxstack 4
    .locals init (
        [0] class [mscorlib]System.AppDomain domain,
        [1] object[] objArray,
        [2] class [mscorlib]System.IO.MemoryStream stream,
        [3] class [mscorlib]System.IO.Stream stream2,
        [4] uint8[] buffer,
        [5] class Sixxpack.Compressor compressor,
        [6] uint8[] buffer2,
        [7] class [mscorlib]System.Reflection.Assembly 'assembly')
    L_0000: call class [mscorlib]System.AppDomain [mscorlib]System.AppDomain::get_CurrentDomain()
    L_0005: stloc.0
    L_0006: ldloc.0
    L_0007: ldnull
    L_0008: ldftn class [mscorlib]System.Reflection.Assembly Sixxpack.stub::myResolveEventHandler(object, class [mscorlib]System.ResolveEventArgs)
    L_000e: newobj instance void [mscorlib]System.ResolveEventHandler::.ctor(object, native int)
    L_0013: callvirt instance void [mscorlib]System.AppDomain::add_AssemblyResolve(class [mscorlib]System.ResolveEventHandler)
    L_0018: leave.s L_001d
    L_001a: pop
    L_001b: leave.s L_001d
    L_001d: ldc.i4.1
    L_001e: newarr object
    L_0023: stloc.1
    L_0024: ldloc.1
    L_0025: ldc.i4.0
    L_0026: ldarg.0
    L_0027: stelem.ref
    L_0028: newobj instance void [mscorlib]System.IO.MemoryStream::.ctor()
    L_002d: stloc.2
    L_002e: call string [System.Windows.Forms]System.Windows.Forms.Application::get_ExecutablePath()
    L_0033: call string [System.Windows.Forms]System.Windows.Forms.Application::get_ExecutablePath()
    L_0038: ldc.i4.s 0x5c
    L_003a: callvirt instance int32 [mscorlib]System.String::LastIndexOf(char)
    L_003f: ldc.i4.1
    L_0040: add
    L_0041: callvirt instance string [mscorlib]System.String::Substring(int32)
    L_0046: ldc.i4.3
    L_0047: ldc.i4.1
    L_0048: newobj instance void [mscorlib]System.IO.FileStream::.ctor(string, valuetype [mscorlib]System.IO.FileMode, valuetype [mscorlib]System.IO.FileAccess)
    L_004d: stloc.3
    L_004e: ldloc.3
    L_004f: ldsfld int32 Sixxpack.stub::orig
    L_0054: conv.i8
    L_0055: callvirt instance void [mscorlib]System.IO.Stream::set_Position(int64)
    L_005a: ldloc.3
    L_005b: callvirt instance int64 [mscorlib]System.IO.Stream::get_Length()
    L_0060: ldsfld int32 Sixxpack.stub::orig
    L_0065: conv.i8
    L_0066: sub
    L_0067: conv.ovf.i
    L_0068: newarr uint8
    L_006d: stloc.s buffer
    L_006f: ldloc.3
    L_0070: ldloc.s buffer
    L_0072: ldc.i4.0
    L_0073: ldloc.s buffer
    L_0075: ldlen
    L_0076: conv.i4
    L_0077: call int32 [mscorlib]System.Convert::ToInt32(int32)
    L_007c: callvirt instance int32 [mscorlib]System.IO.Stream::Read(uint8[], int32, int32)
    L_0081: pop
    L_0082: ldloc.2
    L_0083: ldloc.s buffer
    L_0085: ldc.i4.0
    L_0086: ldloc.s buffer
    L_0088: ldlen
    L_0089: conv.i4
    L_008a: callvirt instance void [mscorlib]System.IO.Stream::Write(uint8[], int32, int32)
    L_008f: ldloc.2
    L_0090: ldc.i4.0
    L_0091: conv.i8
    L_0092: ldc.i4.0
    L_0093: callvirt instance int64 [mscorlib]System.IO.Stream::Seek(int64, valuetype [mscorlib]System.IO.SeekOrigin)
    L_0098: pop
    L_0099: newobj instance void Sixxpack.Compressor::.ctor()
    L_009e: stloc.s compressor
    L_00a0: ldloc.s compressor
    L_00a2: ldloc.2
    L_00a3: callvirt instance uint8[] Sixxpack.Compressor::Decompress(class [mscorlib]System.IO.Stream)
    L_00a8: stloc.s buffer2
    L_00aa: ldloc.s buffer2
    L_00ac: call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::Load(uint8[])
    L_00b1: stloc.s 'assembly'
    L_00b3: ldloc.s 'assembly'
    L_00b5: callvirt instance class [mscorlib]System.Reflection.MethodInfo [mscorlib]System.Reflection.Assembly::get_EntryPoint()
    L_00ba: ldnull
    L_00bb: ldloc.1
    L_00bc: callvirt instance object [mscorlib]System.Reflection.MethodBase::Invoke(object, object[])
    L_00c1: pop
    L_00c2: leave.s L_00d6
    L_00c4: pop
    L_00c5: ldloc.s 'assembly'
    L_00c7: callvirt instance class [mscorlib]System.Reflection.MethodInfo [mscorlib]System.Reflection.Assembly::get_EntryPoint()
    L_00cc: ldnull
    L_00cd: ldnull
    L_00ce: callvirt instance object [mscorlib]System.Reflection.MethodBase::Invoke(object, object[])
    L_00d3: pop
    L_00d4: leave.s L_00d6
    L_00d6: ret
    .try L_0000 to L_001a catch [mscorlib]System.Exception handler L_001a to L_001d
    .try L_00b3 to L_00c4 catch object handler L_00c4 to L_00d6
}

由上可见,该程序还算比较简单,未采取任何混淆,也没有加壳。这是我调试的第一个.net程序,从il代码上看是没有加壳。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (26)
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
然后,用reflctor加载可执行文件,C#语言可直接查看。代码如下:
[STAThread]
private static void Main(string[] args)
{
    try
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(stub.myResolveEventHandler);
    }
    catch (Exception)
    {
    }
    object[] parameters = new object[] { args };
    MemoryStream inStream = new MemoryStream();
    Stream stream2 = new FileStream(Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\') + 1), FileMode.Open, FileAccess.Read);
    stream2.Position = orig;
    byte[] buffer = new byte[stream2.Length - orig];
    stream2.Read(buffer, 0, Convert.ToInt32(buffer.Length));
    inStream.Write(buffer, 0, buffer.Length);
    inStream.Seek(0L, SeekOrigin.Begin);
    Compressor compressor = new Compressor();
    Assembly assembly = Assembly.Load(compressor.Decompress(inStream));
    try
    {
        assembly.EntryPoint.Invoke(null, parameters);
    }
    catch
    {
        assembly.EntryPoint.Invoke(null, null);
    }
}
2010-4-1 22:07
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
经过2次查看,该.net  dump出的文件似乎没有一点保护。不知道程序第一条call指令 是否算一个反汇编或者其他什么的检查。这方面不太清楚。
然后我就用ILasm将导出的il 文件跟 .res文件 反编译称 a.exe文件。
运行了一下a.exe出现如下提醒:

a.exe 遇到问题需要关闭,我们对此引起的不便表示抱歉。
如果你正处于进程当中,信息有可能丢失。

我就用ILDSAM反汇编出来后再用 ILASM编译回去。

哪位大侠能够解释一下?
2010-4-1 22:15
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是我描述不清楚吗?这两天正恶补C# 语言。
2010-4-3 17:54
0
雪    币: 6949
活跃值: (2785)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
汗,太高级了。刚接触这个方面,看标题以为是楼主的经验,没想到是问题
2010-4-3 18:52
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
继续分析:
看到入口方法有以下程序:
internal static MethodBase GetMethodBase(RuntimeTypeHandle reflectedTypeHandle, RuntimeMethodHandle methodHandle)
{
    if (methodHandle.IsDynamicMethod())
    {
        Resolver resolver = methodHandle.GetResolver();
        if (resolver != null)
        {
            return resolver.GetDynamicMethod();
        }
        return null;
    }
    Type runtimeType = methodHandle.GetDeclaringType().GetRuntimeType();
    RuntimeType c = reflectedTypeHandle.GetRuntimeType();
    RuntimeTypeHandle[] methodInstantiation = null;
    bool flag = false; //此处更改为ture 应该能完成爆破
    if (c == null)
    {
        c = runtimeType as RuntimeType;
    }
    if (c.IsArray)
    {
        MethodBase[] baseArray = c.GetMember(methodHandle.GetName(), MemberTypes.Method | MemberTypes.Constructor, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance) as MethodBase[];
        bool flag2 = false;
        for (int i = 0; i < baseArray.Length; i++)
        {
            if (baseArray[i].GetMethodHandle() == methodHandle)
            {
                flag2 = true;
            }
        }
        if (!flag2)
        {
            throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveMethodHandle"), new object[] { c.ToString(), runtimeType.ToString() }));
        }
        runtimeType = c;
    }
    else if (!runtimeType.IsAssignableFrom(c))
    {
        if (!runtimeType.IsGenericType)
        {
            throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveMethodHandle"), new object[] { c.ToString(), runtimeType.ToString() }));
        }
        Type genericTypeDefinition = runtimeType.GetGenericTypeDefinition();
        Type baseType = c;
        while (baseType != null)
        {
            Type type5 = baseType;
            if (type5.IsGenericType && !baseType.IsGenericTypeDefinition)
            {
                type5 = type5.GetGenericTypeDefinition();
            }
            if (type5.Equals(genericTypeDefinition))
            {
                break;
            }
            baseType = baseType.BaseType;
        }
        if (baseType == null)
        {
            throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_ResolveMethodHandle"), new object[] { c.ToString(), runtimeType.ToString() }));
        }
        runtimeType = baseType;
        methodInstantiation = methodHandle.GetMethodInstantiation();
        bool flag3 = methodHandle.IsGenericMethodDefinition();
        methodHandle = methodHandle.GetMethodFromCanonical(runtimeType.GetTypeHandleInternal());
        if (!flag3)
        {
            flag = true;
        }
    }
    if (runtimeType.IsValueType)
    {
        methodHandle = methodHandle.GetUnboxingStub();
    }
    if (flag || ((runtimeType.GetTypeHandleInternal().HasInstantiation() && !runtimeType.GetTypeHandleInternal().IsGenericTypeDefinition()) && !methodHandle.HasMethodInstantiation()))
    {
        methodHandle = methodHandle.GetInstantiatingStub(runtimeType.GetTypeHandleInternal(), methodInstantiation);
    }
    if (methodHandle.IsConstructor())
    {
        return c.Cache.GetConstructor(runtimeType.GetTypeHandleInternal(), methodHandle);
    }
    if (methodHandle.HasMethodInstantiation() && !methodHandle.IsGenericMethodDefinition())
    {
        return c.Cache.GetGenericMethodInfo(methodHandle);
    }
    return c.Cache.GetMethod(runtimeType.GetTypeHandleInternal(), methodHandle);
}

红色标记更改为ture 应该就能爆破,用reflector 导入后,发现上述Getmethodbase程序系统mscorlib空间下,ildsam无法反汇编出mscorlib 空间,遇到此问题该如何处理?
2010-4-4 17:15
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
确实描述不清,外加找错爆破点
爆破不可能到系统空间
2010-4-4 20:07
0
雪    币: 122
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
本人对这个确实没啥研究,但是,有一点可以确定,楼主爆破的方向是错误的!
2010-4-4 20:14
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢两位。描述方面,需要加强上图的练习。配合上图就能描述清楚了。
2010-4-4 21:23
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
把问题重新描述一下:reflector载入程序后 找到Main方法。程序不大,内有入口方法见图。
上传的附件:
2010-4-4 21:34
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
进一步查看程序,不管是查看EntryPoint(类) 还是 invoke(方法) 均跳转到系统空间,如图
上传的附件:
2010-4-4 21:39
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
继续跟踪EntryPoint 的返回函数 GetMethodBase  得 GetMethodBase1 图所示。
上传的附件:
2010-4-4 21:44
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
程序是通过传递参数到基类中计算,然后返回相应值作为判据。所有的入口程序 也就assembly.EntryPoint.Invoke(null, parameters);一行。这类程序 如何进一步分析?
期望大侠指点。本菜鸟 继续恶补 c# 语言中。
2010-4-4 21:50
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
用的反射调用dll,要知道你调用的参数是什么,才能知道具体代码在哪个dll的哪个具体函数
LZ先了解下.net的反射吧
不然你肯定找不到该分析的地方
2010-4-5 18:57
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
嗯,这只是壳的代码。
2010-4-5 18:58
0
雪    币: 221
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
怎么跟踪到系统dll里面去了?
还是应该在主程序找突破口
2010-4-5 21:06
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
主程序里什么都没有。一跟就到.dll里去了。不知道怎么搞。我看看反射再说吧。
2010-4-7 22:09
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Sixxpack加的壳,先要脱壳才行。
2010-4-8 00:34
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
哦。不是加了壳就看不清源代码了吗?这里都看的很清楚。我以为没加壳呢。
仔细查看代码,发现 myResolveEventHandler 下有如下语句:
    if (path.IndexOf(".") >= 0)
    {
        path = path.Replace(".", "_") + ".dll";
    }
    else
    {
        path = "_" + path + ".dll";
    }

见图。这什么意思?
上传的附件:
2010-4-8 22:44
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
PEID 检测 Microsoft Visual C# / Basic .NET [Overlay]

应该不是加壳的吧?
2010-4-8 23:13
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
如果包含点,那么就把点替换为下划线。
明显这是要从资源中提取文件,然后还原为Assembly对象了。
100%是加Sixxpack壳,相信我,没错的!!!用NETUNPACK脱掉后再分析。
2010-4-10 01:10
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我试试,谢谢。却是图片上有个Sixxpack的标识。没经验,不知道这就是壳。
2010-4-11 14:30
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
if ((this.textBox1.Text == str3) && (this.textBox2.Text == str4))
    {
        MessageBox.Show("剩余时间0天0时0分,帐号未激活", "登陆成功");
        this.button1.Enabled = false;
        this.button2.Enabled = true;
        this.textBox1.Text = null;
        this.textBox2.Text = null;
        this.label11.Text = table.Rows[0][1].ToString();
        this.label13.Text = table.Rows[0][3].ToString();
        this.label14.Text = table.Rows[0][4].ToString();
        this.label16.Text = "0天0时0分";
        this.label18.Text = "未激活";
        this.label25.Text = table.Rows[0][1].ToString();
        this.button8.Enabled = true;
        this.button9.Enabled = true;
        this.tabControl1.SelectTab(3);
    }

脱了壳见到如上程序,暴强,是个骗子哈哈。
2010-4-11 16:30
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢donet 指导,谢谢。
2010-4-11 16:32
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
呵呵。.net都被剖析成这样了。
最终结果都还是汇编。我郁闷啊
2010-8-6 13:12
0
游客
登录 | 注册 方可回帖
返回
//