乐易论坛-乐易网易语言培训教程火山PC视窗中文编程交流论坛

 找回密码
 立即注册

手机号登录

用手机号号登陆

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

办理VIP,定制软件,报名培训联系QQ[重磅]2024年实地培训高清培训目录火山PC版乐易模块使用教程
请牢记揰掵佲的QQ号1615457736 1615457734 其他都是骗子有了火山,易语言是否还有必要学习吗?易语言0基础入门课程
火山PC视窗0基础入门课程易语言外挂0基础入门课程火山PC视窗火山HOOK入门课程
易语言误报处理课程QQ空间POST课程2022年火山PC易语言POST系列课程
Android逆向Jeb动态调试0基础课程QQ邮箱网页POST课程WeChat个微Hook实战课程
百日Js加密分析实战课程(无密下载)QQ群POST课程h5游戏WebSocket逆向视频
JavaScript加密特训课程易语言汇编快速入门课程破解实战系列课程
[2024年]火山PC0基础x64位游戏内存辅助开发教程手游模拟器脚本0基础课程易语言加密防破解0基础入门课程
广告位招租联系QQ1615457736  
查看: 19661|回复: 12

[图文教程] 【转】【原创】伪装进程过DXF读写

[复制链接]

[图文教程] 【转】【原创】伪装进程过DXF读写

[复制链接]
已绑定手机
已实名认证
揰掵佲
等级头衔

等級:乐易运营组

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分成就
易币
贡献
主题
精华
金钱
积分
33822
注册时间
2014-8-2
最后登录
1970-1-1

勋章墙

2016-8-27 08:40:40 | 显示全部楼层 |阅读模式
编译环境是 VS2013+WDK8.1
测试环境  XP32

就上次发的创建内核线程读写DXF内存,这里就继续完善下,原帖:
http://bbs.pediy.com/showthread.php?t=212347

游客,如果您要查看本帖隐藏内容请回复


毕竟创建线程,还要等待线程执行,速度慢了很多吧,感觉别扭
通宵一晚上,查了下资料,把伪装进程弄了出来
测试还是有点效果,不过也不是很完美
必须要过掉 ZwOpenProcess ,NtReadProcessMemory,NtWriteProcessMemory这三个函数HOOK才能读写
不过总算摆脱了线程的方式,而且那三个HOOK也容易过,内心感觉爽了一下.

伪装进程的代码基本上也是下面这帖子抄的,自己简单的修改了下:
http://bbs.pediy.com/showthread.php?t=96427

老样子,对内核不是太了解的我,不会WinDbg,不会双机调试
写出这些代码,基本上都是蓝屏重启千万次慢慢修改的
得出结论,学内核,windbg还是要学的,毕竟没法调试,很多东西都不好弄明白是什么原因,ring3下至少还有OD调试


