首页
社区
课程
招聘
请教汇编基础问题
发表于: 2009-12-18 18:47 3275

请教汇编基础问题

2009-12-18 18:47
3275
.code
iidtable:
dd	iattable-iidtable
dd	12345678h
dd	87654321h
dd	dll-iidtable
dd	iattable-iidtable
dd	0
iattable:
PsCreateSystemThread	dd	_PsCreateSystemThread-iidtable-2
KeServiceDescriptorTable	dd	_KeServiceDescriptorTable-iidtable-2
MmGetSystemRoutineAddress	dd	_MmGetSystemRoutineAddress-iidtable-2
dd	90h
_PsCreateSystemThread	db	'PsCreateSystemThread',0
_KeServiceDescriptorTable	db	'KeServiceDescriptorTable',0
_MmGetSystemRoutineAddress	db	'MmGetSystemRoutineAddress',0
dll			db	'ntoskrnl.exe',0

NtOpenThread_addr		dd	?

;--------------省略中间过程------------------------------------
	push	offset $CCOUNTED_UNICODE_STRING("NtOpenProcess")
	call	MmGetSystemRoutineAddress


请教一下:
1.

NtOpenThread_addr dd ?

上面这个变量定义在.code段是什么原因?不是应该定义在.data段吗?

2.

push offset $CCOUNTED_UNICODE_STRING("NtOpenProcess")
call MmGetSystemRoutineAddress

MmGetSystemRoutineAddress不是函数,为什么可以直接call?

3.

iidtable:
dd iattable-iidtable
dd 12345678h
dd 87654321h
dd dll-iidtable
dd iattable-iidtable
dd 0
iattable:

这里的12345678h和87654321h是乱写的吗?看不出来有什么用。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
问题1
个人编写风格问题,为什么.CODE不可以定义变量呢 如果对齐为4 我测试.CODE段不用声明都可以写,不知道和我程序没有快表有关系
问题2
call dword ptr [MmGetSystemRoutineAddress],只是你不习惯ASM的写法而已
问题3
是我写的,我为了给我修改的连接器看的

判断是不是有手工书写的输入表

你就不要用其他的LINK连接了

还是看懂自己写个把
2009-12-18 21:07
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问题一:楼主,建议你查下汇编指令 OFFSET  XX 和 LEA  寄存器,XX 语句有什么区别。
OFFSET  XX 你必须在编译器确定当前段寄存器的的值才能正确识别到这个标记。而LEA  寄存器,XX 无此要求。32位,在反汇编语言里,一个段对应N个OFFSET  XX 中的XX标记,XX标记必须在该段中定义(这个是我的体会,大家请多指教)

问题二:楼主,.code 前面是否有    MmGetSystemRoutineAddress   XX  XX  这样的定义。这个应该相当于程序的 IAT表(加载器负责填写API地址)。如果没有,那么你中间
;--------------省略中间过程------------------------------------

肯定有不能省略。

问题三:前2个问题没弄懂,那你很难看懂代码,就很难看出来这个是不是有意的。
2009-12-18 21:23
0
雪    币: 2733
活跃值: (2550)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢两位的热心指导!
2009-12-19 00:43
0
游客
登录 | 注册 方可回帖
返回
//