• 95.自动注射


    • dll文件(自定义函数)
      1 _declspec(dllexport)   void  autoadd()
      2 {
      3     int *p = (int*)0xdc0c4d0;
      4     *p = 5048;
      5 }
    • dll文件DLLMain函数
       1 BOOL APIENTRY DllMain( HMODULE hModule,
       2                        DWORD  ul_reason_for_call,
       3                        LPVOID lpReserved
       4                      )
       5 {
       6     switch (ul_reason_for_call)
       7     {
       8     case DLL_PROCESS_ATTACH:
       9         autoadd();
      10         //注射到进程的时候执行
      11     case DLL_THREAD_ATTACH:
      12         //注射到进程,当作线程启动的时候
      13     case DLL_THREAD_DETACH:
      14         //线程结束
      15     case DLL_PROCESS_DETACH:
      16         //进程结束的操作
      17         break;
      18     }
      19     return TRUE;
      20 }

    自动注射

    • 以非独占的方式打开一个进程
      1 //以非独占的方式打开这个进程
      2     HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwprocessid);
    • 获取路径长度并分配内存
      1 int length = strlen(dllpath) + 1;
      2 //在其他进程内部分配内存,可以读写
      3 LPVOID lpremotedllname = VirtualAllocEx(hprocess, NULL, length, MEM_COMMIT, PAGE_READWRITE);
    • 将路径写入到进程
      1 //将路径写入到进程
      2     if (WriteProcessMemory(hprocess, lpremotedllname,dllpath,length,NULL)==FALSE)
      3     {
      4         printf("内存写入无效");
      5         return;
      6     }
    • 获取系统dll接口,并获取函数的接口
      1    //获取系统dll接口
      2     HMODULE hmodule = GetModuleHandleA("kernel32.dll");
      3     //获取函数接口
      4     LPTHREAD_START_ROUTINE  fnstart = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodule, "LoadLibraryA");
    • 开启一个远程线程
      1 //开启一个远程线程
      2     HANDLE hremoteThread = CreateRemoteThread(hprocess, NULL,0, fnstart, dllpath, 0, NULL);
    • 关闭句柄,释放内存
      1 CloseHandle(hremoteThread);
      2 CloseHandle(hmodule);
      3 CloseHandle(hprocess);

    main函数

    1 //获取当前路径
    2     GetCurrentDirectoryA(1024, dllpath);
    3     //连接到字符串
    4     strcat(dllpath, "\new.dll");//链接
    5 
    6     inject(5016);

    完整代码

     1 #define   _CRT_SECURE_NO_WARNINGS
     2 #include<Windows.h>
     3 #include<string.h>
     4 #include<stdio.h>
     5 
     6 //dll路径
     7 char dllpath[1024] = { 0 };
     8 //根据线程id号注射
     9 void  inject(DWORD dwprocessid)
    10 {
    11     if (dwprocessid==0)
    12     {
    13         printf("进程编号无效");
    14         return;
    15     }
    16     //以非独占的方式打开这个进程
    17     HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwprocessid);
    18     //如果打开失败
    19     if (hprocess==NULL)
    20     {
    21         printf("进程打开无效");
    22         return;
    23     }
    24     //获取路径长度并分配内存
    25     int length = strlen(dllpath) + 1;
    26     //在其他进程内部分配内存,可以读写
    27     LPVOID lpremotedllname = VirtualAllocEx(hprocess, NULL, length, MEM_COMMIT, PAGE_READWRITE);
    28     //判断是否分配成功
    29     if (lpremotedllname==NULL)
    30     {
    31         printf("进程分配内存无效");
    32         return;
    33     }
    34     //将路径写入到进程
    35     if (WriteProcessMemory(hprocess, lpremotedllname,dllpath,length,NULL)==FALSE)
    36     {
    37         printf("内存写入无效");
    38         return;
    39     }
    40     //获取系统dll接口
    41     HMODULE hmodule = GetModuleHandleA("kernel32.dll");
    42     //获取函数接口
    43     LPTHREAD_START_ROUTINE  fnstart = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodule, "LoadLibraryA");
    44     if ((DWORD)fnstart==0)
    45     {
    46         printf("获取地址失败");
    47         return;
    48     }
    49     //开启一个远程线程
    50     HANDLE hremoteThread = CreateRemoteThread(hprocess, NULL,0, fnstart, dllpath, 0, NULL);
    51     if (hremoteThread == NULL)
    52     {
    53         printf("开启线程失败");
    54         return;
    55     }
    56     //等待
    57     if (WaitForSingleObject(hremoteThread,INFINITE)!=WAIT_OBJECT_0)
    58     {
    59         printf("线程等待失败");
    60         return;
    61     }
    62 
    63     CloseHandle(hremoteThread);
    64     CloseHandle(hmodule);
    65     CloseHandle(hprocess);
    66 }
    67 void main()
    68 {
    69     //获取当前路径
    70     GetCurrentDirectoryA(1024, dllpath);
    71     //连接到字符串
    72     strcat(dllpath, "\new.dll");//链接
    73 
    74     inject(5016);
    75 
    76     system("pause");
    77 }
  • 相关阅读:
    javascript继承对象冒充
    javascript原型prototype(2)
    javascript继承call()和apply实现继承
    javascript继承原型链继承
    javascript原型prototype(3)
    没有宽高的情况下实现水平垂直居中
    TCP协议
    什么是模块化?模块化的好处是什么?
    数组中嵌套数组,转化为一个数组形式/二维数组转化为一维数组
    常见的请求头类型
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8461603.html
Copyright © 2020-2023  润新知