源码就不打包了,就那么几行代码而已.
先贴代码,再说说遇到不解的问题
代码:
  
  1. VOID ChangeName2(ULONG pProcess1/**被伪装的进程**/, ULONG pProcess2/**要伪装的进程**/)
  2.    {
  3.      KAPC_STATE kapc1, kapc2;
  4.      PUNICODE_STRING CurrentDirectory=NULL,
  5.             DllPath=NULL,
  6.             ImagePathName=NULL,
  7.             CommandLine=NULL,
  8.             ldr1_FullName=NULL,
  9.             ldr1_BaseName=NULL,
  10.             ldr2_FullName=NULL;

  11.      
  12.      ULONG ProcessParameters, peb, ldr, ldr1, ldr2, ldr3,x1;

  13.      WCHAR CurrentDirectory2[256] = { 0 },
  14.        DllPath2[256] = { 0 },
  15.        ImagePathName2[256] = { 0 },
  16.        CommandLine2[512] = { 0 },
  17.        ldr1_FullName2[256] = { 0 },
  18.        ldr1_BaseName2[256] = { 0 },
  19.        ldr2_FullName2[256] = { 0 };

  20.      peb = *(PULONG)(pProcess1 + 0x1b0);
  21. //     DbgPrint("peb = %08X", peb);
  22.      KeStackAttachProcess((PEPROCESS)pProcess1, &kapc1);
  23.      _try
  24.      {
  25.       
  26.        ProcessParameters = *(PULONG)(peb + 0x010);
  27. //       DbgPrint("ProcessParameters = %08X", ProcessParameters);
  28.        CurrentDirectory = (PUNICODE_STRING)(ProcessParameters + 0x24); //CurrentDirectory
  29.        DllPath = (PUNICODE_STRING)(ProcessParameters + 0x30); //DllPath
  30.        ImagePathName = (PUNICODE_STRING)(ProcessParameters + 0x38); //ImagePathName
  31.        CommandLine = (PUNICODE_STRING)(ProcessParameters + 0x40); //CommandLine
  32.        RtlCopyMemory(CurrentDirectory2, CurrentDirectory->Buffer, wcslen(CurrentDirectory->Buffer)*2);
  33.        RtlCopyMemory(DllPath2, DllPath->Buffer, wcslen(DllPath->Buffer)*2);
  34.        RtlCopyMemory(ImagePathName2, ImagePathName->Buffer, wcslen(ImagePathName->Buffer)*2);
  35.        RtlCopyMemory(CommandLine2, CommandLine->Buffer, wcslen(CommandLine->Buffer)*2);
  36.   
  37.        //DbgPrint("CurrentDirectory2 %S  %d  %S  %d", CurrentDirectory2, wcslen(CurrentDirectory2), CurrentDirectory->Buffer, wcslen(CurrentDirectory->Buffer));
  38.        //DbgPrint("DllPath %S  %d  %S  %d", DllPath2, wcslen(DllPath2), DllPath->Buffer, wcslen(DllPath->Buffer));
  39.        //DbgPrint("ImagePathName %S  %d  %S  %d", ImagePathName2, wcslen(ImagePathName2), ImagePathName->Buffer, wcslen(ImagePathName->Buffer));
  40.        //DbgPrint("CommandLine2 %S  %d", CommandLine2, wcslen(CommandLine2));
  41.        //DbgPrint("CommandLine %S  %d",  CommandLine->Buffer, wcslen(CommandLine->Buffer));


  42.        ldr = *(PULONG)(peb + 0x00C);
  43.        ldr1 = *(PULONG)(ldr + 0x00C);
  44.        ldr2 = *(PULONG)(ldr + 0x014);
  45. //       ldr3 = *(PULONG)(ldr + 0x01C);

  46.        ldr1_FullName = (PUNICODE_STRING)(ldr1 + 0x24); //FullDllName 完整路径
  47.        ldr1_BaseName = (PUNICODE_STRING)(ldr1 + 0x2C); //BaseDllName 文件名称
  48.        ldr2_FullName = (PUNICODE_STRING)(ldr2 + 0x24); //FullDllName 完整路径

  49.        RtlCopyMemory(ldr1_FullName2, ldr1_FullName->Buffer, wcslen(ldr1_FullName->Buffer) * 2);//FullName这里写过遍历,好像第一个都是EXE
  50.        RtlCopyMemory(ldr1_BaseName2, ldr1_BaseName->Buffer, wcslen(ldr1_BaseName->Buffer) * 2); //BaseName
  51.        RtlCopyMemory(ldr2_FullName2, ldr2_FullName->Buffer, wcslen(ldr2_FullName->Buffer) * 2);//FullName这里跟上面一样,ldr2的baseName遍历出来没数据,就不获取修改了


  52.      }
  53.      __except (EXCEPTION_EXECUTE_HANDLER)
  54.      {
  55.        DbgPrint("KeStackAttachProcess失败1");

  56.      }
  57.      KeUnstackDetachProcess(&kapc1);
  58.      peb = *(PULONG)(pProcess2 + 0x1b0);
  59.      KeStackAttachProcess((PEPROCESS)pProcess2, &kapc2);
  60.      _try
  61.      {
  62.        ProcessParameters = *(PULONG)(peb + 0x010);

  63.   //     RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x24), CurrentDirectory2, wcslen(CurrentDirectory2) * 2);// 这里也不能修改,改了程序会出错...
  64.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x30), DllPath2, wcslen(DllPath2) * 2);
  65.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x38), ImagePathName2, wcslen(ImagePathName2) * 2);
  66.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x40), CommandLine2, wcslen(CommandLine2) * 2);

  67.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x70), L"",0);//WindowTitle
  68.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x78), L"", 0);//DesktopInfo
  69.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x80), L"",0);//ShellInfo
  70.      //  RtlInitEmptyUnicodeString((PUNICODE_STRING)(ProcessParameters + 0x88), NULL, 0);//RuntimeData 这里遍历是NULL,所以不改
  71.      
  72.    
  73.        ldr = *(PULONG)(peb + 0x00C);
  74.        ldr1 = *(PULONG)(ldr + 0x00C);
  75.        ldr2 = *(PULONG)(ldr + 0x014);
  76.        //       ldr3 = *(PULONG)(ldr + 0x01C); //这里没遍历到进程名称,所以不改了

  77.   //     RtlInitEmptyUnicodeString((PUNICODE_STRING)(ldr1 + 0x24), ldr1_FullName2, wcslen(ldr1_FullName2) * 2); //FullDllName 完整路径 不知道为什么,改了这里,激活窗口,程序就会消失
  78.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ldr1 + 0x2C), ldr1_BaseName2, wcslen(ldr1_BaseName2) * 2); //BaseName    文件名称
  79.        RtlInitEmptyUnicodeString((PUNICODE_STRING)(ldr2 + 0x24), ldr2_FullName2, wcslen(ldr2_FullName2) * 2); //FullDllName 完整路径,ldr2的 baseName没有数据,所以只改 FullName

  80.      }
  81.        __except (EXCEPTION_EXECUTE_HANDLER)
  82.      {
  83.        DbgPrint("KeStackAttachProcess失败2");

  84.      }
  85.      KeUnstackDetachProcess(&kapc2);
  86.      PUNICODE_STRING str1,str2;
  87.    
  88.     //如果要过DXF读写,修改0x174跟0x1F4 这两处就可以了,其他不用改,至于改这么多,纯当学习了
  89.      RtlCopyMemory((PCHAR)(pProcess2 + 0x174), (PCHAR)(pProcess1 + 0x174),16);

  90.      str1 = (PUNICODE_STRING)(*(PULONG)(pProcess1 + 0x1F4));
  91.      str2 = (PUNICODE_STRING)(*(PULONG)(pProcess2 + 0x1F4));
  92.      
  93.      RtlInitEmptyUnicodeString(str2, str1->Buffer, wcslen(str1->Buffer) * 2);
  94.      
  95.      //EPROCESS->SectionObject->Segment->ControlArea->FileObject->FileName
  96.      x1 = *(PULONG)(pProcess1 + 0x138);
  97.      if (x1!=0)
  98.      {
  99.        x1 = *(PULONG)(x1 + 0x14);
  100.        x1 = *(PULONG)x1;
  101.        x1 = *(PULONG)(x1 + 0x024);
  102.        str1 = (PUNICODE_STRING)(x1 + 0x030);

  103.        x1 = *(PULONG)(pProcess2 + 0x138);
  104.        if (x1!=0)
  105.        {
  106.          x1 = *(PULONG)(x1 + 0x14);
  107.          x1 = *(PULONG)x1;
  108.          x1 = *(PULONG)(x1 + 0x024);
  109.          str2 = (PUNICODE_STRING)(x1 + 0x030);
  110.          RtlInitEmptyUnicodeString(str2, str1->Buffer, wcslen(str1->Buffer) * 2);
  111.        }
  112.       
  113.      }
  114.      
  115.      //x1 = *(int*)(pProcess + 0x11C); // VAD 这里不知道怎么遍历 ,就不修改了
  116.      //x1 = *(int*)(x1 + 0x10);
  117.      //x1 = *(int*)(x1 + 0x018);
  118.      //x1 = *(int*)(x1 + 0x024);
  119.      //str1 = (PUNICODE_STRING)(x1 + 0x030);
  120.      //if (str1)
  121.      // DbgPrint("FileName = %S ", str1->Buffer);
