前言

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

从哪里入手?

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

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

该程序文件结构如下:

程序.exe
v8.dll

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

IDA 导出表

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

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

DLL劫持

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

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

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

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

程序.exe
v8.dll
v8Org.dll


AheadLib

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

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

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

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

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

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

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

#pragma comment(linker, "xxxx")

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


hook

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

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

开始接管 ExecJavaScriptV8
接管ExecJavaScriptV8

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

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

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

char* text;
ALCDECL AheadLib_ExecJavaScriptV8(void)
{
  // 获取参数一
  __asm {
    push[esp + 0x8]
    pop[text]
  }
  // 输出 text -- 省略
  __asm JMP pfnExecJavaScriptV8;
}

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

总结

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