发现很多人都担心本人的.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
首先,感谢原作者,原文地址: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
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
支持题主,虽然用同样的方法破。
注入调用与解码是两个层面的东西,调用很多时候都不能算是破解。
注入调用与解码是两个层面的东西,调用很多时候都不能算是破解。