首页
社区
课程
招聘
[求助]关于disassembler,兼做一个广告
发表于: 2005-2-4 16:43 5175

[求助]关于disassembler,兼做一个广告

RoBa 活跃值
16
2005-2-4 16:43
5175
关于写一个反汇编器,如何快速判断机器码对应的指令助记符,在OLLYDBG的源码里还有轻描淡写论坛里我看都是用一个MASK来把一个大表中的数据依次过一遍得到,但这样的算法复杂度是O(n)。我想是不是可以用散列表的方式实现呢,在OPCODE中起关键作用的我看好像就是一个字节,可不可以建立一个256个项的数组,用这个字节来作为索引呢,然后再处理有冲突的情况。这样用常数时间就可以了。Oleh一定是个超级高手吧,不应该想不到这种方法的,还是这种方法有什么问题?我只考虑的是386指令集,是不是加上其他的3DNow!,MMX什么的就不行了?望高手赐教。

另:有没有对算法和数据结构这些东东感兴趣的兄弟,欢迎来我的新BLOG坐坐(见下面签名,因为CSDN的那个不知道为什么发不了文章,又换了),初学,写了一些菜菜的东西,请多指教。也欢迎与我交换链接(不过我的网页没人看嘀~~~~

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
照着Intel手册的编码矩阵做就行了。
2005-2-4 17:21
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
3
我写过一个简单的 dasm (没有 floating point 指令 ),就是把 Intel 指令集的几个表用 array 做出来

主要的 opcode 表有两个,分?是 1 byte 指令表和 2 byte 指令表

还有其它的表

表的 element 是一个自定的 struct,它的 member 有 opcode, 操作数,和其它东西

制作这些表很累…  累死人
2005-2-4 17:52
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
兄弟做反汇编器。支持!
2005-2-4 18:07
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
5
我的想法就是把opcode当作array的下标,我试试先。

这几天ZOJ上没法做题,正好有时间。
2005-2-4 18:11
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
好呀,绝对支持roba!
2005-2-4 18:41
0
雪    币: 275
活跃值: (466)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
反汇编可以肯很多的实现,最快的应该是查表!你说的用OPCODE当下标,这是编译器的事,现在的编译器已经做得够好的,以前人工做的优化,现在编译器也可以帮你做了。我个人感觉反汇编器重要的是智能,而不是速度!
2005-2-4 20:21
0
雪    币: 1583
活跃值: (976)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
8
用hash是行不通的,因为如果算上SSE、SSE2、3DNOW!等指令集的话,你会发现opcode必须是3个字节的,这是其一。

其二,因为有prefix的缘故,例如假设在默认32位的情况下:

6635 : xor eax, 00000000
35   : xor ax, 0000

这还只是一个prefix的情况,而prefix是可以有多个的,而且它们的排列是可以不按照顺序的。如果这样的话,光是用hash来解决prefix就会产生一个巨大的集合。
2005-2-4 21:18
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
9
prefix数目有限,我想可以用预先的处理解决。

不过要想支持更多的指令集,是个大问题……
2005-2-4 21:51
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
10
偶最近也在搞这个阿――因为找不到合适的库。

或者可以考虑构造特殊的哈希函数来定位,不过没有试过,而且毕竟在汇编中查寻表算法在这种情况下效率最高。
2005-2-5 11:58
0
游客
登录 | 注册 方可回帖
返回