1.打开/保存对话框,获得文件路径显示到控件上
void CMyWGDllTestDlg::OnBnClickedButton()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
CFileDialog dlg(TRUE);//TRUE为OPEN对话框,FALSE为SAVE AS对话框
if(dlg.DoModal()==IDOK)
m_path=dlg.GetPathName();
SetDlgItemText(IDC_EDIT,m_path);//m_path是IDC_EDIT的CString控件变量
} 2.浏览文件夹对话框,获得路径,将路径读到指定控件上。
![](/images/cppblog_com/xunbu7/o.jpg)
void BrowsePath()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
LPBROWSEINFO lpbi = new BROWSEINFO;
lpbi->hwndOwner = GetSafeHwnd();
lpbi->pidlRoot = NULL;
lpbi->pszDisplayName = NULL;
lpbi->lpszTitle = "请选择要写文件的位置";
lpbi->ulFlags = BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT;
lpbi->lpfn = NULL;
LPITEMIDLIST lpitemidlist = SHBrowseForFolder(lpbi);
![](/Images/OutliningIndicators/InBlock.gif)
if (lpitemidlist == NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
delete lpbi;
lpbi = NULL;
return;
}
char path[MAX_PATH];
SHGetPathFromIDList(lpitemidlist,path);
delete lpbi;
m_dPath = path;
UpdateData(FALSE);
}
![](/Images/OutliningIndicators/None.gif)
posted @
2012-12-11 16:45 寻步 阅读(841) |
评论 (0) |
编辑 收藏
1.截取当前exe全路径的前部分
CString GetModulePath()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
CString strPath;
GetModuleFileName(NULL, strPath.GetBuffer(MAX_PATH), MAX_PATH);
strPath.ReleaseBuffer();
![](/Images/OutliningIndicators/InBlock.gif)
int nPos = strPath.ReverseFind('\\');
strPath = strPath.Left(nPos+1);
![](/Images/OutliningIndicators/InBlock.gif)
return strPath;
}2.截取全路径,得到进程名
CString CutPath(CString szFullPath)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
CString szCut;
szCut.Format("%s",szFullPath );
int k = szCut.ReverseFind('\\');
CString szCut2 = szCut.Mid(k + 1);
return szCut2;
}
![](/Images/OutliningIndicators/None.gif)
posted @
2012-12-11 16:33 寻步 阅读(277) |
评论 (0) |
编辑 收藏
CreateProcess(m_path, NULL, NULL,NULL, FALSE, NULL,NULL, NULL,&si,&pi);
第5个参数为FAUSE表示不继承调用进程的句柄。
- bInheritHandles
- [in] Indicates whether the new process inherits handles from the calling process. If TRUE, each inheritable open handle in the calling process is inherited by the new process. Inherited handles have the same value and access privileges as the original handles.
posted @
2012-12-11 11:20 寻步 阅读(305) |
评论 (0) |
编辑 收藏
后卫大师教你过程注入
起首提一下,因为文章美满是我手写,所以打不了太多,请包含,因为我已经供给了源代码,所以我在这里具体讲一下理论,至于想看代码的下载代码就可以了。代码中关于注入的项目组做了具体的注释。MFC界面项目组的注释没有写,(毕竟成果太肤浅了。)
好,言归正传。
所谓DLL注入,既把一个DLL文件放到目标过程中。
下面介绍2种注入体式格式:
1.长途线程注入。
2.哄骗hook注入。(可以过卡巴斯基)
因为本文篇幅限制,不写如何编写DLL。
一.起首讲一下长途线程注入的办法:
1.假设我们已经写好了一个DLL文件。
2.设置本过程权限为debug权限,既调试权限,可以打开其他过程。代码如下:
BOOL SetToken(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ,&hToken);
Privileges.PrivilegeCount=1;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL)!=0)
return FALSE;
CloseHandle(hToken);
return (GetLastError() == ERROR_SUCCESS);
}
3.获得目标过程的句柄。
OpenProcess(权限类型,是否可被持续,过程ID)功能:返回目标过程句柄.
4.在长途过程平分派内存,用来存储,我们要注入的dll的路径
VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
//VirtualAllocEx()函数功能:为制订的过程分派虚拟地址
//参1:要分派的过程句柄
//参2:要分派的虚拟地址的地位,0默示,主动分派地位
//参3:分派的大小
//参4:MEM_COMMIT默示,分派物理内存或者页面内存,并且初始化内存为0
//参5:存储选项:PAGE_READWRITE默示可以在页面内存中 “读写”
//返回值:若是分派内存成功,则返回分派内存的地址,若是分派失败则返回NULL,调用GetLastError()查看错误原因
5.在长途过程中刚才分派的内存处,写入目标DLL路径:
WriteProcessMemory(hProcess, pszLibFileRemote,PVOID) pszLibFile, cb, NULL)
//WriteProcessMemory()函数功能:在制订过程中写入内存
//参1:写入过程的句柄
//参2:写入内存的肇端地址,必须是已经创建的地址,比如上方用VirtualAllocEx()在过程中创建的内存地址
//参3:写入内存中的数据内容的缓存
//参4:写入数据大小
//参5:一个选项,0默示忽视
//返回值: 非0值默示成功, 返回0则默示写入错误。调用GetLastError()查看错误原因
6.获取LoadLibrary()函数地址,因为要用他来动态加载DLL,该函数在kernel32.dll文件中
PROC AdrMyDllDir=(PROC)::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryW");//W代表UNICODE版本,说实话,A代表多字节字符集,本人喜好UNICODE版本
GetProcAddress()
FARPROC GetProcAddress(HMODULE hModule,LPCWSTR lpProcName);
//功能:返回指定的DLL输出函数的函数地址
//参数1:DLL模块句柄
//参数2:DLL输出函数的函数名
这个函数的返回值,就是LoadLibraryW的地址了
7.创建长途线程,既在目标过程中创建一个线程,这里的线程跟通俗的线程不合,通俗线程有线程处理惩罚函数ProcThread()
CreateRemoteThread()
HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
//函数功能:在制订过程中的虚拟地址中创建一个线程
//参数1:过程句柄,线程被创建在这个过程中
//参数2:安然等级,0默示默认安然等级
//参数3:创建线程的大小,0默示体系主动分派线程实际须要的大小
//参数4:线程肇端地址,应用LPTHREAD_START_ROUTINE 定义的线程,并且线程是在长途过程中已经存在。
//参数5: 给线程函数传递的参数
//参数6:创建标记,若是参数是0,则线程创建后立即运行
//参数7:线程ID,若是 ID给0 ,则不返回创建线程的ID
::CreateRemoteThread(hProcess,0,0,(LPTHREAD_START_ROUTINE)AdrMyDllDir,bufRemote,0,0);
这里的AdrMyDllDir存放LoadLibraryW ,也就是说把LoadLibraryW当做线程处理惩罚函数,传入的参数bufRemote存放的是目标DLL文件的地址。
二。下面讲解一下如何用hook既钩子注入DLL文件。
起首给不懂钩子的人简单介绍一下道理:所谓hook,既钩子。hook会在应用法度接到消息之前,阻碍应用法度的信息,比如鼠标键盘钩子会阻碍一个应用法度的鼠标键盘信息。要做盗号木马?用WH_KEYBOARD类型的hook
1.我们要跨过程应用钩子,要把hook函数写在DLL文件中,这是微软明白规定的。也有其他办法,这里不久不多论述
2.在DLL文件中 设置钩子.
这里须要调用线程ID,threadId,我们会鄙人面调用DLL的调用端中写入
hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
//参数1:钩子类型
//参数2:钩子处理惩罚函数
//参数3:钩子地点的模块
//参数4:钩子要阻碍的线程ID,若是要设置全局钩子,这里给0。
把这个SetWindowsHookEx()函数写在一个导出函数中,容许调用dll文件的法度调用
_declspec(dllexport) void SetHook(DWORD threadId)
{
hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
}
SetHook()就是本dll的导出函数
3.在钩子处理惩罚函数中写入功能,当钩子截取到WM_NULL消息的时辰,注入DLL文件。因为WM_NULL消息,是个没用的消息,应用法度一般不会收到这个消息,除非我们本身发送一个这个消息,所以我们在注入DLL的时辰,只要给要注入的应用法度发一个WM_NULL消息,当钩子截取到WM_NULL的时辰就注入钩子,就可以了。
LRESULT CALLBACK GetMessageHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MSG* pMsg=(MSG*)lParam;
if(WM_NULL==pMsg->message)
::LoadLibraryW(TEXT("D://MyDLL.dll"));
}
好了,编译DLL项目,产生DLL文件。
4.编写调用端,调用钩子
起首获取窗口句柄
HWND FindWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
返回窗体句柄。hWnd.
hWnd=FindWindow(0,要注入dll的窗体的名称(例如:千千静听))
哄骗hWnd,查找窗体线程ID
threadId=GetWindowThreadProcessId(hWnd,0);
好了,我们有了线程ID了,可以调用钩子了。
SetHook(threadId);
这时钩子已经加载到目标线程中了。
向目标窗体发送WM_NULL消息
SendMessage(hWnd,WM_NULL,0,0);
钩子会在目标窗体受到消息前受到WM_NULL消息。因为钩子处理惩罚函数中做了断定,当受到WM_NULL消息时,加载DLL文件。所以DLL文件就注入到目标线程中了。
你可以把你的DLL文件中写入很多功能,并且DLL已经被目标法度加载了,也就是说,你的DLL法度已经打入到目标法度内部了,所以如今你可以随心所欲了
posted @
2012-12-09 22:42 寻步 阅读(2496) |
评论 (0) |
编辑 收藏
今天无意之中在网上看到关于DLL注入的文章,感觉写的真的很好,代码很实用!!
所以Ctrl+C,Ctrl+V!给大家学习学习~~~~
void InjectDLL(DWORD PID,char *Path)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
DWORD dwSize;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
dwSize=strlen(Path)+1;
![](/Images/OutliningIndicators/InBlock.gif)
LPVOID lpParamAddress=VirtualAllocEx(hProcess,0,dwSize,PARITY_SPACE,PAGE_EXECUTE_READWRITE);
![](/Images/OutliningIndicators/InBlock.gif)
WriteProcessMemory(hProcess,lpParamAddress,(PVOID)Path,dwSize,NULL);
![](/Images/OutliningIndicators/InBlock.gif)
HMODULE hModule=GetModuleHandleA("kernel32.dll");
![](/Images/OutliningIndicators/InBlock.gif)
LPTHREAD_START_ROUTINE lpStartAddress=(LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");
![](/Images/OutliningIndicators/InBlock.gif)
HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,lpStartAddress,lpParamAddress,0,NULL);
![](/Images/OutliningIndicators/InBlock.gif)
WaitForSingleObject(hThread,1000);
![](/Images/OutliningIndicators/InBlock.gif)
CloseHandle(hThread);
![](/Images/OutliningIndicators/InBlock.gif)
}
另一种是直接注入代码,代码如下:
//函数名:InjectCode
//功能:封装远程注入的函数
//参数:进程ID
//参数:被注入函数指针<函数名>
//参数:参数
//参数:参数长度
void InjectCode(DWORD dwProcId,LPVOID mFunc, LPVOID Param, DWORD ParamSize)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
HANDLE hProcess;//远程句柄
![](/Images/OutliningIndicators/InBlock.gif)
LPVOID mFuncAddr;//申请函数内存地址
![](/Images/OutliningIndicators/InBlock.gif)
LPVOID ParamAddr;//申请参数内存地址
![](/Images/OutliningIndicators/InBlock.gif)
HANDLE hThread; //线程句柄
![](/Images/OutliningIndicators/InBlock.gif)
DWORD NumberOfByte; //辅助返回值
![](/Images/OutliningIndicators/InBlock.gif)
CString str;
![](/Images/OutliningIndicators/InBlock.gif)
//打开被注入的进程句柄
![](/Images/OutliningIndicators/InBlock.gif)
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
![](/Images/OutliningIndicators/InBlock.gif)
//申请内存
![](/Images/OutliningIndicators/InBlock.gif)
mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
![](/Images/OutliningIndicators/InBlock.gif)
ParamAddr = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
![](/Images/OutliningIndicators/InBlock.gif)
//写内存
![](/Images/OutliningIndicators/InBlock.gif)
WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, &NumberOfByte);
![](/Images/OutliningIndicators/InBlock.gif)
WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize, &NumberOfByte);
![](/Images/OutliningIndicators/InBlock.gif)
//创建远程线程
![](/Images/OutliningIndicators/InBlock.gif)
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,
![](/Images/OutliningIndicators/InBlock.gif)
ParamAddr,0,&NumberOfByte);
![](/Images/OutliningIndicators/InBlock.gif)
WaitForSingleObject(hThread, INFINITE); //等待线程结束
![](/Images/OutliningIndicators/InBlock.gif)
//释放申请有内存
![](/Images/OutliningIndicators/InBlock.gif)
VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
![](/Images/OutliningIndicators/InBlock.gif)
VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);
![](/Images/OutliningIndicators/InBlock.gif)
//释放远程句柄
![](/Images/OutliningIndicators/InBlock.gif)
CloseHandle(hThread);
![](/Images/OutliningIndicators/InBlock.gif)
CloseHandle(hProcess);
![](/Images/OutliningIndicators/InBlock.gif)
}
posted @
2012-12-09 22:20 寻步 阅读(1067) |
评论 (0) |
编辑 收藏
函数名称: CreateRemoteDll() 返加类型:BOOL 接受参数: DLL路径,注入进程ID 其完整代码如下: BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId)...{ HANDLE hToken; ...
函数名称: CreateRemoteDll()
返加类型:BOOL
接受参数: DLL路径,注入进程ID
其完整代码如下:
BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
HANDLE hToken;
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
HANDLE hRemoteProcess;
![](/Images/OutliningIndicators/InBlock.gif)
//打开远程线程
if( (hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程
PROCESS_VM_OPERATION | //允许远程VM操作
PROCESS_VM_WRITE, //允许远程VM写
FALSE, dwRemoteProcessId ) )== NULL )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AfxMessageBox("OpenProcess Error!");
return FALSE;
}
![](/Images/OutliningIndicators/InBlock.gif)
char *pszLibFileRemote;
//在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1,
MEM_COMMIT, PAGE_READWRITE);
if(pszLibFileRemote == NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AfxMessageBox("VirtualAllocEx error! ");
return FALSE;
}
![](/Images/OutliningIndicators/InBlock.gif)
//将DLL的路径名复制到远程进程的内存空间
if( WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL) == 0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AfxMessageBox("WriteProcessMemory Error");
return FALSE;
}
![](/Images/OutliningIndicators/InBlock.gif)
//计算LoadLibraryA的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
![](/Images/OutliningIndicators/InBlock.gif)
if(pfnStartAddr == NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AfxMessageBox("GetProcAddress Error");
return FALSE;
}
![](/Images/OutliningIndicators/InBlock.gif)
HANDLE hRemoteThread;
if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AfxMessageBox("CreateRemoteThread Error");
return FALSE;
}
![](/Images/OutliningIndicators/InBlock.gif)
return TRUE;
}
posted @
2012-12-09 22:14 寻步 阅读(590) |
评论 (0) |
编辑 收藏
1![](/Images/OutliningIndicators/None.gif)
2
void GameStart()
3![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
4
HWND hGame= ::FindWindow(NULL,_T("超级玛丽专用辅助"));
5
CRect rect;
6
GetWindowRect(hGame,&rect);
7![](/Images/OutliningIndicators/InBlock.gif)
8
POINT ptNow//模拟之前鼠标的位置
9
,pt;//要模拟的位置
10![](/Images/OutliningIndicators/InBlock.gif)
11
GetCursorPos(&ptNow);//保存模拟之前的鼠标位置
12
pt.x = rect.left + 213;
13
pt.y = rect.top + 370;
14
SetCursorPos(pt.x,pt.y);//新的位置
15
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
16
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
17
SetCursorPos(ptNow.x,ptNow.y);//恢复模拟之前的鼠标位置
18
}
19![](/Images/OutliningIndicators/None.gif)
posted @
2012-12-07 09:58 寻步 阅读(289) |
评论 (0) |
编辑 收藏
1.当B类需要得到A类的成员变量状态时,可以给B类定义一个成员变量和操作它的成员函数。此时,在A类中,当状态发生变化时,调用B类的相应成员函数就可以了。
(当然这个是得到状态时,当需要得到A类成员变量值的时候,将它作为参数传递到B类的相应成员函数中(Get()和Set函数())。
posted @
2012-12-06 17:17 寻步 阅读(85) |
评论 (0) |
编辑 收藏
Ø游戏外挂以Dll注入方式居多,修改方式为:
1.修改游戏代码(改变游戏的流程,使跳转的外挂自己的代码中)
2.修改游戏IAT(IAT Hook的方式挂钩游戏的Send()和Recv()函数,实现修改数据处理 的 目的)
3.安装消息钩子(当有特定消息发生时,外挂函数来处理)
Ø其次是Process, 方式一般为:
1.通过调用CreateProcessW()、OpenProcess()、ReadProcessMemory()、WriteProcessMemory()等API函数使游戏作为外挂的子进程被打开以实现辅助和游戏之间的通信,从而对游戏数据进行恶意修改,以达到其相应的辅助功能。
2.FindWindow()、GetWindowThreadProcessId()、OpenProcess()、ReadProcessMemory()、WriteProcessMemory()
Ø最后是Allocate方式一般为:
有一个类似Process的客户端,成功打开游戏后退出,不写单独的dll,或者将写好的dll文件拷贝到游戏进程--通过WriteProcessMemory--并CreateRemoteThread启动它的执行。
posted @
2012-12-05 14:44 寻步 阅读(496) |
评论 (0) |
编辑 收藏
我认为,纯语言书籍不用看太多,看太多也是重复,书质量够的话2.3本就可以。就我本人而已,纯讲C++语言的书籍只看过3本:入门《C++程序设计》、中级:《C++编程思想》、高级:《深度探索C++对象模型》,我知道还有很多好书,但没必要都看。其实C/C++开发一个关键是对操作系统的理解,因此如果windows的话《windows 程序设计》、《Windows 内核编程》和《深入浅出MFC》必看,如果是Unix的话《unix环境高级编程》以及一些shell方面的书必看。另外数据结构和STL方面的书也要看,如《STL源码剖析》。希望对你有帮助
posted @
2012-12-04 18:14 寻步 阅读(150) |
评论 (0) |
编辑 收藏