.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
不要依赖工具。(.net逆向如果没有传统win32逆向功底根本脱离不了小白行列)。现在.net加密基本都是jit层了。。。先学习传统win32解密吧。了解清楚pe结构,二进制汇编等等基本知识。有了win32基础然后学.net文件的pe头部,元数据等等.net特有的知识。然后就一定要看.net源码(c++实现)。jit层和ee层要烂熟于心,然后就可以学习de4dot,confusex等等开源的加解密项目了。。 本帖最后由 咬字分开念 于 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程序最佳方法,不需要脱壳。 某U3D游戏,怕不是原神 有些net壳de4dot不是万能的,这些还需要自己脱 你在依葫芦画瓢,肯定觉得难,那里会有一上来就搜索,然后就立马找到跳转,这么利索的破解。 net逆向不容易的 :lol你以为糊住了我就不知道是啥组件了。 本帖最后由 dayer 于 2021-8-20 09:45 编辑
第一个你少用了一个DLL专门设计窗体的。你就算破解成功,但是没有设计窗口的dll。还是没法用。那个dll发布程序的时候 会提示你删除。所以网上泄露的都不多。所以你还是花钱买吧 也不贵 99块钱。 艾莉希雅 发表于 2021-8-19 21:57
某U3D游戏,怕不是原神
我只想看一下稻妻的风景,il2cppdumper不行,试着拿ce修改位置传送,网上有用ce改出无cd的
页:
[1]
2