XP终结日,最后一个XP程序.纪念
来源:互联网 发布:51bdy.com forum.php 编辑:程序博客网 时间:2024/05/01 03:24
问题:
Windows XP下CMD下的Set命令不支持用管道符将标准输入赋值到变量:
cmd> echo 321|set env=
cmd> echo %env%
cmd> %env%
只能通过繁杂的for语句来处理(还可能需要对command进行复杂的转义):
for /f %%i in ('command') do set env=%%i
如果只有较少类似语句需要写还可以接受,奈何使用某国外命令行软件需要写大量的批处理脚本,所以...
解决办法:
1.OD反汇编查看cmd.exe,未找到有用的win32 api,只找到了环境变量存储的固定内存区域地址(NO)
2.妄图用OD修改cmd.exe,无奈其汇编繁杂奥妙...(NO)
3.用C调用win32 api来侵入修改父进程内存来达到目的(YES)
源码:
#include <stdio.h>#include <windows.h>#include <winbase.h>#include <tlhelp32.h>#define READSIZE 0x00001000#define READADDR 0x00010000DWORD getPPid();char* getRet();int main(int argc,char* argv[]){char *c_ret=getRet();wchar_t w_ret[256];wchar_t varstr_header[]=L"Zenv=";wchar_t varstr[2048];DWORD pid=getPPid();printf("PID:%d\n",pid);HANDLE handle;LPCVOID addr=(LPCVOID)READADDR;LPVOID buff;DWORD nSize=READSIZE;DWORD x=0;LPDWORD lpd=&x;lstrcatW(varstr,varstr_header);swprintf(w_ret, L"%S", c_ret);lstrcatW(varstr,w_ret);buff=(LPVOID)malloc(READSIZE);handle=OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION ,0,pid);int result=0;result=ReadProcessMemory(handle,addr,buff,nSize,lpd);printf("Result:%d\n",result);DWORD err=GetLastError();printf("Error Code for call GetLastError:%d\n",err);printf("Number Of Bytes Read :%d\n",*lpd);wchar_t line[1024];int index=0;int i;int isWillBreak=0;LPVOID targetBuff;LPVOID backupTargetBuff;backupTargetBuff=targetBuff=(LPVOID)malloc(READSIZE);memset(targetBuff,0,READSIZE);for(i=0;i<READSIZE;i++){if(*(short*)buff==0){*(wchar_t*)targetBuff=0;wprintf(L"%ls\n",line);index=0;memset(line,0,1024*2);if(isWillBreak) break;isWillBreak=1;}else {line[index]=*(wchar_t*)buff;*(wchar_t*)targetBuff=*(wchar_t*)buff;index++;isWillBreak=0;}buff+=2;targetBuff+=2;}for(i=0;i<(sizeof(varstr)/sizeof(wchar_t));i++){*(wchar_t*)targetBuff=varstr[i];targetBuff+=2;}free(buff);LPVOID targetAddr=(LPVOID)READADDR;*lpd=0;result=WriteProcessMemory(handle,targetAddr,backupTargetBuff,nSize,lpd);printf("Result:%d\n",result);err=GetLastError();printf("Error Code for call GetLastError:%d\n",err);printf("Number Of Bytes Write :%d\n",*lpd);}char* getRet(){FILE *fp=stdin;char *buf_l;char buf[1024];int cc;if(!fp) printf("error stdin");while(!feof(fp) && (cc=fread(buf,1,sizeof(buf),fp))>0){printf("%s%s","Need set env:",buf);}buf_l=buf;return buf_l;}DWORD getPPid(){ HANDLE hProcessSnap = NULL; PROCESSENTRY32 pe32 = {0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == (HANDLE)-1) return (FALSE); pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { while(pe32.th32ProcessID!=GetCurrentProcessId()) Process32Next(hProcessSnap, &pe32); } return(pe32.th32ParentProcessID);}
编译:Windows平台下使用mingw-gcc编译成功,得到Zenv.exe可执行文件
运行:
cmd> echo 321|Zenv
...(显示执行状态)
cmd> echo %Zenv%
321
总结:
1.只支持Windows XP,目测不支持Win7,未尝试对Windows Server各版本测试(本来打算实际运用在具体软件项目中,无奈...原因见下条)
2.国内某0杀毒软件和国外某伞杀毒软件报木马病毒,如国外某伞杀毒软件在软件运行时报木马病毒:TR/Dropper.Gen
3.设置的变量名固定为"Zenv",不过可以据此改写
0 0
- XP终结日,最后一个XP程序.纪念
- 惠普:XP终结之时即PC复活之日
- Windows XP 12岁 最后一个生日快乐!
- Qt支持Xp的最后一个版本
- mariadb-5.5.48-win32 XP下最后一个版本
- 编译最后一个支持XP的CEF3(v2623)
- VC6+XP下第一个OpenGL程序
- XP迎首个“裸奔日”
- Windows XP最后的安全补丁
- xp
- xp
- xp
- xp
- xp
- XP下QProcess调用一个外部程序无法结束
- 奇怪的问题,InvalidateRect最后一个参数在XP下无效
- chrome源码最后一个支持xp版本(49.0.2623.112)代码下载和编译
- xp下确定最后的盘符
- android AccountManager and SyncManager
- 这就要从两方面来说
- 下一个天亮
- cocos2d-x加载广告(Admob广告和芒果平台) android平台
- HDU 2546 饭卡 (01背包)
- XP终结日,最后一个XP程序.纪念
- Qt HTML CSS颜色对照表
- C++第7周(春)项目2 再一个深复制
- request.setAttribute("list",list);出现空指针
- asp.net-入门-熟悉1.0
- python判断链接是否有效
- 7种常用排序算法总结
- QT多线程同步小结
- Android控件之Button