首页
社区
课程
招聘
[旧帖] [求助][求助]Dll注入进程问题。 0.00雪花
发表于: 2014-10-11 15:34 1924

[旧帖] [求助][求助]Dll注入进程问题。 0.00雪花

2014-10-11 15:34
1924
最近在学习写DLL进程注入,刚好在看黑客编程那本书。

里面有个实例。自己改了代码XP,WIN7下注入也不行。

源例子注入也不行,请懂的人来看看。

Dll code:

#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                                         )
{
        switch(ul_reason_for_call)
        {
                //DLL被加载到内存时
        case DLL_PROCESS_ATTACH:
                {
                        MessageBox(NULL,"Hello word",NULL,MB_OK);
                        break;
                }
        default:break;
        }
        return TRUE;
}


注入程序代码:

#include "stdafx.h"
#include <Windows.h>
#include <tlhelp32.h>
#include <stdio.h>

int EnableDebugPriv(const char * name)
{
        HANDLE hToken;
        TOKEN_PRIVILEGES tp;
        LUID luid;
        //打开进程令牌环
        if(!OpenProcessToken(GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
                &hToken) )
        {
                printf("OpenProcessToken error\n");
                return 1;
        }
        //获得进程本地唯一ID
        if(!LookupPrivilegeValue(NULL,name,&luid))
        {
                printf("LookupPrivilege error!\n");
        }
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
        tp.Privileges[0].Luid = luid;
        //调整进程权限
        if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )
        {
                printf("AdjustTokenPrivileges error!\n");
                return 1;
        }
        return 0;
}

BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
{
        HANDLE hRemoteProcess;
        //获得调试权限
        if(EnableDebugPriv(SE_DEBUG_NAME))
        {
                printf("add privilege error");
                return FALSE;
        }
        //打开目标进程
        if((hRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId))==NULL)
        {
                printf("OpenProcess error\n");
                return FALSE;
        }
        char *pszLibFileRemote;
    //申请存放dll文件名的路径
        pszLibFileRemote=(char *)VirtualAllocEx( hRemoteProcess, 
                                     NULL, lstrlen(DllFullPath)+1, 
                                     MEM_COMMIT, PAGE_READWRITE);
        if(pszLibFileRemote==NULL)
        {
                printf("VirtualAllocEx error\n");
                return FALSE;
        }
        //把dll的完整路径写入到内存,
        if(WriteProcessMemory(hRemoteProcess,
                pszLibFileRemote,(void *)DllFullPath,lstrlen(DllFullPath)+1,NULL) == 0)
        {
                printf("WriteProcessMemory error\n");
                return FALSE;
        }
        //得到LoadLibraryA函数地址
        PTHREAD_START_ROUTINE pfnStartAddr=(PTHREAD_START_ROUTINE)
                GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
        if(pfnStartAddr == NULL)
        {
                printf("GetProcAddress error\n");
                return FALSE;
        }
        HANDLE hRemoteThread;
        //启动远程线程
        if( (hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0, 
                pfnStartAddr,pszLibFileRemote,0,NULL))==NULL)
        {
                printf("CreateRemoteThread error\n");
                return FALSE;
        }
        return TRUE;
}

DWORD GetProcessID(char *ProcessName)
{
        PROCESSENTRY32 pe32;
        pe32.dwSize=sizeof(pe32);
        //获得系统内所有进程快照
        HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if(hProcessSnap==INVALID_HANDLE_VALUE)
        {
                printf("CreateToolhelp32Snapshot error");
                return 0;
        }
        //枚举列表中的第一个进程
        BOOL bProcess=Process32First(hProcessSnap,&pe32);
        while(bProcess)
        {
                //比较找到的进程名和我们要查找的进程名,一样则返回进程id
                if(strcmp(strupr(pe32.szExeFile),strupr(ProcessName))==0)
                        return pe32.th32ProcessID;
                //继续查找
                bProcess=Process32Next(hProcessSnap,&pe32);
        }
        CloseHandle(hProcessSnap);
        return 0;
}


int main(int argc,char *argv[])
{
        char Dllpath[255];
        GetCurrentDirectory(sizeof(Dllpath),Dllpath);
        strcat(Dllpath,"\\test.dll");
        printf("Current path is :%s\r\n",Dllpath);
        Sleep(2000);

        DWORD Pid = GetProcessID("iexplore.exe");
        InjectDll(Dllpath,Pid);
        MessageBox(NULL,"inject process susscess",NULL,MB_OK);
        return 0;
}


一运行就报错,不知道哪儿的问题。还请懂的大牛看看。 谢谢。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 86
活跃值: (18)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
算了,都没人来噢。自己顶自己把。
2014-10-11 20:24
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能把错误放上?
2014-10-11 21:21
0
雪    币: 86
活跃值: (18)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
没错误,就是运行的时候直接程序奔溃了
2014-10-13 14:06
0
雪    币: 206
活跃值: (529)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
自己调试下呗。学会自己动手
2014-10-13 15:11
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
给你个建议,自己调试或者找一些注入工具,可以试试,看能不能往计算器或者记事本这一类公用程序里面注入,如果可以,那你看看你的要注入的进程,如果不行,看看你的注入代码。
2014-10-13 17:16
0
雪    币: 5
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主问题解决了吗
2014-10-20 16:59
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
q:
        char Dllpath[255];
        GetCurrentDirectory(sizeof(Dllpath),Dllpath);
        strcat(Dllpath,"\\test.dll");
a:GetCurrentDirectory. 第1个参数是存放路径的数组DllPath的大小。 你应该用strlen获取,而不是sizeof。或者直接写255。

看例子:
        LPCTSTR lpFileName="file.txt";
        char szFilePath[MAX_PATH];
        if(!GetCurrentDirectory(MAX_PATH,szFilePath))
                return;
        sprintf_s(szFilePath,"%s\\%s",szFilePath,lpFileName);
2014-11-13 17:26
0
雪    币: 86
活跃值: (18)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
多谢了,还在测试中。
2014-11-17 09:06
0
雪    币: 5
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我10月20日看到这个帖子时正好有空,修改你的程序,当时已经正常运行了。
要不要把项目发给你?
2014-11-17 10:04
0
雪    币: 8
活跃值: (353)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
DWORD Pid = GetProcessID("iexplore.exe");
改为

        char temp[MAX_PATH] = {0};
        strcat(temp, "iexplore.exe");

        DWORD Pid = GetProcessID(temp);
2014-11-19 16:07
0
游客
登录 | 注册 方可回帖
返回
//