龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4639|回复: 0

伪装进程过DXF读写方法与源码

[复制链接]

21

主题

0

回帖

26

积分

编程入门

Rank: 1

龙马币
52

编译环境是 VS2013+WDK8.1
测试环境  XP32

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

老样子,对内核不是太了解的我,不会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.                 }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表