巧用DLL劫持做黑盒分析
前言
之前因需分析某加了SE壳的易语言程序。
从哪里入手?
对于这种加了vmp壳
而分析价值又不高的目标
首先想到的不应是如何还原
而是通过黑盒方式分析其原理
当然这种方式对于纯粹的算法程序就无计可施了
该程序文件结构如下:
程序.exe
v8.dll
一般来说
易语言程序很少会调用dll
从名字上看 v8.dll
的作用是为了让程序能跟 js
交互
在IDA中查看导出表也能很快验证之前的猜想
那么目标就确定了
虽然不能很快的分析源程序
但是可以较为容易的获得 ExecJavaScriptV8
的参数
从而得到一些便于分析的内容
DLL劫持
原理说起来也很简单
通过伪造一个 v8.dll
替换掉原 v8.dll
然后在 新v8.dll
中将所有导出函数转回 原v8.dll
那么就可以在源码层面去控制导出函数了
这种方式可能会被文件效验
的方式检测
本程序中不存在文件效验
本文也不打算讲如何绕过文件效验
此时新的文件结构应如下:
程序.exe
v8.dll
v8Org.dll
AheadLib
要生成一个转发dll
最快的方式莫过于使用 AheadLib
其中AheadLib
存在两个常见的版本
本文这个 v8.dll
是一个复杂的 c++
程序
在AheadLib-x86-x64
直接拖入会崩溃
在AheadLib +
中没有什么问题
只是在生成即时调用
时
生成的代码有问题
如果可以直接生成即时调用
那本文也就到此结束了
另外AheadLib-x86-x64
生成的代码框架要优于AheadLib +
这里我采用的方法是用AheadLib +
先生成一份 v8Org.cpp
编译之
得到一个新的 v8.dll
再将刚刚生成的v8.dll
拖入AheadLib +
如此一来便可得到新的 v8.cpp
由于生成的代码是使用的 pragma
预处理指令进行转发
1 |
故用 新dll
和 原dll
生成是没有区别的
在新代码生成后
新dll
就没用了
hook
与其称之为hook,实际上就是普通的接管
通过阅读load函数
得知需要将 原dll
重命名为 v8org.dll
开始接管 ExecJavaScriptV8
注意 AheadLib_ExecJavaScriptV8
是裸函数
注意 /EXPORT:ExecJavaScriptV8=_AheadLib_ExecJavaScriptV8
有个下划线代表是内部函数
其中 @3
代表该函数有3个参数
实际这个函数是__thiscall
但是查看参数不需要理会 this
指针
网上搜一下
很容易找到原型
前两个参数是 char*
第三个是 BOOL
1 | char* text; |
最终
提取了其js
及调用的相关函数
对后续分析提供了莫大帮助
总结
有时候碰到问题
不能看到钉子就去找锤子
也许你仅仅需要一块板砖