首页
论坛
课程
招聘
不需要依赖dllmain触发的CE注入代码
2009-4-10 14:12 10971

不需要依赖dllmain触发的CE注入代码

2009-4-10 14:12
10971
首先感谢宇宙青年Yonsm提供的例子,源代码我也下来看了,不过多了点-_-最后还是自己写了个简洁的。
代码同时参考了Yonsm和一篇国外的文章,已经实际测试能用。

以下代码演示将test.dll注入电话进程并触发test.dll里的导出函数HelloWorld

首先是注入的exe:
//取得CProg.exe进程句柄的OpenProcess就不贴了,大家都知道@@

//卸载钩子函数
bool UninstallHook(HANDLE hProcessDest,HINSTANCE hInst){
	CALLBACKINFO ci;
	ci.hProcess = hProcessDest;
	ci.pFunction = (FARPROC)MapPtrToProcess(GetProcAddress(GetModuleHandle(L"COREDLL"), L"FreeLibrary"), hProcessDest);
	ci.pvArg0 = hInst; //HINSTANCE returned by LoadLibrary
	DWORD dw = PerformCallBack4(&ci, 0,0,0); //returns 1 if correctly unloaded
	return (bool)dw;
}

//安装钩子
bool InstallHook( HANDLE hProcessDest )
{
	BOOL bMode = SetKMode(TRUE);
	DWORD dwPerm = SetProcPermissions(0xFFFFFFFF);

	CALLBACKINFO ci;

	ci.hProcess = hProcessDest;
	ci.pFunction = (FARPROC)GetProcAddress(GetModuleHandle( _T("coredll.dll") ),_T("LoadLibraryW") );
	[B]ci.pvArg0 = MapPtrToProcess(_T("test.dll"),GetCurrentProcess());  [/B]  //先注入dll

	HINSTANCE hInst = (HINSTANCE) PerformCallBack4(&ci,0,0,0);
	if ( 0 == GetLastError())
	{
		//MessageBox(NULL,TEXT("Success inje"),TEXT("success"),MB_OK);// (NULL,TEXT("PerformCallBack4() run successful......\n",TEXT("test"),MB_OK));
		//get the proc address
		[B][COLOR="Red"]FARPROC pHook = GetProcAddress(hInst, (LPCTSTR)L"HelloWorld");[/COLOR][/B] //关键的地方!获取注入dll的函数地址
		ci.hProcess = hProcessDest;
		ci.pFunction = (FARPROC)MapPtrToProcess(pHook, hProcessDest);
		ci.pvArg0 = NULL; 
		[B][COLOR="red"]DWORD dw = PerformCallBack4(&ci, 0, 0, 0);[/COLOR][/B] //再次注入!这次是函数地址!然后相关的导出函数就运作了
		//UninstallHook(hProcessDest,hInst);
		SetKMode(bMode);
		SetProcPermissions(dwPerm);
		return (bool)dw;
	}else{
		LPWSTR tt;
		wsprintf(tt,TEXT("GetLastError:%d"),GetLastError());
		MessageBox(NULL,tt,TEXT("fail"),MB_OK);
	}
	SetKMode(bMode);
	SetProcPermissions(dwPerm);
	return false;
}


DLL的导出代码:
extern "C" __declspec(dllexport) bool WINAPI HelloWorld()
{
	MessageBox(NULL,TEXT("Hello World by 小金"),TEXT("success"),MB_OK);
	return true;
}

