[原创]VBA逆向初探
VBA逆向的资料很难找,VB的能找到一些,VB历史已久远,价值可能不是很高,再研究价值可能不是很高。本文是本人研究的...不一定正确,当是抛砖引玉,边研究,边修改。想到什么,研究什么,就写什么。
本文以ACCESS 2000 的VBA 为研究对象。
以下开始,
1.access 2000 的文件MDB MDE是以4K,4096字节对齐,下面一个4096字节叫页。有点意思,一些文件系统也是4K对齐?是不是有关系?
2.access 2000 的VBA代码是存储在 msaccessobject表。和其他表存放方式似乎不同。在ACCESS 打开隐藏的系统表可以看到,导出就有问题。
用MDBTOOLS不支持VBA对象。
所以没有能真正用的工具。只能DIY。
很容易就可以找到存放VBA代码的页。
数据一般从页的0X5D 开始,到页0ff4结束。
0x04是一个DWORD的类型。代表VBA数据定义页.
ff5是一个DWORD的类型。是代表的当前多少页。
根据任何一个VBA数据页,可以找VBA数据定义页,根据数据定义页,遍历MDE所有页,简单的C语言写个代码就可以dump出vba的数据。
3.变量,VBA的P-CODE 应该是能找到数据定义类型的。可以逆向CodeProtector这个软件看看。
4.函数,VBA的函数之前有一个DWORD,代表函数的长度.
一般是0x00 largeboss的代码开始。
可以在vbe6.dll下switch() 的断点。VBE6.DLL 版本6.0.84.35 。
base 在 65080688
lead1(fb) 在 65080a88
lead2(fc) 在 650800e88
lead3(fd) 在 65081288
lead4(fe) 在 65081688
lead(ff) 在 65081a88
VBA虚拟机的IP是使用ESI。嗯嗯,调试的时候跟随[ESI]的数据,避免跟丢了。
5.thiscall
thiscall的指令码为0x10 要特别小心,跟踪进去,会调用this的方法。可以dump出来,反编译.
有个CALL,跟进去,会改变[ESI]的数据,也就是虚拟机的指令。这时候就到了thiscall 的子程序里面。
退出子函数时,会pop ESI,这时会到了 父函数。
6.反编译
反编译vb的不少,vba的很少。基本只能自己写点小工具反汇编。有很多开源的代码可以利用。
网上找的VB的P-CODE 基本不能用,有些事加密的。这份P-CODE指令,是我自己修改过的。只适用VBE6.DLL还有部分指令,未完成逆向。根据这份指令,自己完全可写一个反汇编的程序出来。很简单。
OPCODES.TXT
这个帖子是探索逆向VBA的PCODE,逆向VBA程序的算法,想破解ACCESS密码的请无视。
...未完...待续,待修改.
