[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] [讨论]一个进程如何修改其他进程的环境变量

如题: 最好能有C的测试代码;
这个话题和第三方开发密切相关,大家务必重视。。

有点黑克的意思了,有点不太好吧
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

本帖最后由 plp626 于 2012-9-15 14:08 编辑

论坛的第三方区提供了一个工具:
conset.exe, 不知其中实现方法
  1. ->set var
  2. 环境变量 var 没有定义
  3. ->dir/b |conset var=
  4. ->set var
  5. var=Debug
  6. x.dsp
  7. x.dsw
  8. x.ncb
  9. x.opt
  10. x.plg
复制代码
还有系统自带的外部命令doskey.exe
不知如何修改父进程空间数据的?
  1. ->ls
  2. 'ls' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. ->doskey ls=dir/w
  5. ->ls
  6. 驱动器 D 中的卷是 SOFT
  7. 卷的序列号是 B89F-E38E
  8. D:\Documents_and_Settings\plp2\desktop\x 的目录
  9. [.]     [..]    [Debug] x.dsp   x.dsw   x.ncb   x.opt   x.plg
  10.                5 个文件         88,389 字节
  11.                3 个目录  5,512,269,824 可用字节
复制代码

TOP

远程注入法,简单写了一个:
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <assert.h>
  5. #include <tlhelp32.h>
  6. DWORD GetParentProcessId(DWORD pid)
  7. {
  8.     DWORD ppid = (DWORD)(-1);
  9.     HANDLE hProcessSnap;
  10.     PROCESSENTRY32 pe32;
  11.     hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  12.     assert(hProcessSnap != INVALID_HANDLE_VALUE);
  13.     pe32.dwSize = sizeof( PROCESSENTRY32 );
  14.     BOOL bResult = Process32First( hProcessSnap, &pe32 );
  15.     assert(bResult != FALSE);
  16.     do
  17.     {
  18.         if (pid == pe32.th32ProcessID)
  19.         {
  20.             ppid = pe32.th32ParentProcessID;
  21.             break;
  22.         }
  23.     } while( Process32Next( hProcessSnap, &pe32 ) );
  24.     CloseHandle( hProcessSnap );
  25.     return( ppid );
  26. }
  27. DWORD ppid(VOID)
  28. {
  29.     return GetParentProcessId( GetCurrentProcessId() );
  30. }
  31. typedef struct _RemoteParam {
  32.     DWORD funcptr;
  33.     BYTE Param1[64];
  34.     BYTE Param2[64];
  35. } RemoteParam, *PRemoteParam;
  36. typedef int  (WINAPI *PFN_MessageBox)(HWND, LPCTSTR, LPCTSTR, DWORD);
  37. typedef BOOL (WINAPI *PFN_SetEnvironmentVariable)(LPCTSTR, LPCTSTR);
  38. DWORD WINAPI threadProc(LPVOID lpParam)
  39. {
  40.     RemoteParam *pRP = (RemoteParam *)lpParam;
  41.     PFN_SetEnvironmentVariable pfnSetEnvironmentVariable = (PFN_SetEnvironmentVariable)pRP[0].funcptr;
  42.     pfnSetEnvironmentVariable(pRP[0].Param1, pRP[0].Param2);
  43.     PFN_MessageBox pfnMessageBox = (PFN_MessageBox)pRP[1].funcptr;
  44.     pfnMessageBox(NULL, pRP[1].Param1, pRP[1].Param2, 0);
  45.     return 0;
  46. }
  47. int main(int argc, char *argv[])
  48. {
  49.     DWORD dwProcessId = ppid();
  50.     assert(dwProcessId != (DWORD)(-1));
  51.     HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
  52.     assert(hTargetProcess != NULL);
  53.     DWORD dwMemSize = 4096;
  54.     LPVOID pRemoteThread = VirtualAllocEx(hTargetProcess, 0, dwMemSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE) ;
  55.     assert(pRemoteThread != NULL);
  56.     BOOL bResult = WriteProcessMemory(hTargetProcess, pRemoteThread, threadProc, dwMemSize, NULL) ;
  57.     assert(bResult != FALSE);
  58.     RemoteParam RemoteParams[2] = {{0}};
  59.     HMODULE hUser32 = LoadLibrary("User32.dll");
  60.     HMODULE hKernel32 = LoadLibrary("Kernel32.dll");
  61.     RemoteParams[0].funcptr = (DWORD)GetProcAddress(hKernel32, "SetEnvironmentVariableA");
  62.     strcpy(RemoteParams[0].Param1, "__var");
  63.     strcpy(RemoteParams[0].Param2, "hello");
  64.     RemoteParams[1].funcptr = (DWORD)GetProcAddress(hUser32, "MessageBoxA");
  65.     strcpy(RemoteParams[1].Param1, "www.bathome.net");
  66.     strcpy(RemoteParams[1].Param2, "hello");
  67.     dwMemSize = sizeof(RemoteParams);
  68.     LPVOID pRemoteParam = VirtualAllocEx(hTargetProcess, 0, dwMemSize, MEM_COMMIT, PAGE_READWRITE);
  69.     assert(pRemoteParam != NULL);
  70.     bResult = WriteProcessMemory(hTargetProcess, pRemoteParam, RemoteParams, dwMemSize, NULL) ;
  71.     assert(bResult != FALSE);
  72.     HANDLE hRemoteThread = CreateRemoteThread(hTargetProcess, NULL, 0, pRemoteThread, pRemoteParam, 0, NULL);
  73.     assert(hRemoteThread != NULL);
  74.     CloseHandle(hRemoteThread);
  75.     CloseHandle(hTargetProcess);
  76.     return 0;
  77. }
