{"id":1562,"date":"2021-04-03T01:09:20","date_gmt":"2021-04-02T17:09:20","guid":{"rendered":"https:\/\/flandre-scarlet.moe\/blog\/?p=1562"},"modified":"2021-04-03T01:43:51","modified_gmt":"2021-04-02T17:43:51","slug":"%e5%8d%b8%e8%bd%bd-dll-%e8%bf%87%e7%a8%8b%e4%b8%ad%e9%9a%90%e8%97%8f%e7%9a%84%e5%bc%82%e5%b8%b8","status":"publish","type":"post","link":"https:\/\/flandre-scarlet.moe\/blog\/1562\/","title":{"rendered":"\u5378\u8f7d Dll \u8fc7\u7a0b\u4e2d\u9690\u85cf\u7684\u5f02\u5e38"},"content":{"rendered":"<p>\u6700\u8fd1\u6d4b\u8bd5\u65f6\u53d1\u73b0\u4ee3\u7801\u4e2d\u4e00\u5904\u5173\u4e8e std::function \u51fd\u6570\u5bf9\u8c61\u7684\u95ee\u9898\u3002\u5728\u5378\u8f7d\u67d0\u4e2a Dll\uff08\u8bb0\u4e3a A\uff09\u7684\u65f6\u5019\u4f1a\u89e6\u53d1\u8be5\u6a21\u5757\u4e2d\u4e00\u4e2a\u5355\u4f8b\u5bf9\u8c61\u7684\u6790\u6784\uff0c\u5728\u5b83\u6790\u6784\u5185\u90e8\u7684 std::function \u6210\u5458\u65f6\u4ea7\u751f\u4e86\u5185\u5b58\u8bbf\u95ee\u5f02\u5e38\uff080xc0000005\uff09\u3002\u800c\u89e6\u53d1\u8fd9\u4e2a\u5f02\u5e38\u7684 std::function \u5176\u5b9e\u662f\u590d\u5236\u4e8e\u53e6\u4e00\u4e2a Dll\uff08\u8bb0\u4e3a B\uff09\uff0c\u5378\u8f7d Dll A \u65f6\uff0cDll B \u5df2\u7ecf\u5378\u8f7d\u6389\u4e86\u3002<\/p>\n<p>\u6b64\u65f6\u8c03\u7528\u5b83\u5173\u8054\u7684\u51fd\u6570\u4f1a\u629b\u5f02\u5e38\u5bb9\u6613\u7406\u89e3\uff0c\u4f46\u8fd9\u65f6\u5e76\u6ca1\u6709\u8fdb\u884c\u8c03\u7528\u64cd\u4f5c\u3002\u539f\u56e0\u5728\u4e8e\u51fd\u6570\u5bf9\u8c61\u6790\u6784\u65f6\u4f1a\u8c03\u7528\u5173\u8054\u7684 _Delete_this \u65b9\u6cd5\u91ca\u653e\u8d44\u6e90\uff0c\u800c\u8fd9\u4e2a\u51fd\u6570\u4e00\u822c\u5b9a\u4e49\u5728 std \u7684 _Func_impl \/ _Func_impl_no_alloc \u6a21\u677f\u7c7b\u4e2d\u3002\u6240\u4ee5\u5f53\u5b9e\u4f8b\u5316 function \u65f6\u5bf9\u5e94\u5220\u9664\u51fd\u6570\u7684\u4ee3\u7801\u4e5f\u662f\u5c5e\u4e8e\u5f53\u524d\u6a21\u5757\u91cc\u7684\uff08\u4e5f\u5c31\u662f Dll B\uff09\u3002\u73b0\u5728 Dll B \u5df2\u7ecf\u5378\u8f7d\uff0c\u90a3\u4e48\u53ea\u8981\u6709\u4efb\u4f55\u89e6\u53d1\u76f8\u5173\u4ee3\u7801\u6267\u884c\u7684\u64cd\u4f5c\u90fd\u4f1a\u5f15\u53d1\u5f02\u5e38\u3002<br \/>\n<!--more--><\/p>\n<p>\u6240\u4ee5\u81ea\u5df1\u7684\u5c41\u80a1\u8fd8\u662f\u8981\u81ea\u5df1\u64e6\u5e72\u51c0\uff0c\u6e05\u7406\u5de5\u4f5c\u8981\u8bb0\u5f97\u505a\u597d\u3002<\/p>\n<h2>\u672a\u80fd\u89c9\u5bdf\u7684\u5f02\u5e38<\/h2>\n<p>\u770b\u63d0\u4ea4\u8bb0\u5f55\u8fd9\u4e2a\u5f02\u5e38\u4e5f\u5b58\u5728\u6709\u4e00\u6bb5\u65f6\u95f4\u4e86\uff0c\u4f46\u8fd8\u662f\u5728\u6302\u7740\u8c03\u8bd5\u5668\u4e0b\u65f6\u624d\u88ab\u53d1\u73b0\u3002\u8f6f\u4ef6\u4e2d\u5b9e\u9645\u4e0a\u5305\u542b\u4e86\u57fa\u4e8e signal \u7684\u5f02\u5e38\u6355\u83b7\u65b9\u5f0f\uff0c\u663e\u7136\u8fd9\u4e2a\u573a\u666f\u4e0b SIGILL \u7684 handler \u6ca1\u6709\u88ab\u89e6\u53d1\u3001\u540c\u65f6\u5168\u5c40\u7684 UnhandledExceptionFilter \u4e5f\u6ca1\u6709\u88ab\u8c03\u7528\uff0c\u6240\u4ee5\u4f7f\u7528\u65f6\u6ce8\u610f\u4e0d\u5230\u8fd9\u4e2a\u5f02\u5e38\u3002<\/p>\n<p>\u5728\u4ee3\u7801\u4e2d signal \u7684\u6355\u83b7\u65e9\u5728\u6bcf\u4e2a\u7ebf\u7a0b\u521b\u5efa\u540e\u5c31\u4f1a\u6ce8\u518c\u5b8c\u6bd5\uff0c\u800c\u4e14\u663e\u7136\u4e5f\u662f\u6b63\u5e38\u5728\u53d1\u6325\u4f5c\u7528\u7684\u3002\u6b64\u5916\u6700\u4e0a\u5c42\u7684 UnhandledExceptionFilter \u4e5f\u6ca1\u6709\u5f97\u5230\u5904\u7406\u673a\u4f1a\uff0c\u8fd9\u6837\u8003\u8651\u7684\u8bdd\u5e94\u8be5\u662f\u7cfb\u7edf\u5728\u52a0\u8f7d\/\u5378\u8f7d\u52a8\u6001\u5e93\u65f6\u9644\u52a0\u4e86\u989d\u5916\u7684\u5f02\u5e38\u5904\u7406\u5668\u5e76\u5904\u7406\u6389\u4e86\u5f02\u5e38\uff0c\u6240\u4ee5\u6211\u4eec\u81ea\u5df1\u7684\u5f02\u5e38\u62a5\u544a\u6a21\u5757\u624d\u611f\u77e5\u4e0d\u5230\u6709\u5f02\u5e38\u53d1\u751f\u3002<\/p>\n<h2>\u5f02\u5e38\u5206\u53d1<\/h2>\n<p>\u5f02\u5e38\u5206\u53d1\u7684\u6838\u5fc3\u51fd\u6570\u662f <strong>KiDispatchException<\/strong>\uff0c\u5b83\u4f1a\u9996\u5148\u5c1d\u8bd5\u5c06\u5f02\u5e38\u53d1\u9001\u7ed9\u8c03\u8bd5\u5668\u3002\u5982\u679c\u53d1\u9001\u5931\u8d25\u6216\u8005\u8c03\u8bd5\u5668\u6ca1\u6709\u5904\u7406\uff0c\u518d\u8c03\u7528\u5f02\u5e38\u5904\u7406\u5757\u5904\u7406\u5f02\u5e38\u3002\u7528\u6237\u6001\u4e0b\u5f02\u5e38\u5904\u7406\u7531 ntdll \u4e2d\u7684 <strong>KiUserExceptionDispatcher<\/strong> \u51fd\u6570\u8fdb\u884c\u3002KiUserExceptionDispatcher \u5c31\u4f1a\u4ece fs:[0] \u5f00\u59cb\u904d\u5386\u5f02\u5e38\u8fc7\u6ee4\u5668\uff0c\u76f4\u5230\u6709\u5904\u7406\u5668\u5904\u7406\u5f02\u5e38\u6216\u662f\u6267\u884c UnhandledExceptionFilter \u51fd\u6570\u3002\u901a\u8fc7\u5728\u4ee3\u7801\u91cc\u6dfb\u52a0 __try \/ __except \u5c31\u53ef\u4ee5\u6dfb\u52a0\u81ea\u5b9a\u4e49\u7684 seh \u5f02\u5e38\u5904\u7406\u5668\u3002<\/p>\n<p>\u56e0\u4e3a\u5f02\u5e38\u6ce8\u518c\u4fe1\u606f\u5b58\u653e\u5728\u6bcf\u4e2a\u7ebf\u7a0b TIB \u7684\u7b2c\u4e00\u4e2a\u5b57\u6bb5 ExceptionList \u4e2d\uff0c\u800c x86 \u7cfb\u7edf\u4e2d\u7684\u6bb5\u5bc4\u5b58\u5668 fs \u603b\u662f\u6307\u5411\u7ebf\u7a0b\u7684 TIB \u7ed3\u6784\u3002\u4e5f\u5c31\u662f\u8bf4 fs:[0] \u603b\u662f\u6307\u5411\u5f02\u5e38\u5904\u7406\u94fe\u8868\u7684\u8868\u5934\uff0c\u901a\u8fc7\u5b83\u5c31\u53ef\u4ee5\u67e5\u770b\u5230\u7ebf\u7a0b\u4e0a\u6240\u6709\u7684\u5f02\u5e38\u5904\u7406\u5668\u3002\u5728 windbg \u4e2d\u53ef\u4ee5\u4f7f\u7528 <strong>!exchain<\/strong> \u547d\u4ee4\u8f93\u51fa\u5f53\u524d\u7ebf\u7a0b\u7684\u5f02\u5e38\u5904\u7406\u94fe\u3002<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">static BOOL __cdecl dllmain_dispatch(\r\n    HINSTANCE const instance,\r\n    DWORD     const reason,\r\n    LPVOID    const reserved\r\n    )\r\n{\r\n    __try {\r\n        \/\/ process thread attach \u5904\u7406\u4ee3\u7801\r\n\r\n        result = DllMain(instance, reason, reserved);\r\n\r\n        \/\/ process attach failed \u5904\u7406\u4ee3\u7801\r\n\r\n        \/\/ process thread detach \u5904\u7406\u4ee3\u7801\r\n    }\r\n    __except(__scrt_dllmain_exception_filter(\r\n        instance,\r\n        reason,\r\n        reserved,\r\n        dllmain_crt_dispatch,\r\n        GetExceptionCode(),\r\n        GetExceptionInformation()))\r\n    {\r\n        result = FALSE;\r\n    }\r\n    return result;\r\n}\r\n\r\n\r\nextern &quot;C&quot; int __cdecl _seh_filter_dll(\r\n    unsigned long       const xcptnum,\r\n    PEXCEPTION_POINTERS const pxcptinfoptrs\r\n    )\r\n{\r\n    if (xcptnum != ('msc' | 0xE0000000))\r\n        return EXCEPTION_CONTINUE_SEARCH;\r\n    return _seh_filter_exe(xcptnum,pxcptinfoptrs);\r\n}<\/pre>\n<p>\u5728 crt\\src\\vcruntime\\dll_dllmain.cpp \u7684 <strong>dllmain_dispatch<\/strong> \u51fd\u6570\u4e2d\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0ccrt \u7684\u521d\u59cb\u5316\u76f8\u5173\u4ee3\u7801\u4ee5\u53ca DllMain \u90fd\u88ab\u5305\u542b\u5728\u8fd0\u884c\u5e93\u521b\u5efa\u7684 __try \/ __except \u5757\u91cc\uff0c\u8d1f\u8d23\u8fc7\u6ee4\u7684\u662f <strong>__scrt_dllmain_exception_filter<\/strong> \u51fd\u6570\u3002\u800c __scrt_dllmain_exception_filter \u51fd\u6570\u4f1a\u8c03\u7528 <strong>_seh_filter_dll<\/strong>\uff0c\u540e\u8005\u53c8\u4f1a\u8c03\u7528 <strong>_seh_filter_exe<\/strong> \u8fdb\u884c\u5b9e\u9645\u5904\u7406\u3002\u5173\u952e\u7684 signal handler \u89e6\u53d1\u662f\u5728 _seh_filter_exe \u51fd\u6570\u4e2d\u3002\u7136\u800c\u533a\u522b\u5728\u4e8e _seh_filter_dll \u4e2d\u4f1a\u5224\u65ad\u5f53\u524d\u7684\u5f02\u5e38\u662f\u4e0d\u662f\u4e00\u4e2a c++ \u5f02\u5e38\uff08\u5f02\u5e38\u4ee3\u7801\u4e3a 0xe06d7363\uff09\uff0c\u662f\u5c31\u76f4\u63a5\u8df3\u8fc7\u4e0d\u5904\u7406\u3002\u6267\u884c\u4e0d\u53ef\u8bbf\u95ee\u5185\u5b58\u5b9e\u9645\u89e6\u53d1\u7684\u662f 0xc0000005\uff0c\u6240\u4ee5 _seh_filter_dll \u5c31\u4f1a\u76f4\u63a5\u8fd4\u56de EXCEPTION_CONTINUE_SEARCH\u3002<\/p>\n<h2>\u8c03\u8bd5<\/h2>\n<p>\u6211\u5199\u4e86\u4e2a\u7b80\u5355\u7684\u6d4b\u8bd5\u7a0b\u5e8f\u6765\u6a21\u62df\u5f02\u5e38\u53d1\u751f\u7684\u60c5\u51b5<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/-------------------- dll --------------------\r\n#include &lt;Windows.h&gt;\r\n\r\ntypedef void (*FN)();\r\n\r\nclass Class1\r\n{\r\npublic:\r\n  ~Class1() {\r\n    ((FN)1000)();\r\n  }\r\n};\r\n\r\nClass1 c;\r\n\r\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {\r\n  return TRUE;\r\n}\r\n\r\n\/\/-------------------- exe --------------------\r\n#include &lt;csignal&gt;\r\n#include &lt;cstdio&gt;\r\n#include &lt;Windows.h&gt;\r\n\r\nvoid SigillHandler(int) {\r\n  printf(&quot;SigillHandler\\n&quot;);\r\n}\r\nvoid SigsegvHandler(int) {\r\n  printf(&quot;SigsegvHandler\\n&quot;);\r\n}\r\n\r\nint main(int argc, char** argv) {\r\n  signal(SIGILL, SigillHandler);\r\n  signal(SIGSEGV, SigsegvHandler);\r\n  auto hd = LoadLibrary(L&quot;Dll1.dll&quot;);\r\n  FreeLibrary(hd);\r\n  printf(&quot;exit main\\n&quot;);\r\n  return 0;\r\n}\r\n<\/pre>\n<p>\u5728\u8c03\u7528 FreeLibrary \u5378\u8f7d dll \u65f6\u5c31\u4f1a\u89e6\u53d1\u5230\u5168\u5c40\u53d8\u91cf\u6790\u6784\u51fd\u6570\u4e2d\u7684\u5185\u5b58\u8bbf\u95ee\u5f02\u5e38\u3002<br \/>\n\u8c03\u8bd5\u5668\u6536\u5230\u5f02\u5e38\u540e\u67e5\u770b\u5f53\u524d\u7684\u5f02\u5e38\u94fe\uff1a<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">0:000&gt; !exchain\r\n007ef438: Dll1!_filter_x86_sse2_floating_point_exception+12f0 (7bd37510)\r\n007ef554: ucrtbased!_aulldvrm+138 (78b03008)\r\n007ef588: ucrtbased!_except_handler4+0 (78b02410)\r\n  CRT scope  0, func:   ucrtbased!__crt_seh_guarded_call&lt;int&gt;::operator()&lt;&lt;lambda_d74cd35c3df28f16c733e6755eb03555&gt;,&lt;lambda_d121dba8a4adeaf3a9819e48611155df&gt; &amp;,&lt;lambda_ade73ae6aee997c6ba47ce5901b340f9&gt; &gt;+64 (78a56534)\r\n007ef600: Dll1!_except_handler4+0 (7bd34330)\r\n  CRT scope  1, 007ef658: Dll1!_except_handler4+0 (7bd34330)\r\n  CRT scope  0, 007ef6d8: ntdll!_except_handler4+0 (7728af00)\r\n  CRT scope  0, func:   ntdll!LdrpCallInitRoutine+4b72c (772a92ad)\r\n007ef740: ntdll!_except_handler4+0 (7728af00)\r\n  CRT scope  1, filter: ntdll!LdrpProcessDetachNode+438a1 (772ade74)\r\n                func:   ntdll!LdrpProcessDetachNode+438aa (772ade7d)\r\n  CRT scope  0, func:   ntdll!LdrpProcessDetachNode+438b4 (772ade87)\r\n007ef910: Tests!_except_handler4+0 (00143b80)\r\n  CRT scope  0, 007ef98c: ntdll!_except_handler4+0 (7728af00)\r\n  CRT scope  0, filter: ntdll!__RtlUserThreadStart+3ca48 (772b4697)\r\n                func:   ntdll!__RtlUserThreadStart+3cae1 (772b4730)\r\n007ef9a4: ntdll!FinalExceptionHandlerPad56+0 (772988d8)\r\nInvalid exception stack at ffffffff<\/pre>\n<p>\u5f02\u5e38\u53d1\u751f\u65f6\u7684\u5806\u6808\uff1a<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">00 0x3e8\r\n01 Dll1!Class1::~Class1+0x55 \r\n02 Dll1!`dynamic atexit destructor for 'c''+0x28\r\n03 ucrtbased!&lt;lambda_d121dba8a4adeaf3a9819e48611155df&gt;::operator()+0x102\r\n04 ucrtbased!__crt_seh_guarded_call&lt;int&gt;::operator()&lt;&lt;lambda_d74cd35c3df28f16c733e6755eb03555&gt;,&lt;lambda_d121dba8a4adeaf3a9819e48611155df&gt; &amp;,&lt;lambda_ade73ae6aee997c6ba47ce5901b340f9&gt; &gt;+0x53\r\n05 ucrtbased!__acrt_lock_and_call&lt;&lt;lambda_d121dba8a4adeaf3a9819e48611155df&gt; &gt;+0x2e\r\n06 ucrtbased!_execute_onexit_table+0x1e\r\n07 Dll1!__scrt_dllmain_uninitialize_c+0x16 \r\n08 Dll1!dllmain_crt_process_detach+0x7f \r\n09 Dll1!dllmain_crt_dispatch+0x48 \r\n0a Dll1!dllmain_dispatch+0x10b \r\n0b Dll1!_DllMainCRTStartup+0x1f \r\n0c ntdll!LdrxCallInitRoutine+0x16\r\n0d ntdll!LdrpCallInitRoutine+0x51\r\n0e ntdll!LdrpProcessDetachNode+0xb7\r\n0f ntdll!LdrpUnloadNode+0xa2\r\n10 ntdll!LdrpDecrementModuleLoadCountEx+0x4a\r\n11 ntdll!LdrUnloadDll+0x103\r\n12 KERNELBASE!FreeLibrary+0x16\r\n13 Tests!main+0x64 \r\n14 Tests!invoke_main+0x33 \r\n15 Tests!__scrt_common_main_seh+0x157 \r\n16 Tests!__scrt_common_main+0xd \r\n17 Tests!mainCRTStartup+0x8 \r\n18 KERNEL32!BaseThreadInitThunk+0x19\r\n19 ntdll!__RtlUserThreadStart+0x2f\r\n1a ntdll!_RtlUserThreadStart+0x1b<\/pre>\n<p>\u5728 ntdll!ExecuteHandler2 \u4e2d\u4e0b\u65ad\u70b9\u89c2\u5bdf\uff0c\u53ef\u4ee5\u53d1\u73b0\u524d\u9762\u7684\u8fc7\u6ee4\u5668\u90fd\u8df3\u8fc7\u4e86\u5904\u7406\uff0c\u6700\u7ec8\u662f\u7531<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">007ef740: ntdll!_except_handler4+0 (7728af00)\r\n  CRT scope  1, filter: ntdll!LdrpProcessDetachNode+438a1 (772ade74)\r\n                func:   ntdll!LdrpProcessDetachNode+438aa (772ade7d)\r\n  CRT scope  0, func:   ntdll!LdrpProcessDetachNode+438b4 (772ade87)<\/pre>\n<p>\u5904\u7406\u4e86\u5f02\u5e38\uff0c\u5904\u7406\u5f02\u5e38\u65f6\u7684\u5806\u6808<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">0:000&gt; k \r\n00 ntdll!SendMessageToWERService\r\n01 ntdll!ReportExceptionInternal+0xde\r\n02 ntdll!RtlReportExceptionHelper+0x202\r\n03 ntdll!RtlReportException+0x61\r\n04 ntdll!LdrpCalloutExceptionFilter+0x35\r\n05 ntdll!LdrpProcessDetachNode+0x438a9     &lt;----- \u5b83\u6dfb\u52a0\u7684\u5904\u7406\u51fd\u6570\r\n06 ntdll!LdrpUnloadNode+0xa2\r\n07 ntdll!LdrpDecrementModuleLoadCountEx+0x4a\r\n08 ntdll!LdrUnloadDll+0x103\r\n09 KERNELBASE!FreeLibrary+0x16\r\n0a Tests!main+0x64\r\n0b Tests!invoke_main+0x33\r\n0c Tests!__scrt_common_main_seh+0x157\r\n0d Tests!__scrt_common_main+0xd\r\n0e Tests!mainCRTStartup+0x8\r\n0f KERNEL32!BaseThreadInitThunk+0x19\r\n10 ntdll!__RtlUserThreadStart+0x2f\r\n11 ntdll!_RtlUserThreadStart+0x1b<\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u5c06\u5f02\u5e38\u62a5\u544a\u53d1\u9001\u7ed9\u4e86 WER \u670d\u52a1\uff0c\u8be5\u64cd\u4f5c\u5b8c\u6210\u540e\u4e5f\u5c31\u7ed3\u675f\u4e86\u672c\u6b21\u7684\u5f02\u5e38\u5904\u7406\u3002\u5728\u505a\u5b8c\u626b\u5c3e\u7684\u6808\u5c55\u5f00\u540e\u7ebf\u7a0b\u4fbf\u4f1a\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u4ee3\u7801\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u6d4b\u8bd5\u65f6\u53d1\u73b0\u4ee3\u7801\u4e2d\u4e00\u5904\u5173\u4e8e std::function \u51fd\u6570\u5bf9\u8c61\u7684\u95ee\u9898\u3002\u5728\u5378\u8f7d\u67d0\u4e2a Dll\uff08\u8bb0\u4e3a A\uff09\u7684\u65f6\u5019&#8230; <\/p>\n<div class=\"read-more navbutton\"><a href=\"https:\/\/flandre-scarlet.moe\/blog\/1562\/\">\u9605\u8bfb\u66f4\u591a<i class=\"fa fa-angle-double-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[185,186,184,187],"class_list":["post-1562","post","type-post","status-publish","format-standard","hentry","category-debug","tag-kidispatchexception","tag-seh","tag-sigill","tag-187"],"_links":{"self":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts\/1562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/comments?post=1562"}],"version-history":[{"count":17,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts\/1562\/revisions"}],"predecessor-version":[{"id":1579,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts\/1562\/revisions\/1579"}],"wp:attachment":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/media?parent=1562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/categories?post=1562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/tags?post=1562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}