首页
论坛
专栏
课程

[调试逆向] [原创]修改一个C#程序的SevenZipSharp.dll文件,获取ZIP密码

2019-6-17 15:41 1028

[调试逆向] [原创]修改一个C#程序的SevenZipSharp.dll文件,获取ZIP密码

2019-6-17 15:41
1028
没什么技术含量,记录自己找出一个被C#程序加密后的ZIP文件密码

我用的一个软件每次修改设置后都会备份一次配置文件,有了这个配置文件后就可以恢复我的设置,但是此备份的配置文件是个加密的ZIP文件,因此想恢复以前的设置必须得知道密码。
试了各种可能的密码还是不对,因此我决定尝试通过分析这个软件来找出密码
这个软件安装文件太多,得先缩小范围,确定压缩在哪个模块里面
先在程序安装目录,查找有没有用来加密的可疑文件,比如zlib.dll,结果没有找到

尝试使用Process Monitor,打开过滤器,添加不是该进程名的排除的过滤项。捕获所有和这个进程有关的事件,找出和写入加密ZIP文件有关的WrtiteFile事件,在事件中查看堆栈。最终引出7z.dll和SevenZipSharp.dll这两个文件,通过搜索发现SevenZipSharp.dll好像是个C#程序集,调用的7Z.dll。查看这两个文件的导出函数表,没有什么可利用的函数。

抱着尝试的心态用NET.Reflector反编译SevenZipSharp.dll,意外的顺利
展开SevenZip命名空间,发现有个SevenZipCompressor类

展开SevenZipCompressor类,里面有4个CompressFilesEncrypted函数,看名字和参数名很容易就知道这个就是用密码压缩文件的
只要拦截这个函数再在里面把密码用消息框的形式显示出来就行了,编辑代码可以去下载一个reflexil插件,添加完插件后在工具里面打开reflexil

试了下用reflexil替换所有代码,居然编译出错,无奈只好尝试一句一句的去添加了

选中编号7的那行,右键创建新的指令,在创建新指令的对话框中,输入操作码call,操作数类型为方法,操作数为System.Windows.Forms命名空间里面MessageBox类中Show方法,选完后点击插入到选中之前就行了
然后再在call之前添加指令ldarg.2,表示把参数2也就是password压入栈。
再在call之后添加pop,因为MessageBox的方法Show会返回一个DialogResult的值,函数返回后返回值应该被压入到栈了,pop指令把返回值出栈,这点我也不是很明白。
因为有4个重载函数,每个按照以上方法添加完后,在程序集右键的reflexil菜单里点击保存,重新打开修改后DLL后,如下图,编号7、8、9指令是我添加的


把修改后DLL替换掉软件安装目录下的SevenZipSharp.dll,最后程序成功弹出对话框,密码获取成功!





[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (0)
游客
登录 | 注册 方可回帖
返回