易语言实地培训长期招生 QQ1615457736

乐易论坛

 找回密码
 立即注册

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

导航
导航
培训
培训
产品
产品
易歪歪客服聊天助手——永久免费阿里云服务器最高¥1888云产品通用代金券我要租广告
易歪歪客服聊天助手——永久免费阿里云服务器低至10元/月我要租广告
易歪歪客服聊天助手——永久免费最高2000云产品通用代金券我要租广告
查看: 5656|回复: 9
收起左侧

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

[复制链接]
  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 697 天

    [LV.9]以坛为家II

    发表于 2016-8-27 08:40:40 | 显示全部楼层 |阅读模式

    乐易编程网免费注册!抓住机会哦!

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

    x
    编译环境是 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 就完成了.



    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-12-13 23:40
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-8-27 08:54:12 | 显示全部楼层
    沙发是我的了
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-7-31 00:51
  • 签到天数: 63 天

    [LV.6]常住居民II

    发表于 2016-8-27 12:13:46 | 显示全部楼层
    好东西 学习了
    能隐藏EXE DLL吗
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-4-25 01:57
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2016-8-27 15:10:42 | 显示全部楼层
    可惜不会这种编程
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-8-29 23:28:31 | 显示全部楼层
    这不是易语言的吧
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    好东西 学习了
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-9-9 16:36:02 | 显示全部楼层
    干什么的。。。
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-6 08:58
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2018-10-23 14:47:00 | 显示全部楼层
    ......................
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复

    使用道具 举报

    该用户从未签到

    发表于 2019-3-22 16:59:42 | 显示全部楼层
    我要升级看页游实战!!!
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-6-23 22:19
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-4-21 17:41:51 | 显示全部楼层
    速度慢了很多吧,感觉别扭
    欢迎加入乐易论坛VIP,报名联系QQ 43989835
    VIP介绍和课程安排
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    乐易推荐上一条 /6 下一条

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

    GMT+8, 2019-9-20 06:59 , Processed in 0.113770 second(s), 75 queries , Redis On.

    Powered by Discuz! X3.4 Licensed

    © 2001-2017 Comsenz Inc.

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