工具函数(代码块的大小,代码块起始地址,提升进程权限)

一些在编程中经常要用到的功能编写成函数,方便使用.

[cpp] view plain copy

  1. #include <windows.h>
  2. //系统类型
  3. typedef enum SystemType
  4. {
  5. WINDOWS_2000 = 1, //5.0
  6. WINDOWS_XP, //5.1
  7. WINDOWS__SERVER_2003, //5.2
  8. WINDOWS__SERVER_2003_R2, //5.2
  9. WINDOWS_VISTA, //6.0
  10. WINDOWS__SERVER_2008, //6.0
  11. WINDOWS__SERVER_2008_R2, //6.1
  12. WINDOWS_7, //6.1
  13. WINDOWS_SERVER_2012,//6.2
  14. WINDOWS_8//6.2
  15. }ST;
  16. /*******获取系统类型*******/
  17. ST GetSystemType()
  18. {
  19. OSVERSIONINFO osvi;
  20. ST st;
  21. ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  22. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  23. GetVersionEx(&osvi);
  24. if (osvi.dwMajorVersion==5)
  25. {
  26. if (osvi.dwMinorVersion==0)
  27. {
  28. st = WINDOWS_2000; //5.0
  29. }
  30. else if (osvi.dwMinorVersion==1)
  31. {
  32. st = WINDOWS_XP; //5.1
  33. }
  34. else if (osvi.dwMinorVersion==2)
  35. {
  36. st = WINDOWS__SERVER_2003; //5.2
  37. }
  38. }
  39. else if(osvi.dwMajorVersion==6)
  40. {
  41. if (osvi.dwMinorVersion==0)
  42. {
  43. st = WINDOWS_VISTA; //6.0
  44. }
  45. else if (osvi.dwMinorVersion==1)
  46. {
  47. st = WINDOWS_7; //6.1
  48. }
  49. else if (osvi.dwMinorVersion==2)
  50. {
  51. st = WINDOWS_8; //6.2
  52. }
  53. }
  54. return st;
  55. }
  56. /*找到代码块的大小*/
  57. DWORD GetCodeSize(HANDLE hModule)
  58. {
  59. if (!hModule) return 0;
  60. unsigned int nSize = 0;
  61. unsigned int v1;
  62. DWORD result;
  63. DWORD p = (DWORD)hModule;
  64. if ( *(WORD *)p == 0x5A4D && (v1 = p + *(DWORD *)(p + 0x3c), *(WORD *)v1 == 0x4550) )
  65. result = *(DWORD *)(v1 + 0x1c);
  66. else
  67. result = 0;
  68. return result;
  69. }
  70. /*找到代码块起始地址*/
  71. DWORD GetCodeStart(HANDLE hModule)
  72. {
  73. if (!hModule) return 0;
  74. unsigned int nSize = 0;
  75. unsigned int v1;
  76. DWORD result;
  77. DWORD p = (DWORD)hModule;
  78. if ( *(WORD *)p == 0x5A4D && (v1 = p + *(DWORD *)(p + 0x3c), *(WORD *)v1 == 0x4550) )
  79. result = *(DWORD *)(v1 + 0x2c);
  80. else
  81. result = 0;
  82. return (DWORD)hModule + result;
  83. }
  84. /*搜索代码特征,找到挂钩地址*/
  85. BYTE* SearchOpcode(BYTE* pOpcodeBytes, unsigned int nOpcodeLen, const char* pLibName)
  86. {
  87. BYTE * pCode = pOpcodeBytes;
  88. int nCodeLen = nOpcodeLen;
  89. HANDLE hModule;
  90. hModule = GetModuleHandleA(pLibName);
  91. DWORD dwCodeSize = GetCodeSize(hModule);
  92. DWORD dwCodeStart = GetCodeStart(hModule);
  93. for (DWORD i = 0; i<dwCodeSize; i++)
  94. {
  95. BYTE* p = (BYTE*)dwCodeStart+i;
  96. int j;
  97. for (j=0; j<nCodeLen; j++)
  98. {
  99. if (*(p+j)==pCode[j])
  100. continue;
  101. else
  102. break;
  103. }
  104. if (j==nCodeLen)
  105. return p;
  106. else
  107. continue;
  108. }
  109. return NULL;
  110. }
  111. BOOL Is64Bit_OS()
  112. {
  113. BOOL bRetVal = FALSE;
  114. IsWow64Process(NULL, &bRetVal);
  115. return bRetVal;
  116. }

单字节转多字节:

[cpp] view plain copy

  1. BOOL ThreadCheckFileTrust(CHAR* lpfileName)
  2. {
  3. if (lpFileName == NULL)
  4. {
  5. return TRUE;
  6. }
  7. HCATADMIN hCatAdmin = NULL;
  8. DWORD dwNum = MultiByteToWideChar(CP_ACP,0,lpFileName,-1,NULL,0);
  9. wchar_t* pcwszFile = new wchar_t[dwNum];
  10. if (!pcwszFile)
  11. {
  12. return FALSE;
  13. }
  14. MultiByteToWideChar(CP_ACP,0,lpFileName,-1,pcwszFile,dwNum);
  15. BOOL bRet =  ThreadCheckFileTrustW(pcwszFile);
  16. delete pcwszFile;
  17. return bRet;
  18. }

根据进程名称枚举进程:

