返回信息流远程线程插入我就不废话了
插入之后一般两种选择,一种是外部调用dll里的导出功能函数a
另一种是在DLL_PROCESS_ATTACH里面直接调用dll里的功能函数a
现在的问题是,如果在这个要调用的功能函数a里有CreateThread创建了一个新线程b
那么这个新建的线程b在前面的第一种调用情况下可以顺利运行
而在第2种自身调用的情况下,线程可以创建,返回值也不是INVALID_HANDLE_VALUE,但是之后肯定不会启动
嗯,具体情况就是这样,vs是肯定调不了了,就看到底是编译参数的问题还是dll调用里有什么玄机了
这是一条镜像帖。来源:北邮人论坛 / security / #10735同步于 2007/5/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
[原创]来,开个技术帖,讨论个问题,看看有没有人遇到过
rebirthatsix
2007/5/17镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我很久以前做过,不过工作得很好啊,和你唯一的区别是我的Dll没有导出任何函数,
只是一个代码的载体。在dll_porcess_attach里面直接CreateThread.
贴一些关键代码,你比较一下
-----------------inject.asm-----------
invoke GetModuleHandle,string("Kernel32.dll")
invoke GetProcAddress,eax,string("LoadLibraryA")
mov @lpLoadLibrary,eax
invoke VirtualAllocEx,@hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_EXECUTE_READWRITE
.if eax
mov @lpProcessBuf,eax
invoke GetCurrentDirectory,MAX_PATH,addr szMyDllFull
invoke lstrcat,addr szMyDllFull,string("\name.dll")
invoke WriteProcessMemory,@hProcess,\
@lpProcessBuf,addr szMyDllFull,MAX_PATH,NULL
invoke wsprintf,addr @szBuf,String("@hProcess %X CodeAt %X"),\
@hProcess,@lpProcessBuf
invoke StdOut,addr @szBuf
invoke CreateRemoteThread,@hProcess,0,0,@lpLoadLibrary,\
@lpProcessBuf,0,0
invoke CloseHandle,eax
.else
invoke _ErrorRet,string("VirtualAllocEx")
.endif
invoke CloseHandle,@hProcess
-------------------------------------------------------------------
---------------------makefile-----------------
NAME = inject
OBJS = $(NAME).obj
RES = $(NAME).res
LINK_FLAG = /subsystem:console
ML_FLAG = /c /coff
$(NAME).exe: $(OBJS)
Link $(LINK_FLAG) $(OBJS)
.asm.obj:
ml $(ML_FLAG) $<
clean:
del *.obj
del *.bak
------------------------------------------------------
----------------------name.dll------------------------
DllEntry proc _hInstance,_dwReason,_dwReserved
local @dwThreadID
.if _dwReason == DLL_PROCESS_ATTACH
invoke CreateThread,0,0,offset _Down,0,0,addr @dwThreadID
invoke CloseHandle,eax
.endif
mov eax,TRUE
ret
DllEntry Endp
End DllEntry
--------------------------------------------------------
----------------makefile-------------------------
DLL = akalius
ML_FLAG = /c /coff
LINK_FLAG = /subsystem:windows /Dll /release
$(DLL).dll: $(DLL).obj
Link $(LINK_FLAG) $(DLL).obj
.asm.obj:
ml $(ML_FLAG) $<
clean:
del *.obj
del *.exp
del *.lib
del *.bak
-------------------------------------------------------
Down这个函数的代码就不贴了。
此外makefile使用的是标准的编译参数,一些优化选项我去掉了。实际中是使用的。
(最后编译出来的dll刚好1K多一点...)
2k/xp/2k3/都测试过.
【 在 rebirthatsix (茫犭者) 的大作中提到: 】
: 远程线程插入我就不废话了
: 插入之后一般两种选择,一种是外部调用dll里的导出功能函数a
: 另一种是在DLL_PROCESS_ATTACH里面直接调用dll里的功能函数a
: ...................
DLLMain中不要启动线程,这是微软的一个bug,启动线程和DLLMain防止重入使用了同一个内核信号,会造成死锁
http://support.microsoft.com/?kbid=142243
这个是我在csdn上刚找到的,虽然是mfc dll,不过应该异曲同工
不知道该怎么解释了
创建线程会调用应用程序已经加载的所有DLL的DLLMain(参见DLLMain的文档中关于reason参数的说明),而DLLMain是不可以重入的,所以应用程序会死锁。
不太清楚mcfdll做了什么别的动作,我一直这么干的,也一直没有出过问题,
不过我只是自己测试过,没有对外用过。
有待于进一步分析2K源码看看其中的过程是如何实现的。
【 在 rebirthatsix (茫犭者) 的大作中提到: 】
: DLLMain中不要启动线程,这是微软的一个bug,启动线程和DLLMain防止重入使用了同一个内核信号,会造成死锁
: http://support.microsoft.com/?kbid=142243
: 这个是我在csdn上刚找到的,虽然是mfc dll,不过应该异曲同工
: ...................