复制代码


上面这段代码中   ,有几处不明白:

1、修改 CurrentDirectory 会造成程序出错,好像后台程序不会(没窗口的那种吧)。
2、修改 ldr1_FullName 程序会消失,跟 curdir一样,后台程序好像不会消失.
3、VAD 这个不知道怎么遍历,没改
4、把上面能改的都改了,PCHunter还是能获取到路径,不知道是不是3的原因

代码调用如下且有一个问题不明白,贴出来给大家看:
代码:
  1. PEPROCESS pProcess1,/*csrss.exe*/
  2.               pProcess2 /*CE.exe*/;
  3.         PsLookupProcessByProcessId((HANDLE)0x25C, &pProcess1);
  4.         PsLookupProcessByProcessId((HANDLE)0x110, &pProcess2);
  5.         if (pProcess1 != NULL && pProcess2 != NULL)
  6.         {
  7.           ChangeName2((ULONG)pProcess1, (ULONG)pProcess2);
  8.           ObDereferenceObject(pProcess1);
  9.         //  ObDereferenceObject(pProcess2); //不知道为什么,不能删除对象,删除了关闭程序就蓝
  10.         }
复制代码

修改的大概流程就是:
先 KeStackAttachProcess 被伪装的进程 获取进程的 peb数据 (peb1)
然后 再 KeStackAttachProcess 要伪装的进程 ,把 peb1数据写进去
最后修改下 PEPROCESS 就完成了.



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

