Code Bye

本人动手实现.net加密

发现很多人都担心本人的.net程序被破解,用混淆工具也不安全,有各种大杀器可以反混淆,而且很多混淆工具都是收费的,所以一直想本人动手实现,后来发现了一篇文章提供的方法非常好,但本人发现很多人并不知道,而且文章也很久远了,不支持现在的.net 4.0以上版本和64bit,所以本人做了些修改,并在这里推广下,希望广大.net开发者都能够掌握这套方法
首先,感谢原作者,原文地址:http://www.cnblogs.com/northstarlight/archive/2010/07/04/1771021.html
第二,由于原帖中原理已经讲得非常透彻了,本人在这里就概括下,想详细了解原理的请看原帖
原理概述:
我们都知道,C#会编译成IL,我们只要修改了IL,例如胡乱填写一些指令或修改为nop指令即可达到加密的作用,最终只要在运行时再修改回来即可正常运行。C#的函数最终运行是要编译成native code的,在clrjit中有一个函数compileMethod就是干这个事的,要把IL转换为native code,首先要做的就是找到IL指令地址,我们hook该函数控制其执行流程,修改IL指令地址为加密函数的真实IL指令地址,这样就可以完美加密运行了,即:
加密函数(假IL)->动态替换真实IL->编译->还原假IL(防止内存dump)->运行
本人写的例子:https://github.com/bigbaldy1128/EncryptMethodTest.git
修改原始IL指令(本人用的dnspy)

保存原始IL
BYTE testFunCode[0x9] =
{
	0x00,
	0x03,
	0x04,
	0x58,
	0x0A,
	0x2B,0x00,
	0x06,
	0x2A
};

hook compileMethod还原真实IL

int __stdcall my_compileMethod(ULONG_PTR classthis, ICorJitInfo *comp,
							   CORINFO_METHOD_INFO *info, unsigned flags,         
							   BYTE **nativeEntry, ULONG  *nativeSizeOfCode)
{
   const char *szMethodName = NULL;
   const char *szClassName = NULL;
   szMethodName = comp->getMethodName(info->ftn, &szClassName);
   BYTE* old = info->ILCode;
    if (strcmp(szMethodName, "Test") == 0)
	{
		info->ILCode= testFunCode;
	}
	int nRet = compileMethod(classthis, comp, info, flags, nativeEntry, nativeSizeOfCode);
	info->ILCode = old;
	return nRet;
}

这种加密方式的好处:
1.针对函数指令加密,任何反混淆工具都将失效
2.原函数指令在C++写的dll中,逆向难度较大
3.C++的dll可以采用原生的各种强加密方式,例如TMD或VM壳,一般是破解不了的
4.原函数指令只有在编译的那一瞬间存在于内存,所以就算用Megadumper这种强力的内存导出工具也是没用的
5.使用超级简单,只需随意填充要加密的函数,并复制原指令到C++的dll中即可

解决方案

1

好东西,  顶一个

1

好东西,学习一下。

1

以前看过一篇讲原生代码混淆的
http://drops.wooyun.org/tips/9347

1

超级大神,mark一下,有空研究。

1

这个要是成熟了,很有价值,收藏,有空研究下

1

直接用snoop注入来调用,都不用破解混淆,原因是再怎么混淆软件也要正确运行。

1

不错,值得学习。

1

good, 受用

1

嗯……

1

learning

1

good

1

nice 11111

1

asdfasdf

1

亿亿亿iiiiiiiii

1

非常好的,感觉题主

1

非常好的,感觉题主

1

好东西    顶一下~~~

1

感谢题主 真的很好

1

不错

1

现在主流大数据都用什么技术呢?
现在主流大数据都用什么技术?牵涉到哪些知识点,需要学习哪些东西

1

地对地导弹到底

1

666666好用

1

好厉害的样子

1

回去试试看怎样

1

好像很不错的样子

1

好东西,赞一个

1

学习了,赞!

1

1

很好,学习了

1

学习了

1

[img=http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/16.gif][/img ] 阿萨德法师打发斯蒂芬

1

好东西,赞一个

1

感谢整理分享~

1

1

超级大神,mark一下,有空研究。

1

借用一下

1

直接用snoop注入来调用,都不用破解混淆,原因是再怎么混淆软件也要正确运行。

1

.NETnative

1

学习了,感谢分享

1

支持题主,虽然用同样的方法破。
注入调用与解码是两个层面的东西,调用很多时候都不能算是破解。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明本人动手实现.net加密