遗憾迟香 发表于 2021-8-19 21:52

.net逆向如何入门?

本帖最后由 遗憾迟香 于 2021-8-19 21:52 编辑

我是练习时长两年的.net攻城狮,准备入门.net逆向
分享我.net破解失败的案例
注:这里不是求破,而是想让大佬们给我一些思路和建议,软件名已打码

1.某某.net界面库
从其它软件中找到了一款很好的界面库,准备捡回去自己用
但一拖进vs就提示软件未授权,还强行关闭了vs

dnspy反编译乱码


de4dot反混淆后的结果,一大堆未知的类


搜索"未授权",未找到,破解失败告终

2.某某音乐工具

de4dot报错,拖进dnspy还是乱码,破解失败告终


3.某某开源的音乐播放器
软件是开源的,界面很好看但接口早已失效,想修改一下复活它

现在找不到源码了,直接反编译

好家伙!比音乐间谍3.4复杂多了,211研究生就是牛逼,带专生表示一脸懵逼

4.某asp.net网站验证码破解

某个成功案例传送门https://www.52pojie.cn/thread-1491635-1-1.html
以同样的方法破解这个,失败

尝试修改js,不知道如何应用修改后的js,破解宣告失败

5.某某u3d恐怖单机游戏
游戏通关时会弹出错误,点击确定就会闹鬼


想看一下弹窗后闹鬼执行了什么操作,Assembly-CSharp.dll看似没加密,搜索弹窗上的文字却搜不出来,破解宣告失败


6.某某u3d开放世界游戏
想了解游戏的传送机制,偷渡一个叫做某妻的地方
拿到了内鬼泄露的1.45gm客户端
里面的dll没一个能反编译的

后来才了解了il2cpp

被加密了

反编译以本人水平无法进行下去,尝试使用ce修改坐标
记下坐标,点击传送

这里有几个值一直在波动

传送到另一位置再次扫描

游戏没反应,有些值被改成了我设置的-2000,有些值被自动改回来了,有些值被自动改成了其他数值,另外修改之后也出现了一些bug,比如许多山都不见了,变成了可穿透的模型
然后就不会了...

当然,我也成功破解过.net软件
https://www.52pojie.cn/thread-1495490-1-1.html

Frhvjhhv 发表于 2021-8-20 01:35

不要依赖工具。(.net逆向如果没有传统win32逆向功底根本脱离不了小白行列)。现在.net加密基本都是jit层了。。。先学习传统win32解密吧。了解清楚pe结构,二进制汇编等等基本知识。有了win32基础然后学.net文件的pe头部,元数据等等.net特有的知识。然后就一定要看.net源码(c++实现)。jit层和ee层要烂熟于心,然后就可以学习de4dot,confusex等等开源的加解密项目了。。

咬字分开念 发表于 2021-8-21 19:49

本帖最后由 咬字分开念 于 2021-8-21 19:50 编辑

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Diagnostics;

using Hook;

namespace D
{
    //    public static class AssemblyUtil

    public static class Ab
    {
      public static T CreateInstance<T>(string type)
      {
            return CreateInstance<T>(type, new object);
      }

      /// <summary>
      /// 在当前的程序集中反射创建实例
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <param name="type"></param>
      /// <param name="parameters"></param>
      /// <returns></returns>
      public static T CreateInstance<T>(string type, object[] parameters)
      {
            Type instanceType = null;
            var result = default(T);

            instanceType = Type.GetType(type, false,true);
            if (instanceType == null)
                return default(T);
            object instance = Activator.CreateInstance(instanceType, parameters);
            result = (T)instance;
            return result;
      }

      /// <summary>
      /// 在给定的程序集中反射创建实例
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <param name="assembleName"></param>
      /// <param name="type"></param>
      /// <param name="parameters"></param>
      /// <returns></returns>

      public static T CreateInstance<T>(string assembleName, string type)
      {
            Type instanceType = null;
            var result = default(T);
            var asms = AppDomain.CurrentDomain.GetAssemblies();
            foreach (var assem in asms)
            {
                if (string.Equals(assem.FullName, assembleName, StringComparison.CurrentCultureIgnoreCase))
                {
                  var types = assem.GetTypes();
                  foreach (var t in types)
                  {
                        if (string.Equals(t.ToString(), type, StringComparison.CurrentCultureIgnoreCase))
                        {
                            instanceType = t;
                            break;
                        }
                  }
                  break;
                }
            }
            if (instanceType == null)
                return default(T);
            object instance = Activator.CreateInstance(instanceType, new object);
            result = (T)instance;
            return result;
      }

      /// <summary>
      /// 在给定的程序集中反射创建实例,并且传入构造函数的参数
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <param name="assembleName"></param>
      /// <param name="type"></param>
      /// <param name="parameters"></param>
      /// <returns></returns>
      public static T CreateInstance<T>(string assembleName, string type, object[] parameters)
      {
            Type instanceType = null;
            var result = default(T);
            var asms = AppDomain.CurrentDomain.GetAssemblies();
            foreach (var assem in asms)
            {
                if (string.Equals(assem.FullName, assembleName, StringComparison.CurrentCultureIgnoreCase))
                {
                  var types = assem.GetTypes();
                  foreach (var t in types)
                  {
                        if (string.Equals(t.ToString(), type, StringComparison.CurrentCultureIgnoreCase))
                        {
                            instanceType = t;
                            break;
                        }
                  }
                  break;
                }
            }
            if (instanceType == null)
                return default(T);
            object instance = Activator.CreateInstance(instanceType, parameters);
            result = (T)instance;
            return result;
      }   

