能力值:
( LV3,RANK:20 )
|
-
-
2 楼
可以自己写个程序使用反射调用类似于下列代码中的<Module>::a(string, int32)函数进行解密。
L_000e: ldstr "\u****\u****\u****\u****\u****"
L_0013: ldloc num
L_0017: call string <Module>::a(string, int32)
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
@tease
能告诉在哪里call 这个地方?我发现有好多好多地方call 这里啊,或能告诉 这 L_000e: ldstr "\u****\u****\u****\u****\u****" 具体是什么字符?
再次谢谢老师
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
@tease
老师,,能说一下你分析的思路和想法,就是怎样为什么从某个地方call这里 <Module>::a(string, int32)
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
1。“使用反射调用”,这个是好方法,巩固了知识又达到了目的
2。如果这个程序是dotfuscator混淆的 ,也可以使用现成的工具DotFuckScator,效果不错的
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
IL代码中ldstr 用于读取一个字符串,建立System.String的实例,并入栈。
通过IL代码来看,当字符串入栈后,并没有立刻使用这个字符串,而是将字符串传入了<Module>::a(string, int32) 的方法中返回一个新的字符串。最后新的字符串再用于实际的操作,而且每次字符串调用的都是同一个<Module>::a(string, int32)方法 。很显然这就是解密函数。而int32参数是个增加写自动解密工具难度的一个偏移值。
传统的做法:如果没有现成的工具,就应该想用反射调用这里的函数,将所有的字符串全部解密出来,再和demo中的字符串对比,最终找到相关的license验证部分。(当然是自动解密所有字符串,而不是一个一个字符串的解密)
无论使用什么加密软件解密字符串,用反射调用都是屡试不爽的做法。例如在xenocode中也是用这种方法加密字符串的。这个例子是c#代码会让你更清晰的了解常用的字符串加密方法。关于Xenocode的算法问题我和grassdrago 有过一个讨论帖子可以参考: http://bbs.pediy.com/showthread.php?t=90723&prefixid=phpforce_40
很显然这里的x1110bdd110cdcea4._xaacba899487bce8c方法就是解密函数。0x70eafb是图中被圈中部分的偏移值。只需要反射调用x1110bdd110cdcea4._xaacba899487bce8c这个方法就可以得到解密的字符串了。
用反射调用的方法可以参考yuhen老大的文章
http://www.rainsts.net/article.asp?id=96
解密工具有两种写法:
其一是拷贝源代码中的算法解密(如果不能还原为高级语言,还需要自己看懂解密算法)。
其二就是使用反射调用自动解密。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢老师,关键是有这么多的"\u****\u****\u****\u****\u****",怎样去定位呢?
我理解这是解密的函数,但是怎样定位哪里就是这些Evaluation字样call 这个解密函数?
谢谢
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
步骤。(文中的截图,只是为了说明问题,和本文无关)
1、写一个工具(或者使用已经有的工具),遍历所有的类和方法,并解密所有的字符串,将这个字符串所在的类和方法记录下来
2、搜索DEMO中出现的字符串,可以定位具体的类和方法名。
3、使用Reflector的Analyze功能,可以分析第二步中定位的方法,被哪些方法所调用。
4、查找到第二步和第三步中的所有涉及到的方法,利用编程功底去分析程序验证的地方。
这就是传统的经典做法,全是体力活~
现在流行的是玩意识,秒破。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
支持,以后学习是好好看看
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
多谢老师,收益不少,非常感谢
另外,老师如果有时间的话,请帮忙看看这个控件,它也是EXCEL类型的.NET控件,也是有demo字样在电子表的第一行出现,,,,
真是麻烦你了,浪费你宝贵时间真抱歉
老师请:
http://www.xun6.com/file/16374e717/NativeExcelNetDemo.rar.html
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
期待老师能出几个NET破解的视频教程
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
呵呵呵,老师真是非常高的高手,希望以后多多指点我们,感恩,
你肯定会为中国的软件发展做出重大贡献
能分享怎样分析吗?
再次感谢您
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
有时间就做录像。
能分享怎样分析吗?
再次感谢您
1、新建一个工程,导入这个dll。只写两句代码:
IWorkbook book = NativeExcel.Factory.CreateWorkbook();
book.SaveAs("test.xls");
运行项目后,发现生成的test.xls文件已经包含了Demo字样。那么也就是说,生成DEMO字样的可能性只有在CreateWorkbook()方法或者在saveas()方法中。
2、我们发现生成的DEMO字样总是在A1的单元格内,我们在代码中往A1和B1中添加数据看看。
IWorkbook book = NativeExcel.Factory.CreateWorkbook();
IWorksheet sheet = book.Worksheets.Add();
sheet.Range["A1:A1"].Value = "Hello";
sheet.Range["A1:B1"].Value = "World";
book.SaveAs("test.xls");
运行后我们发现,A1单元格被DEMO字样覆盖了,而B1单元格则出现了World的字样。那么控件肯定是在SaveAs方法中覆盖了我们写的"Hello"字符串。也就是说只要重点在于分析SaveAs中的代码。
3、看到这里有两种方法解决问题:
其一,记录自己的A1数值,然后再控件中新增加一个方法,这个方法放在SaveAs的最后处被调用,这个方法的内容是重新还原A1单元格的内容。优点是快速解决问题,缺点是要给控件逆向增加一个方法,用户调用起来不会习惯。
其二,试想,控件是如何覆盖数据的?肯定用了和我们类似于sheet.Range["A1:A1"].Value = "Hello";这样的代码逻辑。所以只要调查这个代码是如何在Excel中生成数据的就可以了。
加两个MessageBox
IWorkbook book = NativeExcel.Factory.CreateWorkbook();
IWorksheet sheet = book.Worksheets.Add();
MessageBox.show("1");
sheet.Range["A1:A1"].Value = "Hello";
MessageBox.show("2");
sheet.Range["A1:B1"].Value = "World";
book.SaveAs("test.xls");
使用windbg+sos载入程序,设断点在messagebox处。找到在调用这两个messagebox之间分别调用了哪些方法,将这些方法全部记录下来。
最后在Reflector中稍微的分析一下这些方法,很快就定位了。
4、使用windbg设断点在第三步找到的位置,很快在saveas()方法中断下来判断是否是填写DEMO字样的地方。NOP掉即可。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
to tease:
老师,你对windbg+sos 使用方面比较熟悉吗?
能否告诉我这方面的教程或资料或动画教程,我要知道的一个问题是,如何调试一个exe文件中有调用DLL,怎样断点?
谢谢
对于 NativeExcel 这个控件,我认为应在填充(0,0)方面下手,我认为(0,0)就是第一行和第一列,不知道思路是否合理?
请指正,谢谢
最后希望能早日看到你使用 windbg+sos 调试.NET方面的教程
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
随着加密技术的提高,静态分析DONET已经不能满足当今破解的需求了,windbg+sos是锻炼意识流最好的工具之一,而且可以做到以不变应万变。我没看过动画教程,我只看过两本书
《软件调试》的windbg部分
《.NET2.0应用程序调试》
只要dll文件被加载了,就可以向对exe文件下断一样。
sxe ld:xxx.dll在dll加载时中断。
!nam2ee xxx.dll xxxx.xxx.xx()在dll中查找方法并获得 methodDesc address
然后对前面获得的这个地址下断即可。
你说的(0,0)就是我前文中说的A1 单元格(MS Office是这样描述的)......
你说的思路更适合静态破解,肯定是可行的,但是如何去缩小范围呢?你可以尝试一下,如果成功了,可以分享一下经验。
我的思路有一点点区别,就是我先找到填充任意数据的地方(我缩小范围的方法是自己写填充数据的代码夹在两个MessageBox之间),然后再找到的方法中设断点,当发现填充字符串为DEMO字符时,可以通过看堆栈来定位是哪个方法调用的。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
老师,,,
因为你是动态调试,你能看到堆栈,但是,我们这些初学者不懂如何去动态调试,希望能提供更多的动态调试方面的经验给我们,
谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
@tease
《软件调试》是什么出版社出版?作者是谁?
谢谢
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
实在是太有才了 绝对同意楼上的
------------------------------------------------------------
张娜拉 安奈竹碳一洗白。瑞脑香消魂梦断 吸立白
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
非常的好看,非常的实用
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
标记一下!谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
帮顶,确实厉害
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
意识很重要。。
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
tease果然对.net有研究啊
|
|
|