前言从哪里入手? 对于这种加了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 预处理指令进行转发 #pragma comment(linker, "xxxx")[url=][/url]故用 新dll 和 原dll 生成是没有区别的
在新代码生成后
新dll 就没用了 hook与其称之为hook,实际上就是普通的接管了
通过阅读load函数
得知需要将 原dll 重命名为 v8org.dll 开始接管 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;
|
| }
| [url=][/url]最终
提取了其js
及调用的相关函数
对后续分析提供了莫大帮助 总结有时候碰到问题
不能看到钉子就去找锤子
也许你仅仅需要一块板砖
|