首页
社区
课程
招聘
关于文件读、写中断时堆盏的意义
发表于: 2005-8-9 10:32 4567

关于文件读、写中断时堆盏的意义

2005-8-9 10:32
4567
中断处:
00409E2C             E8 27D9FFFF         call <jmp.&kernel32.WriteFile>

堆栈情况:

0012F8C4   000001C8   |hFile = 000001C8 (window)
0012F8C8   001A0F48   |Buffer = 001A0F48
0012F8CC   00001EE0   |nBytesToWrite = 1EE0 (7904.)
0012F8D0   0012F8D8   |pBytesWritten = 0012F8D8
0012F8D4   00000000   \pOverlapped = NULL
0012F8D8   00001EE0
0012F8DC   001A0F48   ASCII "[XPTaskbar]
File=osxp\xpstrict.xp

请问大家怎么样知道是读了那个文件或写那个文件呢?

另外这时候堆栈中的参数就是传给API的参数值吧?

[Personality]
UsesTran=0
BUTTONCOUNT=16
TextAlignment=0
TextShift=18
TextShiftVert=3
TextRightClip=50
menubar=menu.bmp
TileLeftMenu=0
TileRightMenu=0
MenuLeftTile=4
MenuR=86
MenuG=158
Me"...

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 47147
活跃值: (20470)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
BOOL WriteFile(

    HANDLE hFile,        // handle to file to write to
    LPCVOID lpBuffer,        // pointer to data to write to file
    DWORD nNumberOfBytesToWrite,        // number of bytes to write
    LPDWORD lpNumberOfBytesWritten,        // pointer to number of bytes written
    LPOVERLAPPED lpOverlapped         // pointer to structure needed for overlapped I/O
   );       

调用时如下:
push lpOverlapped            // pOverlapped = NULL
push lpNumberOfBytesWritten  // pBytesWritten = 0012F8D8
push nNumberOfBytesToWrite   // nBytesToWrite = 1EE0 (7904.)
push lpBuffer                // Buffer = 001A0F48
push hFile                   // hFile = 000001C8 (window)
call WriteFile

你在OD堆栈中看的数据就是传给WriteFile的参数。

Buffer = 001A0F48  -》001A0F48   ASCII "[XPTaskbar] File=osxp\xpstrict.xp
写的文件应是:xpstrict.xp
2005-8-9 10:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
upm
3
writefile函数第一个参数是文件句柄,通过CreateFileA函数返回的。从WriteFile函数的参数以及相关堆栈无法查出来到底写的什么文件,这里之所以查出来了,是利用了堆栈相关性而已,也就是说上面这个文件只是作为参考,未必真的就是写的文件。正确方法是拦截这个函数前面的CreateFileA函数,看看第一个参数指向的内容
2005-8-9 11:21
0
雪    币: 205
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 upm 发布
writefile函数第一个参数是文件句柄,通过CreateFileA函数返回的。从WriteFile函数的参数以及相关堆栈无法查出来到底写的什么文件,这里之所以查出来了,是利用了堆栈相关性而已,也就是说上面这个文件只是作为参考,未必真的就是写的文件。正确方法是拦截这个函数前面的CreateFileA函数,看看第一个参数指向的内容


那请问您能不能根据writefile函数第一个参数文件句柄“hFile”查到具体读写的文件路径呢?
2005-8-9 11:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
upm
5
拦截这个函数前面的CreateFileA函数,看看第一个参数指向的内容
2005-8-9 11:37
0
雪    币: 205
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 upm 发布
拦截这个函数前面的CreateFileA函数,看看第一个参数指向的内容


0012FA88   00500D5C  |FileName = "\\.\REGVXD"
0012FA8C   C0000000  |Access = GENERIC_READ|GENERIC_WRITE
0012FA90   00000003  |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012FA94   00000000  |pSecurity = NULL
0012FA98   00000003  |Mode = OPEN_EXISTING
0012FA9C   00000080  |Attributes = NORMAL
0012FAA0   00000000  \hTemplateFile = NULL

请问: “\\.\REGVXD”  是在那个目录上?

还有:cmp eax,-1;返回-1表示什么?

00500DD6             E8 1567F0FF         call <jmp.&kernel32.CreateFileA>

00500DDB             83F8 FF             cmp eax,-1;返回-1表示什么?
00500DDE             74 08               je short x_.00500DE8
00500DE0             50                  push eax
00500DE1             E8 EA66F0FF         call <jmp.&kernel32.CloseHandle>

2005-8-9 11:45
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
7
打开文件失败~
2005-8-9 12:24
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
8
\\.\REGVXD是RegMon挂入系统的驱动程序,-1在系统没有找到这个设备文件时返回,这里应该是检测你有没有开启RegMon监视程序读写注册表。
2005-8-9 12:28
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
9
以上是监测是否存在特定文件(好像是RegMon)用以反调试,如果打开文件成功,返回该文件句柄给EAX,否则返回-1,也就是说明没有这个特定文件存在...
2005-8-9 12:28
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
10
晕,楼上的好快~
2005-8-9 12:29
0
游客
登录 | 注册 方可回帖
返回
//