VirtualCode.cpp
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:5k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. /*
  2. *
  3. *  This file is
  4. *    Copyright (C) 2006-2008 Nektra S.A.
  5. *  
  6. *  This program is free software; you can redistribute it and/or modify
  7. *  it under the terms of the GNU Lesser General Public License as published by
  8. *  the Free Software Foundation; either version 2, or (at your option)
  9. *  any later version.
  10. *  
  11. *  This program is distributed in the hope that it will be useful,
  12. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. *  GNU General Public License for more details.
  15. *  
  16. */
  17. #include "VirtualCode.h"
  18. #include "NtApi.h"
  19. #include <Windows.h>
  20. ///
  21. /// Constructors / Destructor
  22. ///
  23. NktVirtualCode::NktVirtualCode(const unsigned int pages, const DWORD proc_id)
  24. : NktAsmCode(pages * NktNtApi::GetPageSize()), _procId(proc_id)
  25. {
  26. _pivot = 0;
  27. }
  28. NktVirtualCode::NktVirtualCode(const NktVirtualCode& cp)
  29. : NktAsmCode(cp), _procId(cp._procId)
  30. {
  31. _pivot = cp._pivot;
  32. }
  33. ///
  34. /// CVirtualCode::read_from
  35. ///
  36. const SIZE_T NktVirtualCode::ReadFrom(const void* addr, const SIZE_T count)
  37. {
  38. SIZE_T ret = 0;
  39. SIZE_T size = _pivot + count;
  40. SIZE_T ptr = (SIZE_T)GetAddress() + _pivot;
  41. if (size > GetSize())
  42. return 0;
  43. HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, _procId);
  44. if (ReadProcessMemory(hProc, addr, (void*)ptr, count, &ret))
  45. {
  46. _pivot += ret;
  47. }
  48. CloseHandle(hProc);
  49. return ret;
  50. }
  51. ///
  52. /// CVirtualCode::write_to
  53. ///
  54. const BOOL NktVirtualCode::WriteTo(void* addr)
  55. {
  56. if (!addr)
  57. return FALSE;
  58. HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, _procId);
  59. BOOL ret = WriteProcessMemory(hProc, addr, (LPVOID)GetAddress(), _pivot, NULL);
  60. CloseHandle(hProc);
  61. return ret;
  62. }
  63. ///
  64. /// CVirtualCode::append
  65. ///
  66. const BOOL NktVirtualCode::Append(asmcode opcode)
  67. {
  68. return ReadFrom(&opcode, sizeof(asmcode)) != 0;
  69. }
  70. const BOOL NktVirtualCode::Append(asmcodew opcode)
  71. {
  72. return ReadFrom(&opcode, sizeof(asmcodew)) != 0;
  73. }
  74. const BOOL NktVirtualCode::Append(asmcode opcode, unsigned int param)
  75. {
  76. typedef NktAsmOpByte<unsigned int, 0> asm_;
  77. asm_ code;
  78. code.opcode = opcode;
  79. code.param = param;
  80. return ReadFrom(&code, sizeof(asm_)) != 0;
  81. }
  82. const BOOL NktVirtualCode::Append(asmcode opcode, unsigned short param)
  83. {
  84. typedef NktAsmOpByte<unsigned short, 0> asm_;
  85. asm_ code;
  86. code.opcode = opcode;
  87. code.param = param;
  88. return ReadFrom(&code, sizeof(asm_)) != 0;
  89. }
  90. const BOOL NktVirtualCode::Append(asmcode opcode, unsigned char param)
  91. {
  92. typedef NktAsmOpByte<unsigned char, 0> asm_;
  93. asm_ code;
  94. code.opcode = opcode;
  95. code.param = param;
  96. return ReadFrom(&code, sizeof(asm_)) != 0;
  97. }
  98. const BOOL NktVirtualCode::Append(asmcodew opcode, unsigned char param)
  99. {
  100. typedef NktAsmOpWord<unsigned char, 0> asm_;
  101. asm_ code;
  102. code.opcode = opcode;
  103. code.param = param;
  104. return ReadFrom(&code, sizeof(asm_)) != 0;
  105. }
  106. const BOOL NktVirtualCode::Append(asmcodew opcode, unsigned short param)
  107. {
  108. typedef NktAsmOpWord<unsigned short, 0> asm_;
  109. asm_ code;
  110. code.opcode = opcode;
  111. code.param = param;
  112. return ReadFrom(&code, sizeof(asm_)) != 0;
  113. }
  114. const BOOL NktVirtualCode::Append(asmcodew opcode, unsigned int param)
  115. {
  116. typedef NktAsmOpWord<unsigned int, 0> asm_;
  117. asm_ code;
  118. code.opcode = opcode;
  119. code.param = param;
  120. return ReadFrom(&code, sizeof(asm_)) != 0;
  121. }
  122. const BOOL NktVirtualCode::Append(const NktVirtualCode& _code)
  123. {
  124. return ReadFrom((LPVOID)_code.GetAddress(), _code.Pivot()) != 0;
  125. }
  126. const BOOL NktVirtualCode::AppendJump(DV_PTR address)
  127. {
  128. unsigned int delta = address - (this->GetAddress() + _pivot + JMP_SIZE);
  129. return Append(JMP, delta);
  130. }
  131. const BOOL NktVirtualCode::AppendCall(DV_PTR address)
  132. {
  133. unsigned int delta = address - (this->GetAddress() + _pivot + JMP_SIZE);
  134. return Append(CALL, delta);
  135. }
  136. ///
  137. /// CVirtualCode::raw_write
  138. ///
  139. void NktVirtualCode::RawWrite(const unsigned int _offset, unsigned int val)
  140. {
  141. DV_PTR base = GetAddress();
  142. _asm
  143. {
  144. push eax
  145. push ebx
  146. mov eax, base
  147. add eax, [_offset]
  148. mov ebx, val
  149. mov [eax], ebx
  150. pop ebx
  151. pop eax
  152. }
  153. //_pivot += sizeof(unsigned int);
  154. }
  155. ///
  156. /// CVirtualCode::raw_read
  157. /// TODO: add mapping for remote process.
  158. ///
  159. void NktVirtualCode::RawRead(unsigned int _offset, unsigned int* out_val)
  160. {
  161. DV_PTR base = GetAddress();
  162. _asm
  163. {
  164. push esi
  165. push edi
  166. mov esi, base
  167. add esi, [_offset]
  168. mov edi, out_val
  169. movsd
  170. pop edi
  171. pop esi
  172. }
  173. }
  174. ///
  175. /// CVirtualCode::pivot()
  176. ///
  177. const SIZE_T NktVirtualCode::Pivot() const
  178. {
  179. return _pivot;
  180. }
  181. ///
  182. /// CVirtualCode::clear
  183. ///
  184. void NktVirtualCode::Clear()
  185. {
  186. _pivot = 0;
  187. }