原文发表于百度空间,2008-7-24

当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了
==========================================================================

先从分析PEB开始吧.
感觉分析这个东西,首先要把类型定义搞清楚,这个在Windbg里dt _PEB就可以了
搞清楚定义主要是为了定位相关变量的偏移.
PEB中的ProcessParameters部分就是进程的参数了,里面就有我们感兴趣的映像路径等信息
之所以对这个感兴趣,是因为以前看到过修改PEB中的映像路径过防火墙的
获取PEB很简单,也早有人说过这个问题.
在用户模式下,fs寄存器指向TEB结构,在TEB开头部分是这么定义的:
lkd> dt _TEB
nt!_TEB
   +0x000 NtTib            : _NT_TIB
   +0x01c EnvironmentPointer : Ptr32 Void
   +0x020 ClientId         : _CLIENT_ID
   +0x028 ActiveRpcHandle : Ptr32 Void
   +0x02c ThreadLocalStoragePointer : Ptr32 Void
   +0x030 ProcessEnvironmentBlock : Ptr32 _PEB        //这个就指向PEB

再看PEB的开头部分:
lkd> dt _PEB
nt!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 SpareBool        : UChar
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS //指向进程的参数

再来看_RTL_USER_PROCESS_PARAMETERS 的结构:
lkd> dt _RTL_USER_PROCESS_PARAMETERS
nt!_RTL_USER_PROCESS_PARAMETERS
   +0x000 MaximumLength    : Uint4B
   +0x004 Length           : Uint4B
   +0x008 Flags            : Uint4B
   +0x00c DebugFlags       : Uint4B
   +0x010 ConsoleHandle    : Ptr32 Void
   +0x014 ConsoleFlags     : Uint4B
   +0x018 StandardInput    : Ptr32 Void
   +0x01c StandardOutput   : Ptr32 Void
   +0x020 StandardError    : Ptr32 Void
   +0x024 CurrentDirectory : _CURDIR   //当前目录
   +0x030 DllPath          : _UNICODE_STRING
   +0x038 ImagePathName    : _UNICODE_STRING  //映像路径
   +0x040 CommandLine      : _UNICODE_STRING     //命令行
   +0x048 Environment      : Ptr32 Void
   +0x04c StartingX        : Uint4B
   +0x050 StartingY        : Uint4B
   +0x054 CountX           : Uint4B
   +0x058 CountY           : Uint4B
   +0x05c CountCharsX      : Uint4B
   +0x060 CountCharsY      : Uint4B
   +0x064 FillAttribute    : Uint4B
   +0x068 WindowFlags      : Uint4B
   +0x06c ShowWindowFlags : Uint4B
   +0x070 WindowTitle      : _UNICODE_STRING
   +0x078 DesktopInfo      : _UNICODE_STRING
   +0x080 ShellInfo        : _UNICODE_STRING
   +0x088 RuntimeData      : _UNICODE_STRING
   +0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR

到这儿,应该就比较清楚了,反正这些东西都是在用户空间的,可以看也可以改.
关键代码如下:

  1. typedef struct _RTL_USER_PROCESS_PARAMETERS
  2. {
  3. DWORD MaximumLength;
  4. DWORD Length;
  5. DWORD Flags;
  6. DWORD DebugFlags;
  7. HANDLE ConsoleHandle;
  8. DWORD ConsoleFlags;
  9. HANDLE StandardInput;
  10. HANDLE StandardOutput;
  11. HANDLE StandardError;
  12. CURDIR CurrentDirectory;
  13. UNICODE_STRING DllPath;
  14. UNICODE_STRING ImagePathName;
  15. UNICODE_STRING CommandLine;
  16. void* Environment; //指向MULTI的宽字符串
  17. DWORD StartingX;
  18. DWORD StartingY;
  19. DWORD CountX;
  20. DWORD CountY;
  21. DWORD CountCharsX;
  22. DWORD CountCharsY;
  23. DWORD FillAttribute;
  24. DWORD WindowFlags;
  25. DWORD ShowWindowFlags;
  26. UNICODE_STRING WindowTitle;
  27. UNICODE_STRING DesktopInfo;
  28. UNICODE_STRING ShellInfo;
  29. UNICODE_STRING RuntimeData;
  30. RTL_DRIVE_LETTER_CURDIR CurrentDirectores;
  31. }RTL_USER_PROCESS_PARAMETERS;
  32.  
  33. void* PEB;
  34. PWSTR p;
  35. PWSTR fakeImagePath=L"I am achillis,this is fake image path";
  36. PWSTR fakeCommandLine=L"I am achillis,this is fake commandline";
  37. PWSTR fakeCurrentDirectory=L"I am achillis,this is fake CurrentDirectory";
  38. RTL_USER_PROCESS_PARAMETERS *pUserParam;
  39. _asm
  40. {
  41. mov eax,fs:[0x30] //TEB->PEB
  42. mov eax,[eax+0x10] //PEB->ProcessParameters
  43. mov pUserParam,eax
  44. }
  45. printf("RTL_USER_PROCESS_PARAMETERS:0x%08x\n",pUserParam);
  46. //输出映像路径等信息
  47. //wprintf(L"DllPath:%s\n",pUserParam->DllPath.Buffer);
  48. wprintf(L"[ImagePath]:%s\n",pUserParam->ImagePathName.Buffer);
  49. wprintf(L"[CommandLine]:%s\n",pUserParam->CommandLine.Buffer);
  50. wprintf(L"[CurrentDirectory]:%s\n",pUserParam->CurrentDirectory.DosPath.Buffer);
  51. //修改其中的内容
  52. lstrcpyW(pUserParam->ImagePathName.Buffer,fakeImagePath);
  53. lstrcpyW(pUserParam->CommandLine.Buffer,fakeCommandLine);
  54. lstrcpyW(pUserParam->CurrentDirectory.DosPath.Buffer,fakeCurrentDirectory);

