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密码的请无视。 ...未完...待续,待修改.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!