代码改变世界

牛刀小试:记某一软件反向工程试验

2011-11-22 17:20  robinli  阅读(505)  评论(0编辑  收藏  举报

因为需要,需要解除一个软件的License限制,所以进行一次反向工程试验,特将过程记录下来。

1.分析目标软件编程语言:经过查看安装手册,发现需要安装DOTNET2.0,呵,看来是DOTNET下的系统了。

2.尝试使用Reflector反编译:用:Reflector,加载主程序,提示不是DOTNET格式程式,看来加壳

3.解壳:这时首先得用到NETUNPACKER这个强大而通用的家伙,果然UNPACK一堆DLL与EXE.

4.再次使用Reflector加载上面得到的DLL:使用查找功能,查找提示限制时的字符“过期”,无法找到。同时发现缺少一个关键的DLL(WebGi*.dll(全名略去,呵,软件公司别找上我)

5.因为担心是我使用是未使用到该DLL的功能 ,导致使用NETUNPACK未能解出该DLL,通过反复操作第4步与第5步,还是无法得到。

6.上OLLYICE: 附加调试的程序,在使用该系统时发现一个错误,错误提示:frmBZZHTJ.fixgdb()调用这个方法有问题,看错误是在上面缺少的这个DLL中抛出来。那我们就在内存中查找“frmBZZHTJ”这个字符,果然找到,然后向上查找“MZ”标记(为什么这样,呵,想知道的人找找相关资料),果然找到。备份->另存数据为对应名称的DLL.

7.使用Reflector载入DLL: 哇,果然正确,这是一个超大的DLL,有15M之大,看来NETUNPACK可能是存在某种限制,不能UNPACK这么大的DLL.

8.在上的DLL中查找:”过期“字符串,顺处找到目标,所有有关限制均调用同一函数,呵。只有使用ReflectIL插件重写该函数就可以。

9.可惜没学好MSIL,看了一下不好改,时间急没法立即学习。但难不倒我,用C#写一个我想要的同样函数(呵,其实就是总是返回TRUE),编译后使用同样的工具查看其IL,依次复制过来就搞定啦

10.使用RelectIL另存为新的DLL,复制到目标程序目标下,OK,一切运行正常。