怎么调试有Hook的DLL样本
样本hash:5BBEFA25D955C4C5737A8C665AE48F1A
该样本VT和微步在线都能得到,属于parite家族,使用了多态变形技术进行躲避传统杀毒软件的特征码查杀。查壳发现有UPX壳,这个样本让我比较新奇的是,在你脱壳的时候就将恶意行为做完了,以开启全局钩子的方式将恶意DLL文件注入到多个进程,在注入DLL对进程进行判断,如果不是explorer则退出,并开启线程,对计算机中其他文件进行感染,即使将钩子卸载也无济于事。
这里我只是简单记录下学习过程,不对感染行为做分析(主要自己太菜,新线程是断不下来)。拿到样本,第一步先查壳,如图,显示是upx压缩壳。
既然是UPX壳,那么就使用ESP定律,一脱到底。使用OD载入,发现找不到pushxx,那就单步吧。
使用单步法找OEP,虽然笨,好用(哈哈哈),单步就发现问题了,估计是为了防止杀软的特征码查杀,它对样本进行动态解密。
解密之后:
是不是很有意思,单步进去,然后进第一个call,可以看到一抹多的LoadLibraryA和GetProcAddress函数,这是壳代码无疑了。
然后进第二个call,查询注册表的,没意思。
进第三个call,这个就有意思了。先获取样本模块,在拿到句柄,获取temp的路径,然后向temp路径解密写入一个temp文件,这个temp文件是一个dll文件,大小为173kb,名字随机。
然后将写入temp的完整路径作为参数传进第四个call,跟进去看。啥?LoadLibraryA,它居然加载了这个temp(实际为dll),然后GetProcAddress获取导出函数Initiate并执行它。
跟进Initiate函数,打开互斥体,关键在于它建立了一个全局钩子。
执行完SetWindowsHookExA函数,使用PCHunter32查看,下钩成功。
然后继续单步,最后会看到pushad,ESP定律脱壳就行了,不是重点,不做解释。
既然是一个dll文件,肯定要有载体加载它,那么调试这个dll,需要找一个载体,那就使用Notepad++吧,将其改名为explorer.exe(为什么要改呢?你分析dll就知道了)。其次,既然我选择的是记事本方式加载它,为了加载成功,我将SetWindowsHookExA函数的1参idHook的值改为2,为啥,查msdn呗。(挂钩键盘更方便我们调试)
改之前:
改之后:
运行挂钩函数后,用PCHunter32看看挂成功没,然后去改Notepad++名字:
改好之后将Notepad++用OD打开,然后F9运行起来,再更改调试设置,中断于新模块。
此时程序是运行起来的,当你往Notepad++输入任何东西时,程序马上断下来,并显示新模块。
可以看到模块入口点为02501B90,CTRL+G跳转到这个地址,F2下断。
此时样本释放的dll已经被我们加载了,可以愉快的调试了。但是,你会发现这个temp文件加了UPX壳,使用IDA时,你得先脱壳,来吧,继续脱壳。
为什么我还说这个呢,因为这个UPX壳的OEP是真奇怪,第一次见,顺带记录一下吧!
JMP为OEP,惊悚,刺激!!!