巧用DLL劫持做黑盒分析



前言

之前因需分析某加了SE壳的易语言程序。

从哪里入手?

对于这种加了vmp壳
而分析价值又不高的目标
首先想到的不应是如何还原
而是通过黑盒方式分析其原理

当然这种方式对于纯粹的算法程序就无计可施了

该程序文件结构如下:

程序.exe
v8.dll

一般来说
易语言程序很少会调用dll
从名字上看 v8.dll 的作用是为了让程序能跟 js 交互

image-20221010175922346

在IDA中查看导出表也能很快验证之前的猜想

那么目标就确定了
虽然不能很快的分析源程序
但是可以较为容易的获得 ExecJavaScriptV8 的参数
从而得到一些便于分析的内容

DLL劫持

原理说起来也很简单
通过伪造一个 v8.dll替换掉原 v8.dll
然后在 新v8.dll中将所有导出函数转回 原v8.dll

那么就可以在源码层面去控制导出函数了
这种方式可能会被文件效验的方式检测

本程序中不存在文件效验
本文也不打算讲如何绕过文件效验

此时新的文件结构应如下:

程序.exe
v8.dll
v8Org.dll


AheadLib

要生成一个转发dll
最快的方式莫过于使用 AheadLib

其中AheadLib存在两个常见的版本

image-20221010175954304

本文这个 v8.dll 是一个复杂的 c++ 程序
AheadLib-x86-x64 直接拖入会崩溃

AheadLib +中没有什么问题
只是在生成即时调用
生成的代码有问题

如果可以直接生成即时调用
那本文也就到此结束了

另外AheadLib-x86-x64生成的代码框架要优于AheadLib +

这里我采用的方法是用AheadLib + 先生成一份 v8Org.cpp
编译之
得到一个新的 v8.dll
再将刚刚生成的v8.dll拖入AheadLib +
如此一来便可得到新的 v8.cpp
由于生成的代码是使用的 pragma 预处理指令进行转发

1
#pragma comment(linker, "xxxx")

故用 新dll原dll 生成是没有区别的
在新代码生成后
新dll 就没用了


hook

与其称之为hook,实际上就是普通的接管

image-20221010180033825

通过阅读load函数
得知需要将 原dll 重命名为 v8org.dll

开始接管 ExecJavaScriptV8

image-20221010180054176

注意 AheadLib_ExecJavaScriptV8 是裸函数
注意 /EXPORT:ExecJavaScriptV8=_AheadLib_ExecJavaScriptV8 有个下划线代表是内部函数

其中 @3 代表该函数有3个参数
实际这个函数是__thiscall
但是查看参数不需要理会 this 指针
网上搜一下
很容易找到原型

image-20221010180115984

前两个参数是 char*
第三个是 BOOL

1
2
3
4
5
6
7
8
9
10
11
char* text;
ALCDECL AheadLib_ExecJavaScriptV8(void)
{
// 获取参数一
__asm {
push[esp + 0x8]
pop[text]
}
// 输出 text -- 省略
__asm JMP pfnExecJavaScriptV8;
}

最终
提取了其js
及调用的相关函数
对后续分析提供了莫大帮助

总结

有时候碰到问题
不能看到钉子就去找锤子
也许你仅仅需要一块板砖