[cpp] view plain copy

  1. static DWORD GetProcessID(wchar_t *ProcessName)  //获得进程PID
  2. {
  3. PROCESSENTRY32 pe32;
  4. pe32.dwSize=sizeof(pe32);
  5. //获得系统内所有进程快照
  6. HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  7. if(hProcessSnap==INVALID_HANDLE_VALUE)
  8. {
  9. OutputDebugStringA("CreateToolhelp32Snapshot error");
  10. return 0;
  11. }
  12. //枚举列表中的第一个进程
  13. BOOL bProcess=Process32First(hProcessSnap,&pe32);
  14. while(bProcess)
  15. {
  16. //比较找到的进程名和我们要查找的进程名,一样则返回进程id
  17. if(wcscmp(wcsupr(pe32.szExeFile),wcsupr(ProcessName))==0)
  18. return pe32.th32ProcessID;
  19. //继续查找
  20. bProcess=Process32Next(hProcessSnap,&pe32);
  21. }
  22. CloseHandle(hProcessSnap);
  23. return 0;
  24. }

提升进程权限:

[cpp] view plain copy

    1. static int EnableDebugPriv(const char * name)  //提升进程为DEBUG权限--"SeDebugPrivilege"
    2. {
    3. HANDLE hToken;
    4. TOKEN_PRIVILEGES tp;
    5. LUID luid;
    6. if(!OpenProcessToken(GetCurrentProcess(),
    7. TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
    8. &hToken) )
    9. {
    10. printf("OpenProcessToken error\n");
    11. return 1;
    12. }
    13. if(!LookupPrivilegeValueA(NULL,name,&luid))
    14. {
    15. printf("LookupPrivilege error!\n");
    16. }
    17. tp.PrivilegeCount = 1;
    18. tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
    19. tp.Privileges[0].Luid = luid;
    20. if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )
    21. {
    22. printf("AdjustTokenPrivileges error!\n");
    23. return 1;
    24. }
    25. return 0;
    26. }

http://blog.csdn.net/chence19871/article/details/37881101

时间: 2024-10-08 21:59:35

工具函数(代码块的大小,代码块起始地址,提升进程权限)的相关文章

工具函数(二)

测试操作 在jQuery中,数据有着各种类型和状态.有时,我们希望能通过判断数据的类型和状态做相应的操作.jQuery提供了五组测试用的工具函数. 测试工具函数 函数名 说明 $.isArray(obj) 判断是否为数组对象,是返回true $.isFunction(obj) 判断是否为函数,是返回true $.isEmptyObject(obj) 判断是否为空对象,是返回true $.isPlainObject(obj) 判断是否为纯粹对象,是返回true $.contains(obj) 判断

java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

java学习中,匿名函数.构造方法.构造代码块.构造方法中调用构造方法(java 学习中的小记录) 作者:王可利(Star·星星) 匿名函数 匿名对象:没有名字的对象 匿名对象使用的注意点: 1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象. 2.匿名对象永远都不可能是一个对象. 如:person new().name = "星星":是不行的 匿名对象的好处:书写简单. 匿名对象使用的场景: 1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.

final、static、代码块、静态代码块、内部类、代码执行顺序

final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上               则为final类,final类不能被继承.一般用于工具类时,同时把工具类构造函数声明为私有,暴露静态共有方法 作用在成员变量上    则视为常量.此时赋值方式有三种:(1)声明时赋值(2)构造函数中赋值(3)代码块中赋值. 即不管哪种方式都要保证在使用该变量之前要确保已经有值.使用该特性,可以强制赋

局部代码块和构造代码块

局部代码块 1 package com_package2; 2 3 public class Person3Demo { 4 public static void main(String[]args) 5 { 6 Person3 p = new Person3(); 7 p.speak(); 8 Person3 p1 = new Person3("hejinjin",23); 9 p1.speak(); 10 Person3 p2 = new Person3("hejinji

关于构造代码块、局部代码块和静态代码块的作用和区别

构造代码块: 直接在类中定义且没有加static关键字的代码块称为{}构造代码; 作用:给对象统一初始化数据 public class Demo1 { public static void main(String[] args) { Test test = new Test(3); //构造代码块会在构造函数被调用时执行, 且在这个例子中比"this.id=id;"语句先执行,作用是给对象统一初始化数据; System.out.println(test); } } class Test

关于java中普通代码块、构造代码块与静态代码块

1.普通代码块 public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现”{普通代码的执行语句}“的就称为普通代码块. *普通代码块执行顺序由他们在代码中出现的次序决定--“先出现先执行” * */ { System.out.println("这里是普通代码块A"); } //new A(); { System.out.println("这里是普通代码块B"); } } 执行结果:这里是普通代

Java中静态代码块、构造代码块、构造函数、普通代码块(转载)

转载自:http://www.cnblogs.com/ysocean/p/8194428.html 目录 1.静态代码块 ①.格式 ②.执行时机 ③.静态代码块的作用 ④.静态代码块不能存在任何方法体中 ⑤.静态代码块不能访问普通变量 2.构造代码块 ①.格式 ②.执行时机 ③.构造代码块的作用 3.构造函数 4.普通代码块 5.执行顺序 6.父类和子类执行顺序 在Java中,静态代码块.构造代码块.构造函数.普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }

java中的静态代码块,构造代码块,构造函数,普通代码块

java中的静态代码块,构造代码块,构造函数,普通代码块 静态代码块: 格式: public class Test1{ static{ System.out.println("这是一个静态代码块");  } } 说明: 1.静态代码块在类加载时也就是项目启动时运行并且只运行一次相当于main函数,有多个静态代码块从上往下依次执行,他是一种主动运行的机制. 2.静态代码块不能存在于任何方法中 构造代码块 格式: public class Test2{ { System.out.print