Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 597|回复: 0
打印 上一主题 下一主题

进程注入器增强版 V1.0 源码

[复制链接]

1228

主题

1998

帖子

7598

积分

认证用户组

Rank: 5Rank: 5

积分
7598
跳转到指定楼层
楼主
发表于 2021-5-2 11:10:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2021-5-2 11:14 编辑

进程注入器  V1.0
InjectDll.rar (712.3 KB, 下载次数: 0) 进程注入器增强版 V1.0 源码 .docx (227.72 KB, 下载次数: 0)
界面简单漂亮,可以直观的查看注入的情况。

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5160\wps1.jpg

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5160\wps2.jpg

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5160\wps3.jpg

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5160\wps4.jpg

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5160\wps5.jpg



DLL工程的代码简单,只是弹出一些提示信息。

DLL加载到目标进程时,弹出"DLL已进入目标进程。",
当从目标进程中卸载DLL,弹出"DLL已从目标进程卸载。"。


BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
    switch ( fdwReason )
    {
    case DLL_PROCESS_ATTACH:
        {
            MessageBox( NULL,"DLL已进入目标进程。", _T("信息"), MB_ICONINFORMATION );
        }
        break;
    case DLL_PROCESS_DETACH:
        {
            MessageBox( NULL, "DLL已从目标进程卸载。", _T("信息"), MB_ICONINFORMATION );
        }
        break;
    }
    return TRUE;
}

InjectDLl工程中,注入和卸载DLL。
你可以查看进程的模块,来判断注入是否成功,也可以根据弹出的信息来判断。


//枚举进程
void CInjectDllDlg::EnumProcess()
{
        m_processList.DeleteAllItems();
        HANDLE handle;      
        PROCESSENTRY32 peInfo;
        peInfo.dwSize=sizeof(PROCESSENTRY32);

        handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    bool result=Process32First(handle,&peInfo);//在使用Process32First前必须给peInfo设置它的dwSize
        int i=0;
        while(result)
        {      
                CString PID;      
               
                PID.Format("%i",peInfo.th32ProcessID);//Format,将DWORD转化为CString               

                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, peInfo.th32ProcessID);               
                char szProcessName[MAX_PATH];
                memset(szProcessName,0,MAX_PATH);//加了后szProcessName后面没有烦人的烫烫烫烫烫烫
               
                GetModuleFileNameEx(hProcess,NULL,szProcessName,MAX_PATH);

                if (strcmp(szProcessName,"")==0||strcmp(szProcessName,"?")==0)
                {
                        strcpy(szProcessName,"[系统]");//美观,不会出现“”,“?”
                }
               
                m_processList.InsertItem(i,"");
                m_processList.SetItemText(i,0,PID);
                m_processList.SetItemText(i,1,peInfo.szExeFile);
                m_processList.SetItemText(i,2,szProcessName);      
      
                i++;

                result=Process32Next(handle,&peInfo);               
        }
      
}

//获取选中的进程列表中进程的PID,PID作为注入、卸载时的传入参数
DWORD CInjectDllDlg::GetSelectPID()
{      
        POSITION   pos =m_processList.GetFirstSelectedItemPosition();   
        if   (NULL==pos)   
        {   
                MessageBox("请先选中一条记录!", "操作错误");                    
        }
      
        int index=m_processList.GetNextSelectedItem(pos);  

        //m_processList.SetItemState(index,LVIS_SELECTED,LVIS_SELECTED);//选中某行
      
           char PID[10]="";
        m_processList.GetItemText(index,0,PID,10);
      
        dwProcessID=atoi(PID);
      
        return dwProcessID;

}
本帖隐藏的内容
//根据选中的进程列表中进程的PID来枚举模块
void CInjectDllDlg::OnClickListProcess(NMHDR* pNMHDR, LRESULT* pResult)
{
        // TODO: Add your control notification handler code here
        GetSelectPID();

        GetModuleByPID(dwProcessID);
      
}

//根据进程PID获取模块
void CInjectDllDlg::GetModuleByPID(DWORD dwID)
{
        m_moduleList.DeleteAllItems();

        CString strModulePath;
        CString strModuleName;
        CString strModuleAddr;
   
        BOOL bFound=FALSE;     
        int number=0;
        HANDLE hModuleSnap=NULL;     
        MODULEENTRY32 me32={0};     
        hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwID);     
        if (hModuleSnap==INVALID_HANDLE_VALUE)   
        {
                return;     
        }
        me32.dwSize=sizeof(MODULEENTRY32);  

        bool bRet=Module32First(hModuleSnap,&me32);
      
        while (bRet)//不喜欢do while
        {
                strModuleAddr.Format("0X%x",me32.modBaseAddr);
                strModuleName.Format("%s",me32.szModule);
                strModulePath.Format("%s",me32.szExePath);
               
                m_moduleList.InsertItem(number,"");
               
                m_moduleList.SetItemText(number,0,strModuleAddr);
                m_moduleList.SetItemText(number,1,strModuleName);
                m_moduleList.SetItemText(number,2,strModulePath);
               
                number++;

                bRet=Module32Next(hModuleSnap,&me32);
        }                       
      
        CloseHandle (hModuleSnap);        
      
}

//注入进程
void CInjectDllDlg::OnIniect()
{
        // TODO: Add your control notification handler code here
        char DllPath[255];      
        GetCurrentDirectory(sizeof(DllPath),DllPath);//得到程序自身路径      
        strcat(DllPath,"\\DLL.dll");//得到DLL带路径文件名            
        RemoteLoadLibrary(dwProcessID,DllPath);
      
}

//从进程中卸载注入的DLL
void CInjectDllDlg::OnDetach()
{
        // TODO: Add your control notification handler code here
        char DllPath[255];      
        GetCurrentDirectory(sizeof(DllPath),DllPath);//得到程序自身路径      
        strcat(DllPath,"\\DLL.dll");//得到DLL带路径文件名      
        RemoteFreeLibrary(dwProcessID,DllPath);
      
}

//刷新,查看进程的模块中是否存在要注入的DLL
void CInjectDllDlg::OnRefresh()
{
        // TODO: Add your control notification handler code here

        EnumProcess();
                GetModuleByPID(dwProcessID);
      
}

void CInjectDllDlg::OnCancel()
{
        // TODO: Add extra cleanup here
      
        CDialog::OnCancel();
}


下次有机会发个简易的gh0st 3.6的卸载工具的源码,是将代码直接写入目标进程的内存空间来注入。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-17 20:50 , Processed in 0.063730 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表