首页
社区
课程
招聘
[翻译]使用OllyDbg从零开始Cracking 第三十章-P-CODE-Part2
发表于: 2014-7-13 16:52 12140

[翻译]使用OllyDbg从零开始Cracking 第三十章-P-CODE-Part2

2014-7-13 16:52
12140
[COLOR="Red"][FONT="Arial Black"][SIZE="6"]使用OllyDbg从零开始Cracking[/SIZE][/FONT][/COLOR]
6c → ILdRf   将指定操作数压入堆栈
1b → LitStr5  将字符串压入堆栈
fb → Lead0 
30 → EqStr 比较两个字符串(与Lead0配合使用)
2f → FFree1Str 释放内存空间
1a → FFree1Ad 释放内存空间
0f → VCallAd 通过虚拟机运行操作码
1c → BranchF 条件跳转指令,如果栈顶的值为false则跳转(相当于汇编指令JNE/JNZ)
1d → BranchT 条件跳转指令,如果栈顶的值为true则跳转(相当于汇编指令JE/JZ)
1e → Branch 无条件跳转(嘿嘿,相当于汇编指令JMP)
fc → Lead1 
c8 → End 终止程序(与Lead1配合使用)
f3 → LitI2 将立即数压入堆栈
f4 → LitI2_Byte 将指定数据转化为字节整型并压入堆栈
70 → FStrI2 将栈顶的WORD型元素保存到内存单元中,然后执行出栈操作
6b → FLdI2 将WORD型参数压入堆栈
a9 → AddI2 栈顶两个WORD型元素相加,相加的结果置于栈顶
ad → SubI2 栈顶两个WORD型元素相减,相减的结果置于栈顶
b1 → MulI2 栈顶两个WORD型元素相乘,相乘的结果置于栈顶

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (16)
雪    币: 2673
活跃值: (3560)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
,77张图片传的偶眼冒金星...  ,要是坛子的编辑功能能像Discuz!论坛那样可以节省多少时间呀...
2014-7-13 16:56
0
雪    币: 756
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主辛苦了!
2014-7-13 18:51
0
雪    币: 7081
活跃值: (3608)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
占位~~~~
lz辛苦了
2014-7-13 18:55
0
雪    币: 7081
活跃值: (3608)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
看了下lz的译文,很详细,收下了,但是有几个错误要指出。

fb → Lead0 比较两个字符串
30 → EqStr 比较两个字符串(与Lead0配合使用)
2f → FFree1Str 释放内存空间
1a → FFree1Ad 释放内存空间
0f → VCallAd 通过虚拟机运行操作码
1c → BranchF 条件跳转指令,如果栈顶的值为false则跳转(相当于汇编指令JNE/JNZ)
1d → BranchT 条件跳转指令,如果栈顶的值为true则跳转(相当于汇编指令JE/JZ)
1e → Branch 无条件跳转(嘿嘿,相当于汇编指令JMP)
fc → Lead1 终止程序

vb p-code指令中Lead0、Lead1、Lead2、Lead3、Lead4是没有意义的,具体意义要看后一个操作码。
VB 的p-code是按byte取操作码执行的,那样的话就只有256中操作符可供使用了。
但是p-code有1000多条指令,256条肯定是不够的,所以就出现Lead(引导)指令。
这里觉得叫Lead指令为扩展指令比较贴切。
首先简单说明一下p-code指令格式:
<标准指令前缀> [扩展指令前缀] [定参] [变参]
定参: 固定参数
变参: 可变参数
当vb虚拟机(vbvm)开始取指令时,是按照指令前缀来进行操作的。
标准指令前缀为1个字节。当指令前缀范围在0xFB~0xFF(Lead0=0xFB,Lead1=0xFC,Lead2=0xFD,Lead3=0xFE,Lead4=0xFF)
范围内时,存在扩展指令前缀(1 Byte),取得了指令前缀仅仅是知道了定参的格式。
变参是根据定参来定义的。参考Semi VB Decompiler 的源码,有部分指令的指令大小被设置成-1。
这种指令就存在变参。对于有变参的指令来说,其定参是固定的,为1个WORD。
这个WORD描述的是紧随其后的变参的大小(长度),是以字节为单位的。但是正常情况下该定参永远不会是奇数。
因为变参实际上是一个WORD数组,vbvm一般是释放数组所表示的内存指针。
另外在MSVBVM60.dll中,有6张跳转表。
分别是:
std       [256]
lead0    [256]
lead1    [256]
lead2    [256]
lead3    [256]
lead4    [71]
std就是标准指令前缀。当标准指令前缀范围在0xFB~0xFF范围时,取扩展指令前缀。并跳转到扩展指令跳转表里。
2014-7-13 19:42
0
雪    币: 2673
活跃值: (3560)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
6
感谢bxc兄的指正,文中已更正... bxc兄对P-CODE很有研究啊...  
2014-7-13 19:53
0
雪    币: 7081
活跃值: (3608)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
没有啦,就是最近在搞p-code相关的东西,把VB的源码翻译成C++的,快恶心吐了
2014-7-13 19:56
0
雪    币: 2673
活跃值: (3560)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
8
,好犀利的赶脚...
2014-7-13 19:57
0
雪    币: 7081
活跃值: (3608)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
没多犀利搞了快半年了,还没整出来。。
2014-7-13 20:08
0
雪    币: 196
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主辛苦了,七十七张图换了可能是一群后面的感谢
2014-7-16 20:04
0
雪    币: 1737
活跃值: (342)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主幸苦
不明觉厉
2014-7-17 11:33
0
雪    币: 111
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
77张图片,辛苦了
2014-7-19 10:32
0
雪    币: 244
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主厉害啊.老菜鸟来支持
2014-7-21 11:01
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了。。。。
2014-7-21 15:14
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我潜了好多年了,看了安哥的教程 不得不说,安哥真是为我等菜鸟提供了很好的教材,在这里 真心谢谢安哥。
2014-7-21 21:29
0
雪    币: 2673
活跃值: (3560)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
16
都是从小鸟过来的,共同进步挺好...
2014-7-21 21:38
0
雪    币: 437
活跃值: (309)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
谢了,LZ有劳了。
2014-8-13 17:10
0
游客
登录 | 注册 方可回帖
返回