能力值:
( LV2,RANK:10 )
|
-
-
2 楼
感脚,还是自定义函数Hook好一点,其他的库无非是你家替你做一部份工作而已
|
能力值:
( LV6,RANK:93 )
|
-
-
3 楼
1.将你的dll注入到目标进程,在dll的dllmain里hook。
2.自己看example
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
感谢回复
我现在的问题是如何把dll注入到一个已经存在的进程中,detours中withdll的例子是创建新进程时注入,没有向已经存在的进程中注入的例子。
还请高手再提示细致一点
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
标准办法
第一步,用NtOpenProcess打开进程
第二步,用VirtualAllocEx分配空间,记得要参数MEM_COMMIT,
第三步,GetProcAddress得到对方进程模块Kernel32" 的 “LoadLibraryA"函数
第四步,用WriteProcessMemory写入得到的地址
第五步,CreateRemoteThread建立线程执行。
内存写入型办法,你去看PE的相关资料才能理解,一句两句讲不清,涉及病毒原理的东西,一讲一大堆,呵呵
够清楚了吧,亲,分给我吧。嘿嘿
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
楼上远程线程注入的具体实现,剩下的自己弄吧
BOOL CInjectTestDlg::injectDllToProcess(void)
{
BOOL bOk = FALSE; // Assume that the function fails
HANDLE hProcess = NULL, hThread = NULL;
PCSTR pszLibFileRemote = NULL;
UpdateData(TRUE);
do
{
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // For WriteProcessMemory
FALSE, m_processID);
if (hProcess == NULL) break;
PCSTR dllName = m_DllName.GetBuffer(m_DllName.GetLength());
//在目标程序开辟内存
pszLibFileRemote = (PCSTR)
VirtualAllocEx(hProcess, NULL,strlen(dllName)*sizeof(CHAR)+1, MEM_COMMIT, PAGE_READWRITE);
if (pszLibFileRemote == NULL) break;
//将dll路径全名写入目标内存
if (!WriteProcessMemory(hProcess, (LPVOID)pszLibFileRemote,
(PVOID)dllName, strlen(dllName)*sizeof(CHAR)+1, NULL))
{
// m_DllName.ReleaseBuffer();
break;
}
//启动目标线程并让其执行LoadLibraryA
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
if (pfnThreadRtn == NULL) break;
hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRtn, (LPVOID)pszLibFileRemote, 0, NULL);
if (hThread == NULL) break;
// 等待程序结束
WaitForSingleObject(hThread, INFINITE);
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, (LPVOID)pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
bOk = TRUE;
} while (FALSE);
if(bOk)
{
// MessageBox("注入成功",NULL,MB_OK);
}
else
{
MessageBox("注入失败",NULL,MB_OK);
}
return bOk;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
就是楼上这段代码,我犯懒,莫找源代码,直接说原理了。
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
setdll
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
谢谢dppdpp,
这个方法我使用了,怎么在win7下CreateRemoteThread执行不成功,返回NULL,我又懵了
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
谢谢xhbuming
我回去测一下在win7下行不行,我的代码基本上和你的一致,但CreateRemoteThread执行不成功 ,是什么原因我也不知道,希望赐教!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
CreateRemoteThread(进程句柄(保证已打开),0,0,(对方进程函数地址,保证不为零),(对方进程参数地址,保证不为零),0,0);
必须能行的噢。除非有保护啥的。
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
首先看一下是否是因为权限问题,其次是动态库是否调用了User32里面的API而没有导入这个动态库(可以随便找一个dll尝试下是否注入成功)。
都不行那就只有单步看一下喽~
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
有可能是权限问题,那权限提到SE_DEBUG_NAME等级看看,我记着不提也能执行来的。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
win7 创建远程线程:http://hi.baidu.com/hjxy_shell/item/578cebeb5f38842b4cdcaf4b
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
原来如此,看来老知识要更新了。学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
哦,谢谢高人指点,下来好好研究一下!
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
怎么把权限提到SE_DEBUG_NAME等级呢,呵呵,这方面初学,问题都比较白痴,见谅!
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
谢谢寒江雪语,我的第一个问题解决了!怎么给你分啊?另外,怎么对MyCreateRemoteThread免杀啊?
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
帖子发了2周,目前解决了第一个问题,第二个问题还没有得到完美解决,只形成了初步解决思路,希望有过Detour使用经历的大牛进来看看,重点帮忙解决劫持第三方动态库导出函数的问题。
|
|
|