复制代码
E:\Projects\Inject>set
ALLUSERSPROFILE=D:\Documents and Settings\All Users
APPDATA=D:\Documents and Settings\root\Application Data
CLIENTNAME=Console
CommonProgramFiles=D:\Program Files\Common Files
COMPUTERNAME=POWERPC
ComSpec=D:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=D:
HOMEPATH=\Documents and Settings\root
LOGONSERVER=\\POWERPC
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=D:\WINDOWS\system32;D:\WINDOWS;D:\WINDOWS\System32\Wbem;E:\MinGW\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 37 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2505
ProgramFiles=D:\Program Files
PROMPT=$P$G
SESSIONNAME=Console
SystemDrive=D:
SystemRoot=D:\WINDOWS
TEMP=D:\DOCUME~1\root\LOCALS~1\Temp
TMP=D:\DOCUME~1\root\LOCALS~1\Temp
USERDOMAIN=POWERPC
USERNAME=root
USERPROFILE=D:\Documents and Settings\root
windir=D:\WINDOWS

E:\Projects\Inject>gcc -o conset.exe conset.c

E:\Projects\Inject>conset

E:\Projects\Inject>set
ALLUSERSPROFILE=D:\Documents and Settings\All Users
APPDATA=D:\Documents and Settings\root\Application Data
CLIENTNAME=Console
CommonProgramFiles=D:\Program Files\Common Files
COMPUTERNAME=POWERPC
ComSpec=D:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=D:
HOMEPATH=\Documents and Settings\root
LOGONSERVER=\\POWERPC
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=D:\WINDOWS\system32;D:\WINDOWS;D:\WINDOWS\System32\Wbem;E:\MinGW\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 37 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2505
ProgramFiles=D:\Program Files
PROMPT=$P$G
SESSIONNAME=Console
SystemDrive=D:
SystemRoot=D:\WINDOWS
TEMP=D:\DOCUME~1\root\LOCALS~1\Temp
TMP=D:\DOCUME~1\root\LOCALS~1\Temp
USERDOMAIN=POWERPC
USERNAME=root
USERPROFILE=D:\Documents and Settings\root
windir=D:\WINDOWS
__var=hello

E:\Projects\Inject>
2

评分人数

    • CrLf: 膜拜技术 + 1
    • plp626: 这里卧虎藏龙啊,感谢分享。。PB + 10 技术 + 1
我不知道

TOP

conset用的远程注入的方法是对的,如图(不知为何论坛上传不了图片,用了外链)
我测试的代码是
  1. echo test|conset x=
复制代码
图中就是conset赋值的关键地方,先CreateRemoteThread创建远程线程,再用SetEnvironmentVariableA进行变量赋值。
大家可以看右下角的堆栈区

---学无止境---

TOP

远程注入法,简单写了一个:
IUnknown 发表于 2012-9-15 17:24


这个程序用Visual C++是无法通过编译的。

TOP

回复 6# Demon
    用了gcc编译器。蓝色字体那里

TOP

回复  Demon
    用了gcc编译器。蓝色字体那里
Seder 发表于 2012-9-17 11:58


我知道他用的是GCC,我说的是用VC无法编译。

TOP

回复 4# IUnknown

反馈个 bug,这个长度取的是结构体数组的大小:
  1.     dwMemSize = sizeof(RemoteParams);
复制代码
实际上应该取的是数组中指向的结构体的总长度:
  1.     dwMemSize = sizeof(RemoteParams)*sizeof(RemoteParam)/sizeof(int);
复制代码

TOP

返回列表