首页
社区
课程
招聘
[分享]SmartExporter小工具, 附Delphi和C#版源码
发表于: 2007-9-22 02:43 10007

[分享]SmartExporter小工具, 附Delphi和C#版源码

2007-9-22 02:43
10007
这啥论坛怎么有这么无敌的功能, 写完帖子, 在编辑框摁了几下Esc, 连标题一起给清除掉了....
摁CtrlZ都灭得救
明天再写内容, fake

看标题应该就能联想到{SmartAssembly}这个奇怪名字的软件, 此工具是最近在移植一个PDA程序的keygen到Win32/CE上的时候的副产品, 本来是打算做一个利用正则匹配来替换任务列表的源码中的字串解密调用到原来的字符串的, 结果发现大多汉化工具的正则匹配提取功能都可以完成, 甚至一些命令行的文本util一样可以搞定.
所以将生成有效字串列表的部分单独完成了, 其中deSmartAssembly是未完工的尸体, 从此被放弃鸟.

古人说: 源代码前没有秘密.
这个keygen拿reflector一看, 名字空间和变量控件名全部是城墙拐角模样的诡异符号, 方法等用reflector也识别不出, 切换到il查看, 发现头部的代码被小块小块的挪到了后面, ildasm出来后, 在EmEditor里面将拐角们分别替换成Marlett1~4之类的可读文字, 并且将每块方法中分居两岸的代码焊接起来, 编译后终于得到reflector可以解析的代码.
当然跑动后就废了, 经查看, 是爆在Marlett1::marlett2.marlett2里面, 修改前面的代码后, 打开了名字变掉的{xxxx-xxxx-xxxx}资源, 走下去, base64解码爆掉了.
结合代码分析这个{xxxx-xxxx-xxxx}资源, 他是由若干base64字串的记录组成的, 每个记录包含本记录的长度, 长度是Byte/Short/Int32可变的, 以单个记录开始的偏移作为解密参数, 相同的字符串在返回时候利用Intern来实现唯一引用驻留.
为了欺骗用他这个奇怪名字的软件做混淆的可怜.net程序作者, 这人在混淆时候给每个偏移增加了一个固定的增量, 该增量简直就是publickeytoken的CRC.

知道鸟加密的手段后, 我第一想到的就是自己做一个函数, 然后正则匹配字符串解密的调用(marlett1::marlett2.marlett2(xxx)), 将参数传入, 计算后将调用替换为双引号字串.
后来感觉太傻了, 这不就跟混淆器作者的效率一样低下了么, 而且无从检查参数的合法性, 应该先将这个不会走也不会变的资源里面字串的伪ID都给排出来, 然后就可以既安全又高效的替换完成了, 也就是此时发现了这简直就是字典, 简直就可以直接用passolo/sisu等通用字处理工具来提取调用代码为待处理词条, 导入字典, 让他自动帮我匹配和替换, 并且检查是否有未匹配的待处理项目, 而且只要正则匹配构造合理, il和C#代码都可以被干出来, 于是绝望了.

因为ildasm输出的il文件里面找不到程序本身的pubkeytoken, 我是从pubkey的sha1hash的最后八位(ulonglong的反置)拿来CRC出增量值的.

代码的说明:
win32版用D7或者D2007+KOL编译, KOL是2.77版本, 其中PWStrList是我修改过的会添加BOM的厚道版.
C#版是WPF的, 应该有sdk就可以编译.
C#版输出的是utf8格式, 改exportWriter创建时候的Encoding参数即可.
win32版输出的是utf16 LE with BOM, 要改的话可以封个StreamWriter, 也直接用exportStream写个utf8的BOM, 然后base64出来的直接塞入.
总之不能转成ANSI输出
不然城墙拐角样子的名称和包含版权符的文字无法跟其他非英文语种在单ANSI代码页共存.
sha1是Christophe Devine的版本, gcc链接, 参数见makefile.

所用的sha1.c和gcc的makefile:
sha1.7z
KOL版sha1obj:
sha1obj.7z

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 3758
活跃值: (3282)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
2
绝望了, 对这个编辑框绝望了~~
使用方法:
提供pubkey文件和{string}文件, 可以导出字典文件供汉化工具文本处理工具的词条使用.
pubkey可以从il文件中复制出pubkey的hex代码, 以hex text方式粘贴到010Editor或者Winhex的新建文件中.
{string}文件指的就是那个{xxxx-xxxx-xxxx}名字的资源, 可以从il文件所在目录拿取.
可以控制字典文件是否包含列标头, 和控制伪ID列的数值格式.
在passolo中, 设置第一列为原文, 第三列为译文, 利用TM自动翻译即可.
2007-9-22 02:52
0
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
如果大篇幅的文字,强烈建议在记事本写好后,然后粘贴上来。
;)
2007-9-22 09:08
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
4
顶一下哈 楼主太有才了~ 以前只看到过  会C-Based语言的 即C#  和 Cpp的  。居然有人会两种风格差的比较大的  D和CS。
2007-9-22 15:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
厉害!!!!!!!顶个楼主!!!!!
2007-9-22 18:39
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵!来支持下!下次好来看!现在还没用到
2010-4-25 10:34
0
雪    币: 221
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有效防止浏览器崩溃导致编辑内容无法恢复
2010-4-25 22:02
0
游客
登录 | 注册 方可回帖
返回
//