已绑定手机
已实名认证
retn
等级头衔

等級:程序制作者

Rank: 6Rank: 6

积分成就
易币
贡献
主题
精华
金钱
积分
1721
注册时间
2015-2-4
最后登录
1970-1-1

勋章墙

2016-8-27 12:13:46 | 显示全部楼层
好东西 学习了
能隐藏EXE DLL吗
回复

使用道具 举报

已绑定手机
qq4031635qq
等级头衔

等級:编程菜鸟

Rank: 2

积分成就
易币
贡献
主题
精华
金钱
积分
55
注册时间
2019-4-21
最后登录
1970-1-1

勋章墙

2019-4-21 17:41:51 | 显示全部楼层
速度慢了很多吧,感觉别扭
回复

使用道具 举报

已绑定手机
已实名认证
KaYi-
等级头衔

等級:编程学徒

Rank: 3Rank: 3

积分成就
易币
贡献
主题
精华
金钱
积分
143
注册时间
2021-5-7
最后登录
1970-1-1

勋章墙

2021-5-7 16:52:51 | 显示全部楼层
学习学习学习学习学习
回复

使用道具 举报

已绑定手机
惟天月
等级头衔

等級:顶级Vip

Rank: 14Rank: 14Rank: 14Rank: 14

积分成就
易币
贡献
主题
精华
金钱
积分
184
注册时间
2014-11-8
最后登录
1970-1-1

勋章墙

2016-8-27 08:54:12 | 显示全部楼层
沙发是我的了
回复

使用道具 举报

已绑定手机
kissmeoppop
等级头衔

等級:编程入门

Rank: 4

积分成就
易币
贡献
主题
精华
金钱
积分
973
注册时间
2016-3-29
最后登录
1970-1-1

勋章墙

2016-8-27 15:10:42 | 显示全部楼层
可惜不会这种编程
回复

使用道具 举报

shyboy716
等级头衔

等級:编程入门

Rank: 4

积分成就
易币
贡献
主题
精华
金钱
积分
637
注册时间
2016-5-2
最后登录
1970-1-1

勋章墙

2016-8-29 23:28:31 | 显示全部楼层
这不是易语言的吧
回复

使用道具 举报

55889
等级头衔

等級:编程入门

Rank: 4

积分成就
易币
贡献
主题
精华
金钱
积分
768
注册时间
2016-6-29
最后登录
1970-1-1

勋章墙

2016-9-1 21:16:17 | 显示全部楼层

好东西 学习了
回复

使用道具 举报

2443647586
等级头衔

等級:编程起步

Rank: 5Rank: 5

积分成就
易币
贡献
主题
精华
金钱
积分
1625
注册时间
2016-5-29
最后登录
1970-1-1

勋章墙

2016-9-9 16:36:02 | 显示全部楼层
干什么的。。。
回复

使用道具 举报

已绑定手机
瘠薄
等级头衔

等級:初识编程

Rank: 1

积分成就
易币
贡献
主题
精华
金钱
积分
24
注册时间
2018-10-23
最后登录
1970-1-1

勋章墙

2018-10-23 14:47:00 | 显示全部楼层
......................
回复

使用道具 举报

已绑定手机
q869294428
等级头衔

等級:编程菜鸟

Rank: 2

积分成就
易币
贡献
主题
精华
金钱
积分
56
注册时间
2019-3-22
最后登录
1970-1-1

勋章墙

2019-3-22 16:59:42 | 显示全部楼层
我要升级看页游实战!!!
回复

使用道具 举报

如果懒得打字,请选择右侧内容快捷回复 提醒:以任何方式进行『恶意灌水』的行为,进行封号处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

热点推荐上一条 /5 下一条

QQ|网站地图|手机版|小黑屋|乐易论坛-乐易网 | 湘ICP备19007035号

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表乐易立场!

娄底市乐易网络科技有限公司声明:乐易原创培训课程版权均为我公司所有,未经许可,不得擅自翻录,盗版,破解本站课课程,我们将保留法律诉讼的权利

GMT+8, 2024-5-2 13:05 , Processed in 0.068925 second(s), 78 queries .

Powered by Discuz! X3.4

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表