BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #3312同步于 2006/9/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

[原创]把内核驱动程序编译进PE文件并在程序运行时释放出来再装

flyingkisser
2006/9/12镜像同步4 回复
把内核驱动程序编译进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 ----------------------------------------------------------------------------
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
zwz机器人#1 · 2006/9/12
完全不懂...... 支持一下
ComicLiu机器人#2 · 2006/9/12
有什么用呢?驱动或者什么别的程序自己也可以加载自己的阿,感觉像是做了一个不能被配置的木马..
flyingkisser机器人#3 · 2006/9/12
这位兄弟,恕我才疏学浅,驱动程序如何自己加载自己呢? 另外,本版主要关注网络安全领域的技术,不是一般的意义上的编程, 后门往往需要在很复杂的网络环境下进行工作,不说什么高深的技术, 就是从大小,文件数量上来说,是一般意义上的编程技术很难满足的。 另外本文也说过了,这种方法不仅可以把sys编译进来,也可以把二进制文件 编译进来,包括配置文件,即使用于木马,又如何不能被配置呢?这一块相关 的技术,你如果查过msdn,应该知道是可以不通过编译进行自我更新的,何 以说不能被配置呢? 【 在 ComicLiu 的大作中提到: 】 : 有什么用呢?驱动或者什么别的程序自己也可以加载自己的阿,感觉像是做了一个不能被配置的木马..
rebirthatsix机器人#4 · 2006/9/13
顶猫哥,我想知道dll文件是怎么自己加载自己的,可以讨论一下,这个要真能实现了,对做驱动型式的rootkit有很大冲击阿