      public static IEnumerable<Type> GetImplementTypes<TBaseType>(this Assembly assembly)
      {
            return assembly.GetExportedTypes().Where(t =>
                t.IsSubclassOf(typeof(TBaseType)) && t.IsClass && !t.IsAbstract);
      }

      public static IEnumerable<TBaseInterface> GetImplementedObjectsByInterface<TBaseInterface>(this Assembly assembly)
            where TBaseInterface : class
      {
            return GetImplementedObjectsByInterface<TBaseInterface>(assembly, typeof(TBaseInterface));
      }

      public static IEnumerable<TBaseInterface> GetImplementedObjectsByInterface<TBaseInterface>(this Assembly assembly, Type targetType)
            where TBaseInterface : class
      {
            var result = new List<TBaseInterface>();
            try
            {
                Type[] arrType = assembly.GetTypes();

            

                for (int i = 0; i < arrType.Length; i++)
                {
                  var currentImplementType = arrType;

                  if (currentImplementType.IsAbstract)
                        continue;

                  if (!targetType.IsAssignableFrom(currentImplementType))
                        continue;

                  result.Add((TBaseInterface)Activator.CreateInstance(currentImplementType));
                }

                return result;
            }
            catch (ReflectionTypeLoadException ex) {
                reg.Log("GetObjectsInterface:" +   ex.LoaderExceptions.ToString() +"\r\n");

               
               return result;
            }
      }

      public static T BinaryClone<T>(this T target)
      {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                formatter.Serialize(ms, target);
                ms.Position = 0;
                return (T)formatter.Deserialize(ms);
            }
      }

      private static object[] m_EmptyObjectArray = new object[] { };
      public static T CopyPropertiesTo<T>(this T source, T target)
      {
            PropertyInfo[] properties = source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
            Dictionary<string, PropertyInfo> sourcePropertiesDict = properties.ToDictionary(p => p.Name);

            PropertyInfo[] targetProperties = target.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
            for (int i = 0; i < targetProperties.Length; i++)
            {
                var p = targetProperties;
                PropertyInfo sourceProperty;

                if (sourcePropertiesDict.TryGetValue(p.Name, out sourceProperty))
                {
                  if (sourceProperty.PropertyType != p.PropertyType)
                        continue;

                  if (!sourceProperty.PropertyType.IsSerializable)
                        continue;

                  p.SetValue(target, sourceProperty.GetValue(source, m_EmptyObjectArray), m_EmptyObjectArray);
                }
            }

            return target;
      }

      public static IEnumerable<Assembly> GetAssembliesFromString(string assemblyDef)
      {
            return GetAssembliesFromStrings(assemblyDef.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries));
      }

      public static IEnumerable<Assembly> GetAssembliesFromStrings(string[] assemblies)
      {
            List<Assembly> result = new List<Assembly>(assemblies.Length);

            foreach (var a in assemblies)
            {
                result.Add(Assembly.Load(a));
            }

            return result;
      }

      public static string GetAssembleVer(string filePath)
      {      
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(filePath);
            string versionStr = string.Format(" {0}.{1}.{2}.{3}", fvi.ProductMajorPart, fvi.ProductMinorPart, fvi.ProductBuildPart, fvi.ProductPrivatePart);
            return versionStr;
      }
    }
}



hook   private static WebRequest Create(Uri requestUri, bool useUriBase) {}
方法可以拦截这个程序所有的get,这是解决Net程序最佳方法,不需要脱壳。

艾莉希雅 发表于 2021-8-19 21:57

某U3D游戏,怕不是原神

落红护花 发表于 2021-8-19 22:02

有些net壳de4dot不是万能的,这些还需要自己脱

swjia 发表于 2021-8-19 22:03

你在依葫芦画瓢,肯定觉得难,那里会有一上来就搜索,然后就立马找到跳转,这么利索的破解。

Domado 发表于 2021-8-19 23:34

net逆向不容易的

不知道改成啥 发表于 2021-8-20 08:36

:lol你以为糊住了我就不知道是啥组件了。

dayer 发表于 2021-8-20 09:42

本帖最后由 dayer 于 2021-8-20 09:45 编辑

第一个你少用了一个DLL专门设计窗体的。你就算破解成功,但是没有设计窗口的dll。还是没法用。那个dll发布程序的时候 会提示你删除。所以网上泄露的都不多。所以你还是花钱买吧 也不贵 99块钱。

遗憾迟香 发表于 2021-8-22 09:45

艾莉希雅 发表于 2021-8-19 21:57
某U3D游戏,怕不是原神

我只想看一下稻妻的风景,il2cppdumper不行,试着拿ce修改位置传送,网上有用ce改出无cd的
页: [1] 2
查看完整版本: .net逆向如何入门?