效果还行,但是路径那块儿还是有问题,被截断了.
丢个图吧,高手飘过~

【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录的更多相关文章

  1. 【旧文章搬运】改PEB中的映像路径可以这样~

    原文发表于百度空间,2008-7-26========================================================================== 用常用的几个 ...

  2. 【旧文章搬运】《从PEB获取内存中模块列表》的补充

    原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...

  3. 【旧文章搬运】暴搜内存查找PE镜像

    原文发表于百度空间,2008-7-28========================================================================== 前面介绍了修 ...

  4. 【旧文章搬运】从PEB获取内存中模块列表

    原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...

  5. 【旧文章搬运】KeUserModeCallback用法详解

    原文发表于百度空间及看雪论坛,2010-01-10 看雪论坛地址:https://bbs.pediy.com/thread-104918.htm  代码及附件可到这里下载=============== ...

  6. 【旧文章搬运】Win7可变对象头结构之InfoMask解析

    原文发表于百度空间,2010-08-11========================================================================== 对Wind ...

  7. 【旧文章搬运】Windows内核常见数据结构(进程相关)

    原文发表于百度空间,2008-7-24========================================================================== 进程的相关结 ...

  8. 【旧文章搬运】关于windbg搜索符号文件的一点说明

    原文发表于百度空间,2010-09-07========================================================================== 本来只是打 ...

  9. 【旧文章搬运】修改PEB,断链隐藏模块成功

    原文发表于百度空间,2008-7-26========================================================================== 继续实践之前 ...

随机推荐

  1. java通过反射获取bean字段注解@Column中的信息

    直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...

  2. Android ZXing 二维码、条形码扫描介绍

    本帖最后由 Shims 于 2013-11-9 12:39 编辑 最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码 ...

  3. Dubbo和Spring集成Demo

    Zookeeper安装和启动 http://mirrors.hust.edu.cn/apache/zookeeper/下载,我的版本是 3.4.5. 解压到 D:\zookeeper-3.4.5 配置 ...

  4. iOS开发之创建颜色渐变视图View

    在iOS开发中有时需要自己自定义一个视图view的背景,而网上有人提出的在循环中不断alloc的方法设置其背景色渐变,会耗费很多内存和资源,极其不明智,而在CALayer中早就提供有图层渐变的类和相应 ...

  5. iOS开发之计算两个日期的时间间隔

    //首先创建格式化对象  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDate ...

  6. VBA 把电信的电话费用表转换成部门电话费用明细表(图文)

    今天同事要做一个这种工作.就是把电信发来的费用表,转换成按部门划分的电话费用表,100多部电话,假设一个个去核对,真还是须要些时间的.问题来了,有更好的方法么,我们来看一下. 电信公司给的费用明细是这 ...

  7. 手写 redux 和 react-redux

    1.手写 redux redux.js /** * 手写 redux */ export function createStore(reducer) { // 当前状态 let currentStat ...

  8. vue2.0 自定义过滤器(filter)实例

    一.过滤器简介 (1)过滤器创建 过滤器的本质 是一个有参数 有返回值的方法 new Vue({ filters:{ myCurrency:function(myInput){ return 处理后的 ...

  9. 机房收费系统(VB.NET)个人版总结

    重构版个人机房收费系统大概从暑假开学開始进行.花了不到一个半月的时间才完毕.以下对我在重构过程中的一写理解. 1.系统设计一个非常重要的目的就是重用.而要做到重用,低耦合是最有效的手段回想一下我们C/ ...

  10. SQL server 子查询 链接查询

    数据库 if while else 的使用 数据库运算符优先级