首页
社区
课程
招聘
[求助]关于山寨版IceSword中一个函数的疑惑
发表于: 2010-2-12 21:51 5535

[求助]关于山寨版IceSword中一个函数的疑惑

2010-2-12 21:51
5535
最近学写驱动,都搞了很多天了,关于取得DLL基址,老是出问题,高手帮忙看看
GetFuncTionAddress proc uses ecx esi lpFunctionName:PCHAR , pDllName:PUNICODE_STRING
local @hFile , @hSection ,@temp

local @size:LARGE_INTEGER
local @BaseAddress:PVOID
local @liViewSize:_LARGE_INTEGER ;用于节映射
local @pBaseAddress;
local @oa:OBJECT_ATTRIBUTES
local @iosb:IO_STATUS_BLOCK
        lea ecx, @oa
        InitializeObjectAttributes ecx, pDllName, OBJ_CASE_INSENSITIVE , NULL, NULL
        invoke DbgPrint, $CTA0("\n-----00--------\n")
        invoke ZwOpenFile , addr @hFile , FILE_EXECUTE or SYNCHRONIZE , addr @oa , addr @iosb , FILE_SHARE_READ , FILE_SYNCHRONOUS_IO_NONALERT
        .if eax != STATUS_SUCCESS
                invoke DbgPrint, $CTA0("\n打开dll文件失败:%X\n"),eax
                ret
        .endif
        invoke DbgPrint, $CTA0("\n-----01--------\n")
        lea eax , @oa
        assume eax:ptr OBJECT_ATTRIBUTES
        mov [eax].ObjectName , 0       
        assume eax:nothing
        invoke ZwCreateSection , addr @hSection , SECTION_ALL_ACCESS , addr @oa , 0,PAGE_EXECUTE, SEC_IMAGE, @hFile
        .if eax != STATUS_SUCCESS
                invoke DbgPrint, $CTA0("\n创建节失败:%X\n"),eax
                ret
        .endif
        invoke DbgPrint, $CTA0("\n-----02--------\n")
        and @BaseAddress , 0
        and @size.HighPart, 0
        and @size.LowPart, 0
        invoke ZwMapViewOfSection , @hSection , NtCurrentProcess , addr @BaseAddress , 0 , 1000 , 0 , addr @size , 1 , MEM_TOP_DOWN, PAGE_READWRITE
        .if eax != STATUS_SUCCESS
               
                invoke DbgPrint, $CTA0("\n节映射失败:%X\n"),eax

                invoke ZwClose,@hFile
                ret
        .endif
        invoke ZwClose,@hFile
        invoke DbgPrint, $CTA0("\n-----OK--------\n")
       
        ret
GetFuncTionAddress endp

winDBG调试信息如下:

-----00--------

-----01--------

-----02--------

节映射失败:40000003

还请各位指点一下,为什么我的函数调用 没有成功?谢谢

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
都告诉你错误了,自己不会查吗?

#define STATUS_IMAGE_NOT_AT_BASE         ((NTSTATUS)0x40000003L)

这么基础的排错都不会还拿汇编写程序,真是无语了。

40000003不是错误信息,处理0xc0000000以上的即可。
2010-2-12 23:38
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
膜拜偶像mj牛
2010-2-12 23:53
0
雪    币: 101
活跃值: (134)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
谢谢二楼指点,错误信息我早查过了,但还是不明白如何处理。能说具体点吗,另外,我是业余搞程序玩玩,只会用汇编语言,因为C的数据类型让我头大,见谅!以前写的小程序都是拿汇编搞的, 以上代码是我自己仿照看雪下载的IceSword中的驱动部分进行改造的试验品。
2010-2-13 00:10
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
判断状态码应该用if(NT_SUCCESS(status))
2010-2-13 07:13
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
牛人  你怎么那么厉害啊
2010-2-13 07:27
0
雪    币: 101
活跃值: (134)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
虽然被高手使劲PS,但是我还是要提问。。

节映射失败:40000003

地址:7FE80000
我插入int 3 中断后dd 7FE80000了一下,发现内存不可读,烦劳再指点一下,谢谢
2010-2-13 10:29
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
用调试器当然读不了。你自己读就可以读了
2010-2-13 10:52
0
雪    币: 101
活跃值: (134)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
激动中。。
读取成功!!谢谢楼上的耐心回复!
另外,我不知道为什么调试器读不了,在程序中
                mov eax , @BaseAddress
                mov eax , [eax]
                invoke DbgPrint, $CTA0("\n试试看:%X\n"),eax
eax真的等于MZ,为什么调试器会读取不了?
2010-2-13 12:07
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
调试器会检查地址是否确实映射了物理内存,没有就报告读取失败,对PAGEOUT的就无法读取了。
你用mapsection映射的地址实际是没有映射物理内存的,等到你读取时,才会触发#pf然后由NTKRNL从磁盘上读取映射的文件,MAP到对应地址上。
2010-2-13 12:26
0
雪    币: 101
活跃值: (134)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
明白了,因为哪段物理地址调试器在读取时被标记有“脏的”,就是说没有被读入到内存中,所以会出现问题。看来还要恶补一下分页。谢谢楼上,全明白了,受益非浅,已收到新年最好的礼物,谢谢楼上。
2010-2-13 12:30
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
看来还是半懂
2010-2-13 13:04
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
13
调试器在读取时 标记的是 无效,不是脏.
2010-2-13 13:15
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
15
同感.
阴文不好见了那么大的词汇量就心里发怵,也就能使使ASM了。
2010-2-14 01:08
0
游客
登录 | 注册 方可回帖
返回
//