返回信息流把内核驱动程序编译进PE文件并在程序运行时释放出来再装载的相关技术
by flyingkisser 06.9.12 taloslab.inc.
首先,不是什么新的技术,只是在网上没有找到专门的文章说这个的,所以就写一篇吧,
方便新手,也方便需要用到的只是没有接触到相关技术的高手。所以,了解此技术的人
就不用看了
其次,不仅可以把内核驱动程序编译进去,任何文件都可以编译进去,像dll,ocx,exe等
然后,如果编写,编译,加载内核驱动程序不在本文讨论范围之内
最后,我是用win32汇编描述的,嗯,没办法,C学得不好,呵呵。
******************
第一部分:编译进PE
******************
1.在RC文件中加入:
--------------------------------------
#define FileSys 0x2
FileSys RCDATA "testsys.sys"
--------------------------------------
2.在asm文件中加入:
--------------------------------------
FileSys EQU 2
--------------------------------------
然后编译这个asm和rc文件,再link一下,就好了
下面是我的makefile
--------------------------------------------
NAME = test
OBJS = $(NAME).obj
RES = $(NAME).res
LINK_FLAG = /subsystem:console
ML_FLAG = /c /coff
$(NAME).exe: $(OBJS) $(RES)
Link $(LINK_FLAG) $(OBJS) $(RES)
.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<
clean:
del *.obj
del *.res
del *.bak
------------------------------------------------
我用的subsystem是console,大家不想弹出console窗口的话就用windows
*************************************
第二部分:程序运行时从自身中释放出来
*************************************
1.调用FindResource()
如:invoke FindResource,0,_lpResourceName,RT_RCDATA
这里_lpResourceName不一定非要指定字符串,这里我用的是前面定义的常量FileSys,省事了。
2.调用LoadResource()
如:invoke LoadResource,0,@hResBlock
@hResBlock是第一步调用得到的句柄
3.调用LockResource()
如invoke LockResource,@hResData
@hResData是第二步调用得到的句柄
这时就得到了数据的指针
4.调用SizeofResource()得到数据的大小
如:invoke SizeofResource,0,@hResBlock
5.创建文件
现在用了数据指针,数据大小,调用CreateFile创建文件,再调用WriteFile写进去就完事了。
是不是很easy?
下面是我封装的释放函数:
里面的ErrorRet函数也是我自己封装的,不是win32 API。你可以不用,或用自己的。
----------------------------------------------------------------------------
_ReleaseResource proc _lpResourceName,_lpSaveName
local @hResBlock,@hResData,@dwSize,@lpResData,@hFile,@dwTemp
cleanlocal
pushad
invoke FindResource,0,_lpResourceName,RT_RCDATA
.if !eax
invoke _ErrorRet,string("FindResource")
jmp @F
.endif
mov @hResBlock,eax
invoke LoadResource,0,@hResBlock
.if !eax
invoke _ErrorRet,string("LoadResource")
jmp @F
.endif
mov @hResData,eax
invoke SizeofResource,0,@hResBlock
mov @dwSize,eax
invoke LockResource,@hResData
.if !eax
invoke _ErrorRet,string("LockResource")
jmp @F
.endif
mov @lpResData,eax
invoke CreateFile,_lpSaveName,FILE_ALL_ACCESS,0,0,CREATE_ALWAYS,0,0
.if eax==INVALID_HANDLE_VALUE
invoke _ErrorRet,string("CreateFile")
jmp @F
.endif
mov @hFile,eax
mov ecx,@dwSize
mov esi,@lpResData
.while ecx
push ecx
push esi
invoke WriteFile,@hFile,esi,1,addr @dwTemp,0
pop esi
pop ecx
inc esi
dec ecx
.endw
invoke CloseHandle,@hFile
popad
mov eax,1
ret
@@: popad
xor eax,eax
ret
_ReleaseResource endp
----------------------------------------------------------------------------
这是一条镜像帖。来源:北邮人论坛 / security / #3312同步于 2006/9/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
[原创]把内核驱动程序编译进PE文件并在程序运行时释放出来再装
flyingkisser
2006/9/12镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
这位兄弟,恕我才疏学浅,驱动程序如何自己加载自己呢?
另外,本版主要关注网络安全领域的技术,不是一般的意义上的编程,
后门往往需要在很复杂的网络环境下进行工作,不说什么高深的技术,
就是从大小,文件数量上来说,是一般意义上的编程技术很难满足的。
另外本文也说过了,这种方法不仅可以把sys编译进来,也可以把二进制文件
编译进来,包括配置文件,即使用于木马,又如何不能被配置呢?这一块相关
的技术,你如果查过msdn,应该知道是可以不通过编译进行自我更新的,何
以说不能被配置呢?
【 在 ComicLiu 的大作中提到: 】
: 有什么用呢?驱动或者什么别的程序自己也可以加载自己的阿,感觉像是做了一个不能被配置的木马..