[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (14)
雪    币: 2309
活跃值: 活跃值 (48)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 活跃值 12 2009-4-10 15:05
2
0
很好的总结,很实用。
雪    币: 40
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
skyxskyx 活跃值 2009-4-10 15:52
3
0
能否给出Yonsm和那片国外的文章的链接啊~
学习一下~
雪    币: 115
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
NETTF小金 活跃值 2 2009-4-11 20:20
4
0
yonsm的代码就在本版块啦……
国外那个网站:
http://wmdevelopers.blogspot.com/2008/05/inject-dlls.html
雪    币: 184
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
justnetbobo 活跃值 2009-5-1 12:15
5
0
ci.hProcess = hProcessDest;
  ci.pFunction = (FARPROC)GetProcAddress(GetModuleHandle( _T("coredll.dll") ),_T("LoadLibraryW") );
  ci.pvArg0 = MapPtrToProcess(_T("test.dll"),GetCurrentProcess());    //先注入dll

  HINSTANCE hInst = (HINSTANCE) PerformCallBack4(&ci,0,0,0);

hInst 返回的是空啊,一直取不到, 不知道哪里出问题了..

(Windows Mobile 5.0 Pocket PC )

=============================

ci.pvArg0 = MapPtrToProcess((PVOID)pszPath, GetCurrentProcess());    //先注入dll

pszPath这个传入dll的全路径,就能取到INSTANCE 了
雪    币: 184
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
justnetbobo 活跃值 2009-5-1 12:18
6
0
我有一段代码是能用的,

typedef struct {
        int        hprocess;
        int        func;
        int        arg0;
} CallBackInfo;

typedef int (WINAPI *PerformCallBack4_T)(CallBackInfo* pcbi, int arg1, int arg2, int arg3);

//-----------------------------------------------------------------------------
// fill process view
//-----------------------------------------------------------------------------
BOOL
MemoryDlg::ProcessMemoryView(PROCESSENTRY32* ppe32)
{
        PerformCallBack4_T        PerformCallBack4;
        HANDLE                                hsnapshot;
        PROCESSENTRY32                pe = {0};
        CallBackInfo                cbi = {0};
        MEMORYSTATUS                ms = {0};
        TCHAR szFmt[256];

        DWORD dwUsedHeap;

        PerformCallBack4 = (PerformCallBack4_T)GetProcAddress(hcoredll, _T("PerformCallBack4"));
        if (0 == PerformCallBack4) {
                return FALSE;
        }

        cbi.func = (int)GetProcAddress(hcoredll, _T("GlobalMemoryStatus"));
        if (0 == cbi.func) {
                return FALSE;
        }
        cbi.arg0 = (int)&ms;

        hsnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        pe.dwSize = sizeof(pe);
        if (Process32First(hsnapshot, &pe)) {
                do {
                        if ( _tcsicmp(ppe32->szExeFile, pe.szExeFile) == 0 ) {
                                cbi.hprocess = (int)OpenProcess(0, 0, pe.th32ProcessID);
                                PerformCallBack4(&cbi, 0, 0, 0);
                                //                        _tprintf(_T("----------------------------------------\n"));
                                //                        _tprintf(_T("image:                        %s\npid:                        %u\n"), pe.szExeFile, ppe32.th32ProcessID);
                                //                        _tprintf(_T("dwTotalPhys:        %d\ndwAvailPhys:        %d (%.1f%%)\n"), ms.dwTotalPhys, ms.dwAvailPhys, ms.dwAvailPhys * 100.0/ms.dwTotalPhys);
                                //                        _tprintf(_T("dwTotalVirtual:        %d\ndwAvailVirtual:        %d (%.1f%%)\n"), ms.dwTotalVirtual, ms.dwAvailVirtual, ms.dwAvailVirtual * 100.0/ms.dwTotalVirtual);

                                m_list_mem.InsertItem(0, pe.szExeFile);

                                //// Total Virtual Memory(Not Visible)
                                //wsprintf( szFmt, _T("%dKB"), ms.dwMemoryLoad / 1024 );
                                //m_list_mem.SetItemText(1, 1, szFmt);

                                dwUsedHeap = CalcHeapOfProcess(pe.th32ProcessID);
                                wsprintf(szFmt, _T("%dKB"), (dwUsedHeap>>10));
                                m_list_mem.SetItemText(0, 1, szFmt);

                                // Available Virtual Memory
                                wsprintf( szFmt, _T("%dKB"), ms.dwAvailVirtual / 1024 );
                                m_list_mem.SetItemText(0, 2, szFmt);

                                // Available Virtual Memory(%)
                                wsprintf( szFmt, _T("%.1f"), ms.dwAvailVirtual * 100.0 / ms.dwTotalVirtual );
                                m_list_mem.SetItemText(0, 3, szFmt);
                                //ListView_SetItemText( hwndLView2, dwIndex, 3, szFmt );
                                CloseHandle((HANDLE)cbi.hprocess);
                                break;
                        }
                } while (Process32Next(hsnapshot, &pe));
        }
        CloseToolhelp32Snapshot(hsnapshot);

        return TRUE;
}
雪    币: 108
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Byakuya 活跃值 2009-7-30 16:03
7
0
学习中。。。
为什么我跑下来会在GetModuleHandle( _T("coredll.dll") ),这句出错呢
GetLastError()错误代码为6,The handle is invalid.
HINSTANCE hInst = (HINSTANCE) PerformCallBack4(&ci,0,0,0);
这句hInst返回也是空,error126
不解
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
czbever 活跃值 2009-8-5 17:08
8
0
codeproject有篇文章 http://www.codeproject.com/KB/mobile/InjectDLLIntoProcess.aspx

我按照它这样来做有点问题
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
czbever 活跃值 2009-8-5 17:57
9
0
小金  我按照你的方法做了一遍 为什么执行到HINSTANCE hInst = (HINSTANCE) PerformCallBack4(&ci,0,0,0);
  if ( 0 == GetLastError()) 这里的时候hInst返回负值,而且GetLastError不为0,程序直接跑到异常
雪    币: 237
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
蓝色神话 活跃值 2009-11-12 16:35
10
0
好文章,
雪    币: 204
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zygg 活跃值 2010-1-16 20:54
11
0
跟7楼一样,PerformCallBack4返回的是0,请问该怎么办啊?它之前的所有函数的返回值都正常。
wince6.0的,楼主请帮忙指点下。
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jorenboy 活跃值 2010-3-30 10:40
12
0
NETTF小金 大牛:我参考你的代码, 但是PerfromCallback4调用失败, Error = 6(无效的句柄)
下面是我写的关键代码:
HANDLE
FindProcess(IN PWCHAR pProcess)
{
        HANDLE hProc = NULL;
        PROCESSENTRY32 entry;
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if(INVALID_HANDLE_VALUE != hSnap)
        {
                ZeroMemory(&entry, sizeof(entry));
                entry.dwSize = sizeof(PROCESSENTRY32);
                if(Process32First(hSnap, &entry))
                {
                        do
                        {
                                //DbgPrint(entry.szExeFile);
                                if(wcsicmp(entry.szExeFile, pProcess) == 0)
                                {
                                        hProc = OpenProcess(0, FALSE, entry.th32ProcessID);
                                        break;
                                }

                        } while (Process32Next(hSnap, &entry));
                }
        }

        if(hSnap)
                CloseToolhelp32Snapshot(hSnap);

        return hProc;
}

VOID
InjectDllToProcess()
{
        WCHAR DllPath[MAX_PATH] = L"";
        CallbackInfo ci;

        GetModuleFileName(NULL, DllPath, MAX_PATH);

        PWCHAR p = wcsrchr(DllPath, L'\\');
        DllPath[p - DllPath] = '\0';
        wcscat(DllPath, L"\\Inject.dll");

        ZeroMemory(&ci, sizeof(ci));
        g_hProcess = FindProcess(L"fexplore.exe");
        if(g_hProcess != NULL)
        {
                DWORD dwMode = SetKMode(TRUE);
                DWORD dwPerm = SetProcPermissions(0xFFFFFFFF);

                FARPROC pFunc = GetProcAddress(GetModuleHandle(L"Coredll.dll"), L"LoadLibraryW");
                ci.ProcId = (HANDLE)g_hProcess ;
                ci.pFunc = pFunc;//(FARPROC)MapPtrToProcess(pFunc, g_hProcess);
                ci.pvArg0 = MapPtrToProcess(DllPath, GetCurrentProcess());

                g_Inject = (HINSTANCE)PerformCallBack4(&ci, 0, 0, 0);
                if(GetLastError() != 0)
                        DbgError(L"PerformCallBack 执行失败", GetLastError());
                       

                SetKMode(dwMode);
                SetProcPermissions(dwPerm);
        }
}

我不知道问题出在哪, 你以前研究过, 不知道有没有遇到过?
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jorenboy 活跃值 2010-3-30 11:36
13
0
NETTF小金 大牛:我参考你的代码, 但是PerfromCallback4调用失败, Error = 6(无效的句柄)
下面是我写的关键代码:
HANDLE
FindProcess(IN PWCHAR pProcess)
{
  HANDLE hProc = NULL;
  PROCESSENTRY32 entry;
  HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if(INVALID_HANDLE_VALUE != hSnap)
  {
    ZeroMemory(&entry, sizeof(entry));
    entry.dwSize = sizeof(PROCESSENTRY32);
    if(Process32First(hSnap, &entry))
    {
      do
      {
        //DbgPrint(entry.szExeFile);
        if(wcsicmp(entry.szExeFile, pProcess) == 0)
        {
          hProc = OpenProcess(0, FALSE, entry.th32ProcessID);
          break;
        }

      } while (Process32Next(hSnap, &entry));
    }
  }

  if(hSnap)
    CloseToolhelp32Snapshot(hSnap);

  return hProc;
}

VOID
InjectDllToProcess()
{
  WCHAR DllPath[MAX_PATH] = L"";
  CallbackInfo ci;

  GetModuleFileName(NULL, DllPath, MAX_PATH);

  PWCHAR p = wcsrchr(DllPath, L'\\');
  DllPath[p - DllPath] = '\0';
  wcscat(DllPath, L"\\Inject.dll");

  ZeroMemory(&ci, sizeof(ci));
  g_hProcess = FindProcess(L"fexplore.exe");
  if(g_hProcess != NULL)
  {
    DWORD dwMode = SetKMode(TRUE);
    DWORD dwPerm = SetProcPermissions(0xFFFFFFFF);

    FARPROC pFunc = GetProcAddress(GetModuleHandle(L"Coredll.dll"), L"LoadLibraryW");
    ci.ProcId = (HANDLE)g_hProcess ;
    ci.pFunc = pFunc;//(FARPROC)MapPtrToProcess(pFunc, g_hProcess);
    ci.pvArg0 = MapPtrToProcess(DllPath, GetCurrentProcess());

    g_Inject = (HINSTANCE)PerformCallBack4(&ci, 0, 0, 0);
    if(GetLastError() != 0)
      DbgError(L"PerformCallBack 执行失败", GetLastError());
      

    SetKMode(dwMode);
    SetProcPermissions(dwPerm);
  }
}

我不知道问题出在哪, 你以前研究过, 不知道有没有遇到过?
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jorenboy 活跃值 2010-3-30 11:41
14
0
现在有遇到问题, 我用Remote Process Viewer看的时候, 发现我的DLL已经加载了, 但是为什么PerfromCallback4会返回 无效句柄呢 ?
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdliguo 活跃值 2010-3-30 11:57
15
0
各位牛人能不能做这个:

获取QQ2008列表焦点处的文字
平台:WM5, WM6 for smartphone

价格没有问题可以商量
游客
登录 | 注册 方可回帖
返回