这啥论坛怎么有这么无敌的功能, 写完帖子, 在编辑框摁了几下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
[课程]Android-CTF解题方法汇总!