sigh,最近看vbpcode看的头晕,一大堆代码摆在面前仿佛进了另一个世界。
看到了看雪以前的精华以及《加密与解密》【好书,推荐!!】,可是发觉还是
不着边际,自己资力不够当然是一个方面,可是我觉得很可能是没有找到一个
好的途径。所以在这儿发贴,希望大家指教!!!
我觉得我的困难出现在以下几个方面:
一)关于PCODE的各个语句不明白,而且我也google不到现成的资料解说,即使
有,对于同一个语句解说也是大相径庭,例如
4019B0: 04 FLdRfVar local_008C
4019B3: 21 FLdPrThis
以上的两句几乎各个程序都有,可是至今我没有找到关于它的解释,它们是什么意思呢?是像C语言的程序平衡堆栈类似的语句吗?
而且有时候不知道压入某个位置的值应该是什么,像下面的这个程序
★★★★★★★★★★★★★★★★★
Private Sub Command1_Click()
Dim a
Dim c
a = Len(Text1.Text)
c = Mid(Text1.Text, 1, a)
Text2.Text = c
End Sub
★★★★★★★★★★★★★★★★★
★★★★★★★★★★★★★★★★★
[Command1.Click]
:00401A3C 0454FF FLdRfVar ;Push LOCAL_00AC
:00401A3F 21 FLdPrThis ;[SR]=[stack2]
:00401A40 0FFC02 VCallAd ;Return the control index 01
:00401A43 1958FF FStAdFunc ;//呼叫下面功能模块
:00401A46 0858FF FLdPr ;[SR]=[LOCAL_00A8]
***********Reference To:[propget]TextBox.Text
|
:00401A49 0DA0000000 VCallHresult ;Call ptr_0040142C//取Text1的字符
:00401A4E 6C54FF ILdRf ;Push DWORD [LOCAL_00AC]//压入
:00401A51 4A FnLenStr ;vbaLenBstr//测长度
:00401A52 FD6944FF CVarI4 ;//转化整形->Var
:00401A56 FCF66CFF FStVar ;//长度存储
:00401A5A 2F54FF FFree1Str ;SysFreeString [LOCAL_00AC]; [LOCAL_00AC]=0
:00401A5D 1A58FF FFree1Ad ;Push [LOCAL_00A8]; Call [[[LOCAL_00A8]]+8]; [[LOCAL_00A8]]=0
:00401A60 0454FF FLdRfVar ;Push LOCAL_00AC//此处压入长度
:00401A63 21 FLdPrThis ;[SR]=[stack2]
:00401A64 0FFC02 VCallAd ;Return the control index 01
:00401A67 1958FF FStAdFunc ;//呼叫下面功能
:00401A6A 0858FF FLdPr ;[SR]=[LOCAL_00A8]
***********Reference To:[propget]TextBox.Text
|
:00401A6D 0DA0000000 VCallHresult ;Call ptr_0040142C//取Text1的字符
:00401A72 046CFF FLdRfVar ;Push LOCAL_0094//开辟内存空间,存储压入长度
:00401A75 F501000000 LitI4 ;Push 00000001//start参数
:00401A7A 3E54FF FLdZeroAd ;Push DWORD [LOCAL_00AC]; [LOCAL_00AC]=0//释放刚才压入长度的 空间
:00401A7D 4634FF CVarStr ;//字符串--->Var
:00401A80 0424FF FLdRfVar ;Push LOCAL_00DC//压入string参数
**********Reference To->msvbvm60.rtcMidCharVar
|
:00401A83 0A01001000 ImpAdCallFPR4 ;Call ptr_00401020; check stack 0010; Push EAX//函数执行
:00401A88 0424FF FLdRfVar ;Push LOCAL_00DC
:00401A8B FCF65CFF FStVar ;
:00401A8F 1A58FF FFree1Ad ;Push [LOCAL_00A8]; Call [[[LOCAL_00A8]]+8]; [[LOCAL_00A8]]=0
:00401A92 3534FF FFree1Var ;Free LOCAL_00CC
:00401A95 045CFF FLdRfVar ;Push LOCAL_00A4
:00401A98 FDFE54FF CStrVarVal ;
:00401A9C 21 FLdPrThis ;[SR]=[stack2]
:00401A9D 0F0403 VCallAd ;Return the control index 03
:00401AA0 1958FF FStAdFunc ;//呼叫下面功能代码
:00401AA3 0858FF FLdPr ;[SR]=[LOCAL_00A8]
***********Reference To:[propput]TextBox.Text
|
:00401AA6 0DA4000000 VCallHresult ;Call ptr_0040142C
:00401AAB 2F54FF FFree1Str ;SysFreeString [LOCAL_00AC]; [LOCAL_00AC]=0
:00401AAE 1A58FF FFree1Ad ;Push [LOCAL_00A8]; Call [[[LOCAL_00A8]]+8]; [[LOCAL_00A8]]=0
:00401AB1 13 ExitProcHresult ;
:00401AB2 FF Unknown ;
:00401AB3 FF Unknown ;
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
这时候,我就看不清到底是什么了,上面的注释猜的居多
比如
:00401A49 0DA0000000 VCallHresult ;Call ptr_0040142C//取Text1的字符
:00401A4E 6C54FF ILdRf ;Push DWORD [LOCAL_00AC]//压入
:00401A51 4A FnLenStr ;vbaLenBstr//测长度
:00401A52 FD6944FF CVarI4 ;//转化整形->Var
:00401A56 FCF66CFF FStVar ;//长度存储
:00401A5A 2F54FF FFree1Str ;SysFreeString [LOCAL_00AC]; [LOCAL_00AC]=0//这一步要干什么?
:00401A5D 1A58FF FFree1Ad ;Push [LOCAL_00A8]; Call [[[LOCAL_00A8]]+8]; [[LOCAL_00A8]]=0 //这又是在干什么?
:00401A60 0454FF FLdRfVar ;Push LOCAL_00AC//此处是不是在压入长度?
:00401A63 21 FLdPrThis ;[SR]=[stack2]
:00401A64 0FFC02 VCallAd ;Return the control index 01
:00401A67 1958FF FStAdFunc ;//呼叫下面功能
:00401A6A 0858FF FLdPr ;[SR]=[LOCAL_00A8]
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
现在字符的长度参数存储在哪儿了呢?
如果现在的长度存在LOCAL_00AC处,那么接下来的代码中
:00401A6D 0DA0000000 VCallHresult ;Call ptr_0040142C//取Text1的字符
:00401A72 046CFF FLdRfVar ;Push LOCAL_0094//开辟内存空间,存储压入长度
:00401A75 F501000000 LitI4 ;Push 00000001//start参数
:00401A7A 3E54FF FLdZeroAd ;Push DWORD [LOCAL_00AC]; [LOCAL_00AC]=0//★
:00401A7D 4634FF CVarStr ;//字符串--->Var
:00401A80 0424FF FLdRfVar ;Push LOCAL_00DC//压入string参数(?)
这个★步骤是在干什么呢?
而且我看教程上都在说Pcode也是参数从右向左压栈,查了MSDN后发现
Mid函数的格式是Mid(string, start[, length])
按照从右->左压,length应该先压,那么LOCAL_0094存储的是length吗?
但是如果是这样的LOCAL_00DC应该存储string了.可是总觉得这样的
猜想不太合理.求强人的指点!
二)Vbpcode的调试工具的使用,很多Crackme都有Anti的功能,使得VBParse认不出是VB程序
而VBexplorer不能加载,关掉WKTVBDE更是不再话下.这样的时候,应该怎么办呢?
三)由于关于这样的教程不是很多,能推荐几篇或几本好的书吗?我看小楼GG在一篇
帖子中提到<<VB PCODE研究>>,是他的帖子或是书吗?怎么搜不到这篇文章呢?
多谢各位能够在百忙中看我这篇帖子,不管你是否回帖都要感谢你!
谢谢!
[课程]Linux pwn 探索篇!