haxtivitiez.wordpress.com
Open in
urlscan Pro
192.0.78.13
Public Scan
Submitted URL: http://haxtivitiez.wordpress.com/
Effective URL: https://haxtivitiez.wordpress.com/
Submission: On July 06 via api from US — Scanned from DE
Effective URL: https://haxtivitiez.wordpress.com/
Submission: On July 06 via api from US — Scanned from DE
Form analysis
4 forms found in the DOMGET https://haxtivitiez.wordpress.com/
<form role="search" method="get" class="search-form" action="https://haxtivitiez.wordpress.com/">
<label>
<span class="screen-reader-text">ค้นหาสำหรับ:</span>
<input type="search" class="search-field" placeholder="ค้นหา …" value="" name="s">
</label>
<input type="submit" class="search-submit" value="ค้นหา">
</form>
GET https://haxtivitiez.wordpress.com/
<form role="search" method="get" class="search-form" action="https://haxtivitiez.wordpress.com/">
<label>
<span class="screen-reader-text">ค้นหาสำหรับ:</span>
<input type="search" class="search-field" placeholder="ค้นหา …" value="" name="s">
</label>
<input type="submit" class="search-submit" value="ค้นหา">
</form>
POST https://subscribe.wordpress.com
<form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;">
<div>
<input type="email" name="email" placeholder="ใส่อีเมลล์ของคุณที่นี่" class="actnbr-email-field" aria-label="ใส่อีเมลล์ของคุณที่นี่">
</div>
<input type="hidden" name="action" value="subscribe">
<input type="hidden" name="blog_id" value="107397492">
<input type="hidden" name="source" value="https://haxtivitiez.wordpress.com/">
<input type="hidden" name="sub-type" value="actionbar-follow">
<input type="hidden" id="_wpnonce" name="_wpnonce" value="e08df6c29d">
<div class="actnbr-button-wrap">
<button type="submit" value="Sign me up"> Sign me up </button>
</div>
</form>
<form id="jp-carousel-comment-form">
<label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label>
<textarea name="comment" class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" id="jp-carousel-comment-form-comment-field" placeholder="Write a Comment..."></textarea>
<div id="jp-carousel-comment-form-submit-and-info-wrapper">
<div id="jp-carousel-comment-form-commenting-as">
<fieldset>
<label for="jp-carousel-comment-form-email-field">อีเมล (Required)</label>
<input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field">
</fieldset>
<fieldset>
<label for="jp-carousel-comment-form-author-field">ชื่อ (Required)</label>
<input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field">
</fieldset>
<fieldset>
<label for="jp-carousel-comment-form-url-field">เว็บไซต์</label>
<input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field">
</fieldset>
</div>
<input type="submit" name="submit" class="jp-carousel-comment-form-button" id="jp-carousel-comment-form-button-submit" value="แสดงความเห็น">
</div>
</form>
Text Content
ข้ามไปยังเนื้อหา เมนูหลัก * HARDWARE * KNOWLEDGE * NETWORK * PROGRAMMING * TUTORIALS * HACKING * PROOF OF CONCEPT * CHALLENGE * PENETRATION TESTING * FOLLOW ME * Github * Youtube ค้นหา ค้นหาสำหรับ: |H4XT1V1T13Z| EAT // SLEEP(CODE); // HACK // REPEAT DRIVER 101 – PART 1 พฤศจิกายน 15, 2023พฤศจิกายน 15, 2023un4ckn0wl3zใส่ความเห็น DRIVER คืออะไร ปกติแล้ว driver คือ software ที่จัดการการคุยกันระหว่าง OS ไม่ว่าจะเป็น Windows, Linux หรือ Mac (ในที่นี้จะ focus ที่ Windows) กับ hardware ของ computer เช่น motherboard, hard disk, การ์ดจอ เวลาเราซื้อ hardware computer มาใหม่ เราก็มักจะต้อง install software จากผู้ผลิต และ software พวกนี้นอกจะเป็น panel ในการตั้งค่า hardware แล้ว ก็มักจะให้ driver มาด้วย ด้วยเหตุผลนี้ driver จึงต้องทำงานในข้าง kernel mode จริงๆแล้ว driver ไม่จำเป็นต้องเป็นอะไรที่จัดการ hardware เสมอไป มันยังมี software ที่เป็น driver แต่ไม่ได้คุยกับ hardware เลยก็มี เช่น anti-cheat หรือ anti-virus เพื่อใช้ป้องกันเครื่องของเราจาก malware ความเสี่ยงที่อาจเกิดขึ้นจาก DRIVER ถ้าเป็น software ที่เป็น user-mode ทั่วๆไป หากมีการ crash ของ software ผลกระทบที่แย่ที่สุดที่เกิดขึ้นคือ data หาย เนื่องจาก save data ไม่ทัน เพราะโปรแกรม crash ไปก่อน เคสแบบนี้ OS เองจะมีการเข้ามาช่วยจัดการได้ เช่น อาจจะมีการ alert บอกว่า โปรแกรม crash เพราะอะไร จากนั้นก็ release resource ของ โปรแกรมคืนให้ computer ไป แต่พอเป็น driver แล้ว มันจะทำงานอยู่ในฝั่ง kernel ถ้าเกิดข้อผิดพลาด ก็คือพลาดไปเลย อีกเคสนึงคือ ถ้าโปรแกรมฝั่ง user-mode crash หรือปิดตัวลง OS kernel จะมีหน้าที่คืน resource ให้เครื่อง แต่ถ้าเกิด memory leak ใน driver software ที่ทำงานอยู่ฝั่ง kernel… OS kernel จะไม่สามารถคืน resource ให้เครื่องได้ resource ใดๆก็ตามที่ leak ในฝั่ง kernel จะถูกคืนให้เครื่องก็ต่อเมื่อ reboot เท่านั้น หรือหากเป็นเคสที่ driver เองก็ไม่ได้ handle ไว้ ก็จะเจอกับ BSOD (Blue screen of death) สาเหตุของการเกิด BSOD เกิดได้จาก 2 สาเหตุคือ 1. เกิดจาก OS ไม่สามรถรัน driver code ต่อไปได้ 2. Kernel Patch Protection (KPP) ตรวจเจอ บางอย่างที่ผิดปกติใน kernel แล้วก็สั่ง KeBugCheck ทำงาน KeBugCheck จะโชว์ BSOD พร้อมกับ error code เพื่อให้ user นำไป trace ปัญหาต่อได้ว่าเกิด BSOD เพราะอะไร เพราะฉนั้นจะเห็นว่า kernel เป็นพื้นที่ที่เปราะบางมาก สมมุติว่าเราเขียน driver ให้ไปอ่านค่า memory จาก address นึง ซึ่งหาก address นั้นไม่มีอยู่จริง หรือ เป็น address ที่ผิด ก็สามารถ trigger KeBugCheck ให้ออก BSOD ได้เลย เพราะฉนั้น ไม่ว่าเราจะเขียน malware หรือ โปรโกงเกม ที่เป็น driver สิ่งที่เราต้องคำนึงถึงคือ การ crash ของ driver (ทางที่ดี มันไม่ควรเกิดขึ้น) KERNEL PATCH PROTECTION KPP หรือ PatchGuard ในอีกชื่อ คือ feature ที่อยู่ใน windows ที่ ออกแบบมาเพื่อป้องกันการแก้ไขบางอย่างใน kernel ที่ไม่ได้รับอนุญาต ซึ่งจะมีรอบการทำงานของมันอยู่ใน windows มันจะไล่เช็คค่าบางอย่างที่ sensitive ที่ Microsoft มองว่าควรตรวจสอบ หากมีการแก้ไข data พวกนี้ KPP จะ trigger KeBugCheck แล้วก็โชว์ BSOD ให้เราเห็นเหมือนเดิม อย่างที่กล่าวไปว่า KPP นั้นมีรอบการทำงานของมันอยู่ มันไม่ได้ทำงานตลอดเวลา เพราะทุกการไล่ตรวจ kernel ของ KPP นั้นต้องแลกด้วย การคำนวณบางอย่างซึ่งทำให้เครื่อง computer เสีย performance และนี่คือ จุดอ่อนของ KPP Region ใน kernel ที่ถูกป้องกันด้วย KPP นั้นมันจะมีบางจังหวะ ที่ไม่ได้ถูกตรวจสอบจริงๆ ทำให้เราสามารถแอบแก้ไข kernel ได้ ณ ช่วงเวลาหนึ่ง แล้วก็แก้ไขคืน ถ้าทำแบบนี้แล้ว KPP ก็จะไม่ทันสังเกต แต่เราก็ไม่รู้อีกอยู่ดีว่า KPP มีรอบทำงานยังไง แต่ปกติแล้วถ้าเราเซ็ต Windows ให้เปิด kernel debug mode …. KPP ก็จะถูกปิด ซึ่งตอนที่เราเขียน driver ก็ควรปิด KPP เพื่อป้องกันการเกิด BSOD ระหว่าง develop driver DRIVER ENTRY เรามาลองเขียน driver กันดูครับ ก่อนอื่นเลยต้องไป setup เครื่องเราให้เขียนได้ driver ได้ก่อน ซึ่งแนะนำให้อ่าน guide ของ Microsoft ตามนี้ดูครับ https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk สำหรับการสร้าง Project driver ให้ทำการเปิด Visual Studio ขึ้นมา เลือก template ที่เป็น Kernel Mode Driver, Empty (KMDF) จากนั้นให้เพิ่ม Source Files ตั้งชื่ออะไรก็ได้ ของผมจะเป็น FirstDriver.cpp สิ่งแรกที่ Driver ต้องการคือ function DriverEntry ให้คิดซะว่ามันคือ function main ในฝั่ง user-mode application This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) view raw FirstDriver.cpp hosted with by GitHub จะต้องมีการ return STATUS_SUCCESS กลับออกไปด้วย This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters #include <ntddk.h> NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { return STATUS_SUCCESS; } view raw FirstDriver.cpp hosted with by GitHub ถ้าเกิดเราลอง compile driver ดู ก็จะเจอกับ warning message unreferenced parameters ในการเขียน driver เราจำเป็นต้องจัดการกับ warning เหล่านี้ เพื่อลดความเสี่ยงที่จะทำให้ driver ทำงานผิดพลาด เช่นการเกิด memory leak เราสามารถแก้ปัญหานี้ได้โดยการเพิ่มโค้ด 2 บรรทัดนี้ เพื่อบอกว่า ตัวแปร DriverObject และ RegistryPath ยังไม่มี reference เกิดขึ้น (ยังไม่มีการเรียกใช้งาน) UNREFERENCED_PARAMETER(DriverObject); UNREFERENCED_PARAMETER(RegistryPath); PRINTING DEBUG MESSAGES เราสามารใช้คำสั่ง DbgPrint สำหรับส่ง debug message ไปยัง kernel debugger ได้ DbgPrint("[+] Hello from FirstDriver DriverEntry\n"); LOADING AND RUNNING THE DRIVER สำหรับการทดสอบ run driver ส่วนผมตัวผมมี VM สำหรับ run อยู่แล้ว หากใครยังไม่มี ให้ลอง setup VM ตามนี้ครับ https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/debug-universal-drivers—step-by-step-lab–echo-kernel-mode- ผมมีการต่อ WinDbg เข้าไปยัง VM ผ่าน name pipe อยู่ เพื่อใช้ในการดู debug message หรือใครสะดวกใช้ DebugView ก็ได้ครับ โดย default แล้ว windows จะปิดการ write kernel debug message ไว้ เราจะต้องไป enable ก่อนทำการ run driver ผ่านตัว RegEdit สามารถดูวิธีการ enable ได้ตามนี้ครับ https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/compiling-first-kernel-driver-kdprint-dbgprint-and-debugview การทดสอบ run driver อาจจะมีหลายวิธี ทั้งการใช้คำสั่ง sc ใน Windows หรือใช้ kdmapper แต่ส่วนตัวผมจะใช้โปรแกรมที่ชื่อ OsrLoader ครับ ให้ทำการ compile driver จากเครื่อง host แล้วนำไปใส่ไว้ใน VM จากนั้นลองใช้โปรแกรม OsrLoader run driver ขึ้นมาดูครับ ก็จะเจอกับ message ที่เราสั่ง debug ไว้ DRIVER UNLOAD เมื่อ Unload driver … resource ต่างๆ ที่เคย declare ไว้ก็ต้องคืนให้กับระบบด้วย โดยจะต้อง เซ็ตค่า function pointer ให้กับ ค่า DriverUnload ใน object DriverObject โดยโค้ดตัวอย่างผมจะ allocate memory pool ขึ้นมาโดยใช้ api ExAllocatePoolWithTag จากนั้นเมื่อถึง state ที่ driver unload ก็จะทำการคืน pool ให้กับ resource ผ่าน api ExFreePoolWithTag ผลการ write debug message ตอน unload ขอจบ Driver 101 – part 1 ไว้แค่นี้นะครับ หวังว่าจะเห็นภาพ anatomy เบื้องต้นของ driver ถ้าผมมีเวลาน่าจะกลับมาเขียนต่อ part 2 ซึ่งผมไม่ค่อยมีอยู่ละ Driver code snippet: This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters #include <ntddk.h> extern "C" NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(DriverObject); UNREFERENCED_PARAMETER(RegistryPath); DbgPrint("[+] Hello from FirstDriver DriverEntry\n"); return STATUS_SUCCESS; } view raw DriverAnatomy.cpp hosted with by GitHub Driver Unload snippet: This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters #pragma warning(disable: 4996) #include <ntddk.h> void DriverCleanup(PDRIVER_OBJECT DriverObject); PVOID someAllocation; extern "C" NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); DbgPrint("[+] Hello from FirstDriver DriverEntry\n"); DriverObject->DriverUnload = DriverCleanup; someAllocation = ExAllocatePoolWithTag( PagedPool, 1024, 'TAG1'); DbgPrint("[+] Memory allocated at 0x%08p", someAllocation); return STATUS_SUCCESS; } void DriverCleanup( PDRIVER_OBJECT DriverObject ) { UNREFERENCED_PARAMETER(DriverObject); DbgPrint("[+] Hello from FirstDriver DriverUnload\n"); DbgPrint("[+] Freeing memory at 0x%08p", someAllocation); ExFreePoolWithTag( someAllocation, 'TAG1'); DbgPrint("[+] Memory freed\n"); } view raw DriverUnloadAnatomy.cpp hosted with by GitHub ไม่มีหมวดหมู่driver OFFENSIVE CODING | D/INVOKE มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น Dynamic Invoke (D/Invoke) คือ open-source C# project คือสิ่งที่จะนำมาทดแทนการใช้ P/Invoke เพราะว่ามัน powerful กว่า เช่น * สามารถเรียก unmanaged code ได้โดยไม่แตะ P/Invoke. * ใช้เทคนิค Manually map ในการ load PE ไปยัง memory * Generate syscall wrapper สำหรับเรียก Native API แล้วมันต่างจาก P/Invoke ตรงไหน คำตอบคือ P/Invoke ไม่สามารทำ Evasion ได้ดี เพราะทุกครั้งที่เรามีการ call unmanaged code หรือ API พวก Antivirus หรือ EDR จะเห็น import function ทั้งหมด ทำให้ custom tool ของเรา โดน Detected จากรูปจะเป็นการใช้โปรแกรม PEStudio เพื่อดู import function เพื่อ analyze ตัว PEไฟล์ที่ใช้ P/Invoke ทดลองเรียก MESSAGEBOX ด้วย DINVOKE เราจะเรียก UnmanagedFunctionPointer attribute แทน DllImport attribute เพราะ DInvoke โดยหน้าตาของ signature จะประมาณนี้ [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)] delegate int MessageBoxW(IntPtr hWnd, string lpText, string pCaption, uint uType); แล้วทำการ Invoke function MessageBoxW ผ่าน DInvoke.DynamicInvoke.Generic.DynamicAPIInvoke ทดลองรัน โค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters using System; using System.Runtime.InteropServices; using DInvoke.DynamicInvoke; namespace ConsoleApp1 { internal class Program { [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)] delegate int MessageBoxW(IntPtr hWnd, string lpText, string pCaption, uint uType); static void Main(string[] args) { var parameters = new object[] { IntPtr.Zero, "My first D/Invoke!", "Hello World", (uint)0 }; Generic.DynamicAPIInvoke("user32.dll", "MessageBoxW", typeof(MessageBoxW), ref parameters); } } } view raw divk.cs hosted with by GitHub เราสามารถ invoke function ไอ้อีกแบบคือ เรียกจาก GetLibraryAddress แทน DynamicAPIInvoke ในกรณีที่เราต้องการเรียก MessageBoxW หลายครั้ง โค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters using System; using System.Runtime.InteropServices; using DInvoke.DynamicInvoke; namespace ConsoleApp1 { internal class Program { [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)] delegate int MessageBoxW(IntPtr hWnd, string lpText, string pCaption, uint uType); static void Main(string[] args) { var address = Generic.GetLibraryAddress("user32.dll", "MessageBoxW"); var messageBoxW = (MessageBoxW)Marshal.GetDelegateForFunctionPointer(address, typeof(MessageBoxW)); messageBoxW(IntPtr.Zero, "Box 1", "Box 1", 0); messageBoxW(IntPtr.Zero, "Box 2", "Box 2", 0); } } } view raw divk2.cs hosted with by GitHub ไม่มีหมวดหมู่Dinvoke, Offensive Coding, Red Teamer, WIndows API OFFENSIVE CODING | P/INVOKE | ORDINALS มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น การ call unmanaged api โดยการเรียกใช้ผ่าน attribute DllImport นั้นมี option เพิ่มเติมอีก ซึ่งอาจจะใช้หลบ AV signature ได้ โดยบทความที่ผ่านมาเราได้เรียก MessageBoxW ผ่าน DllImport ตามข้างล่างนี้ [DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType); โดยชื่อ method ที่เราใช้เรียกนั้นต้องตรงกับ API name กับทางฝั่ง unmanaged code เช่น MessageBoxW ถ้าหากมี Antivirus monitoring ค่านี้อยู่เราก็จะโดน detected … แล้วเรามีวิธีการอื่นไหมที่จะเรียก function MessageBoxW โดยไม่ป้อนชื่อ สิ่งนั้นคือ Ordinal ครับ ordinal คือหมายเลข identifier ของ export function จาก DLL คิดซะว่ามันคือ Primary Key ใน database โดยทุก export function ใน DLL จะมีหมายเลขนี้กำกับอยู่ และจำไม่ซ้ำกัน เราสามารถใช้เลขนี้เรียก function ได้ แล้วเราจะรู้หมายเลขนี้ได้ยังไง เราสามารถใช้โปรแกรม PEView ดูค่านี้ได้ อย่าในรูปจะเห็นว่า function MessageBoxW จะมีเลข ordinal = 086C ให้ทำการแปลงจากเลขฐาน 16 (hex) เป็นเลขฐาน 10 (decimal) ก็จะได้เท่ากับ 2156 ให้นำ value 2156 ไปใส่ใน property EntryPoint ตามรูป แล้วเปลี่ยนชื่อ function เป็นอะไรก็ได้ ทดลองรัน หมายเหตุ. เลข Ordinal จะเปลี่ยนไปตาม version ของ windows ต้องเลือกให้ตรงกับ Windows ที่ run โปรแกรมของเราด้วยนะคับ ไม่มีหมวดหมู่Offensive Coding, Red Teamer, WIndows API OFFENSIVE CODING | P/INVOKE | CREATEPROCESS มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น ก่อนหน้านี้เรามีการเรียก CreateProcess API ใน C++ เราจะต้อง define STARTUPINFO และ PROCESS_INFORMATION data structure ใน C# เราสามารถสร้าง struct แบบเดียวกับใน C++ ได้เช่นกันโดยใช้ type struct โค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters using System; using System.Runtime.InteropServices; namespace PInvoke { internal class Program { [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public int cb; public IntPtr lpReserved; public IntPtr lpDesktop; public IntPtr lpTitle; public int dwX; public int dwY; public int dwXSize; public int dwYSize; public int dwXCountChars; public int dwYCountChars; public int dwFillAttribute; public int dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public int dwProcessId; public int dwThreadId; } [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public int nLength; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; } [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] static extern bool CreateProcessW(string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); static void Main(string[] args) { } } } view raw c.cs hosted with by GitHub จะเห็นว่าเราต้อง implement เพิ่มเติมเยอะเลย ถ้าเทียบกับ C++ และตรง attribute DllImport มา property เพิ่มเข้ามา SetLastError = true SetLastError จะเป็นการบอก .NET Runtime ว่า เราต้องการที่จะ capture error code โดยสามารถเรียกดู error code ได้จาก Marshal.GetLastWin32Error() ซึ่งจะเทียบเท่า GetLastError() ใน Win32 API อีกจุดที่น่าสังเกตคือ ถ้าเราอ่าน doc ของ API CreateProcessW จะมี parameter ที่ต้องส่งเข้าไป (in) เป็นประเภท pointer (เช่น &si ใน C++) ในกรณีที่เราเรียกผ่าน P/Invoke เราจะใช้ keyword ref ส่วนขาที่ต้องส่ง data ออก (out) เราก็จะใช้ keyowrd out ทดลองรัน โปรแกรม โค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters using System; using System.Runtime.InteropServices; namespace PInvoke { internal class Program { [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public int cb; public IntPtr lpReserved; public IntPtr lpDesktop; public IntPtr lpTitle; public int dwX; public int dwY; public int dwXSize; public int dwYSize; public int dwXCountChars; public int dwYCountChars; public int dwFillAttribute; public int dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public int dwProcessId; public int dwThreadId; } [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public int nLength; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; } [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] static extern bool CreateProcessW(string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); static void Main(string[] args) { var si = new STARTUPINFO(); si.cb = Marshal.SizeOf(si); var pa = new SECURITY_ATTRIBUTES(); pa.nLength = Marshal.SizeOf(pa); var ta = new SECURITY_ATTRIBUTES(); ta.nLength = Marshal.SizeOf(ta); var pi = new PROCESS_INFORMATION(); var success = CreateProcessW( "C:\\Windows\\System32\\notepad.exe", null, ref pa, ref ta, false, 0, IntPtr.Zero, "C:\\Windows\\System32", ref si, out pi); if (success) Console.WriteLine("Process created with PID: {0}.", pi.dwProcessId); else Console.WriteLine("Failed to create process. Error code: {0}.", Marshal.GetLastWin32Error()); } } } view raw notepad.cs hosted with by GitHub ไม่มีหมวดหมู่Offensive Coding, Red Teamer, WIndows API OFFENSIVE CODING | P/INVOKE | TYPE MARSHALLING มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น Marshalling คือ process การแปลง data type ระหว่าง managed code และ unmanaged code โดย default ตัว P/Invoke จะแปลงให้เราโดยอัตโนมัติ แต่บางครั้งเราก็ต้องแปลงเอง ในบทความที่แล้ว เรามีการเรียก MessageBoxW fucntion ที่มีการรับ string เป็น Unicode (LPCWSTR) แต่ครั้งก่อนเราแค่โยน string เข้าไป เพราะมีเจ้า P/Invoke จัดการเรื่อง Marshalling type ให้เราเอง แต่ถ้าเราอยากจะ manual ก็สามารถทำได้เช่นกัน โดยเรียกใช้ attribute MarshalAs [DllImport("user32.dll")] static extern int MessageBoxW( IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] string lpText, [MarshalAs(UnmanagedType.LPWStr)] string lpCaption, uint uType); Microsoft เองได้มี Document ที่รวบรวมตารางการ marshalling type ไว้ให้ สามารถอ่านเพิ่มเติมได้ที่ https://learn.microsoft.com/en-us/dotnet/framework/interop/marshalling-data-with-platform-invoke ไม่มีหมวดหมู่Offensive Coding, Red Teamer, WIndows API OFFENSIVE CODING | P/INVOKE มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น Platform Invoke (P/Invoke) คือสิ่งที่จะทำให้เราเข้าถึง struct และ function ที่อยู่ใน unmanaged library ปกติถ้าเราเขียนโค้ดในภาษา c หรือ c++ โค้ดของเราก็จะถูก compile เป็น machine code (ภาษาเครื่อง) ซึ่งเราก็จะเรียกพวก native code ตระกูลนี้ ว่า unmanaged code unmanaged code คือ code program ที่ programmer อย่างเราๆต้อง manage เรื่อง memory หรือ จุดๆอื่นด้วยตัวเอง ตัวอย่างเช่นเวลาเราประกาศใช้ memory ซักที่ เราก็ต้องมาคอย free เจ้า memory นั้นด้วยตัวเอง มันถึงถูกเรียกว่า unmanaged code แต่จะมีอีกคำศัพท์นึงคือ managed code ก็คือสิ่งที่ตรงกันข้ามกับ unmanaged code โดย managed code มักจะรันอยู่ใต้ CLR (Common Language Runtime) ตัวอย่างเช่น ภาษา C# ภาษา C# จะถูก compile ไปเป็น ภาษากลางก่อน คือ Intermediate Language (IL) แล้วหลังจากนั้นตัว CLR จะคอยแปลง IL ไปเป็น machine code ในระหว่าง runtime เราอาจจะคุ้นชินกับคำว่า garbage collection ซึ่งก็เป็นสิ่งหนึ่งที่ CLR จัดการให้เราด้วย เกริ่นมาตั้งนานแล้วมันเกี่ยวอะไรกับ P/Invoke จะลองยกตัวอย่างด้วย .NET ละกันครับ ปกติ .NET จะใช้ P/Invoke เป็นเบื้องหลังอยู่แล้ว เช่นปกติถ้าเราอยากจะสร้าง process แบบที่เราเคยทำในภาษา C++ ใน .NET คือการเรียก Method Start ที่อยู่ใต้คลาส System.Diagnostics.Process ถ้าเราลอง trace method นี้ในตอน runtime เราจะเห็นว่ามีการใช้ P/Invoke ในการเรียก CreateProcess API อีกที ด้วยวิธีการที่ .NET เรียกใช้ P/Invoke แบบนี้ ทำให้เราไม่สามารถ Custom struct STARTUPINFO อย่างที่เคยทำในภาษา C++ ได้ เช่นการสร้าง process ใน suspended state และยังมี API อีกหลายตัวที่ .NET ไม่ได้ expose มาให้เราใช้เช่น VirtualAllocEx, WriteProcessMemory, CreateRemoteThread ดังนั้นเราจึงต้อง custom P/Invoke ของเราขึ้นเอง ทดลองเรียก MESSAGEBOX ใน C# ผ่าน P/INVOKE เปิด Visual Studio ขึ้นมาแล้วสร้าง C# Console App (.NET Framework) project. สิ่งแรกในการเขียน P/Invoke คือ เรียก attribute DllImport เพื่อบอก .NET runtime ว่าจะมีการเรียก unmanaged DLL มาใช้งาน โค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters using System; using System.Runtime.InteropServices; namespace PInvoke { internal class Program { [DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType); static void Main(string[] args) { } } } view raw Msg.cs hosted with by GitHub ตรงส่วน attribute เราจะ define ตัว character set เพื่อให้ .NET runtime ทำการ marshal string ไปยัง unmanaged type ได้ถูกต้อง ชื่อ method ที่ต้องการเรียกต้องตรงกับ unmanaged API ที่เราต้องการจะเรียก ในตัวอย่างคือเราจะเรียก function MessageBoxW ค่า return type และ input parameter ก็ต้อง define ให้ตรงด้วย ถ้าเราไม่ทราบ signature ของ api ไหนสามารถเข้าไปหาได้ที่ http://pinvoke.net/ ที่ได้รวบรวม signature ไว้เกือบทุก api อีกอย่างที่ต้องทำคือการแปลง type จาก unmanaged types เป็น managed type เช่นในภาษา c++ จะมีการส่งค่า HANDLE ไปยัง MessageBox ด้วย ในกรณีของ C# เราจะแปลงไปเป็น IntPtr ทดลองรัน โค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters using System; using System.Runtime.InteropServices; namespace PInvoke { internal class Program { [DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType); static void Main(string[] args) { MessageBoxW(IntPtr.Zero, "My first P/Invoke", "Hello World", 0); } } } view raw pmsg.cs hosted with by GitHub ไม่มีหมวดหมู่Offensive Coding, Red Teamer, WIndows API OFFENSIVE CODING | CREATEPROCESS IN C++ มีนาคม 19, 2023มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น บทความนี้จะเป็นบทความสั้นๆต่อจาก part ที่แล้วครับ (https://haxtivitiez.wordpress.com/2023/03/19/offensive-coding-windows-api/) บทความนี้จะลอง สร้าง process ผ่าน Windows API กันครับ โดย CreateProcess API จะต้องการ data structure เพิ่มเติม 2 ตัวคือ STARTUPINFO และ PROCESS_INFORMATION โค้ดตัวอย่าง This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters #include <iostream> #include <Windows.h> int main() { STARTUPINFO si; PROCESS_INFORMATION pi; } view raw Win32API_CreateProcess.cpp hosted with by GitHub ลองเอาเมาส์ไปวางที่ STARTUPINFO แล้วก็ F12 ก็จะเห็น property ทั้งหมด ของ STARTUPINFO ครับ STARTUPINFO Properties typedef struct _STARTUPINFOW { DWORD cb; LPWSTR lpReserved; LPWSTR lpDesktop; LPWSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFOW, *LPSTARTUPINFOW; PROCESS_INFORMATION Properties typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; ปกติเวลาทำงานกับ Windows API เราต้องอ่าน Doc จากทาง Microsoft ควบคู่ไปด้วย เพื่อจะได้ทราบวิธีใช้งานครับ เช่นในที่นี้เรากำลังจะทำงานกับ API CreateProcess สามารถเข้าไปอ่าน Doc ได้ที่ https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw ซึ่งจากวิธีการใช้ Doc … property “cb” ใน STARTUPINFOW จะต้องเป็น size ของ structure This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters int main() { STARTUPINFO si; si.cb = sizeof(si); PROCESS_INFORMATION pi; } view raw cb.cpp hosted with by GitHub และเพื่อความชัวร์ เราควรเคลียร์ memory region ของตัวแปร si และ pi โดยการใช้ API ZeroMemory สำหรับปรับ value ใน memory ที่กำลังจองสำหรับ struct STARTUPINFO และ PROCESS_INFORMATION เป็น 0 This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters int main() { STARTUPINFO si; si.cb = sizeof(si); ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); } view raw clear.cpp hosted with by GitHub ตอนนี้เราเตรียม data สำหรับเรียก API CreateProcess พร้อมแล้ว ถ้าเราเรียก CreateProcess สำเร็จ พวกข้อมูลของ process จะอยู่ใน pi structure (เช่น dwProcessId คือ Process ID) ถ้า error ให้เรา get data จาก api GetLastError เพื่อดูข้อมูลความผิดพลาด จากโค้ดตัวอย่างจะเป็นการเรียก notepad.exe This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters #include <iostream> #include <Windows.h> int main() { STARTUPINFO si; si.cb = sizeof(si); ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); BOOL success = CreateProcess( L"C:\\Windows\\System32\\notepad.exe", NULL, 0, 0, FALSE, 0, NULL, L"C:\\Windows\\System32", &si, &pi); if (success) { printf("Process created with PID: %d.\n", pi.dwProcessId); return 0; } else { printf("Failed to create process. Error code: %d.\n", GetLastError()); return 1; } } view raw create_notepad.cpp hosted with by GitHub ไม่มีหมวดหมู่Offensive Coding, Red Teamer, WIndows API OFFENSIVE CODING | WINDOWS API มีนาคม 19, 2023มีนาคม 19, 2023un4ckn0wl3zใส่ความเห็น บทความนี้จะเป็นบทความแรกที่ผมจะเริ่มเขียน blog เกี่ยวกับ Offensive Coding ออกตัวก่อนว่าผมไม่ได้ทำงานสาย security แต่อย่างใดนะครับ ถ้ามีคนในวงการ OPSEC ผ่านมาเห็นแล้วมีข้อมูลผิดพลาด ขอ อภัยไว้ ณ ที่นี่ด้วยนะครับ /\ ผมไม่สามารถแปลคำว่า Offensive Coding เป็นไทยได้ เพราะฉนั้นผมจะใช้คำว่า การเขียนโปรแกรมในเชิง offensive นะครับ ซึ่ง part นี้เราจะมาทำความรู้จักกับเจ้า Windows API กันครับ WINDOWS API คืออะไร? Windows API คือ เซ็ตของ API ที่อยู่ใน OS Windows ซึ่งเราสามารถเข้าถึงได้ด้วยภาษา C และ C++ โดยทาง Microsoft มี Document ที่เปิดเผยวิธีการเข้าถึงอยู่ที่ https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-api-list จริงๆแล้ว Windows API สามารถเข้าถึงด้วยภาษาอะไรก็ได้ ถ้าโปรแกรมเมอร์อย่างเราๆสามารถ กำหนด data structures และรู้ calling convention ของ Windows API นั้นๆ (เช่นการเข้าถึงด้วย P/Invoke ใน C#) ปกติแล้ว Windows API จะมีอีกชื่อเรียกนึงคับ คือ Win32 API Windows API มีประโยชน์อย่างมาก ถึงมากที่สุดในการเขียนโปรแกรมในเชิง offensive เช่นการทำ host enumeration, starting processes, process injection, token manipulation และอีกมากมาย โดย API ที่สามารทำ task ที่ยกตัวอย่างมา ส่วนมากจะถูกเรียกมาจาก kernel32.dll และ advapi32.dll นอกจาก Windows API แล้ว ยังมี API อีกชุดที่ เรียกว่า Native API ซึ่งจะถูก implement อยู่ภายใต้ ntoskrnl.exe (Windows kernel image) เซ็ตของ API อยู่ที่ใต้ ntoskrnl.exe ไม่ได้ถูกออกแบบมาให้ application สามารถเรียกได้ตรงๆ แล้วสามารถเรียกจาก User Mode ผ่าน ntdll.dll จริงๆแล้วพวก high-level API บางตัวจะมีการ call Native API อยู่เบื้องหลังด้วยเช่น API OpenProcess ใน kernel32.dll โดยเบื้องหลังแล้วจะไปเรียก NtOpenProcess ใน ntdll.dll อีกทอดนึง อย่างการก็ตามการเขียนโปรแกรมเชิง Offensive นั้น เราต้องการที่จะเรียก NtOpenProcess แทนการเรียก OpenProcess เพราะว่า หากมี tool อย่างพวก Antivirus / EDR / XDR monitor และทำ API Hooking อยู่ที่ User Mode การเรียก Native API โดยตรงอาจจะหลบเลี่ยงการตรวจจับที่ user mode ได้ ตัวอย่างการเรียก WINDOWS API | MESSAGEBOX | C++ ให้ลองเปิด Visual Studio ขึ้นมาแล้วสร้าง Console App นะครับ ใครไม่มี VS ก็ไปลงก่อน ให้เพิ่ม header <Windows.h> เข้ามา ซึ่ง header Windows.h จะมี declaration ของทุก function ใน Windows API รวมถึง macro และ data type ที่ต้องคุยกับ Windows API ในที่นี้จะลองเรียก MessageBox ที่เป็น component นึงของ Windows ผ่านตัว console app ดูครับ ให้ลองพิมพ์ MessageBox จะเห็นว่า IDE จะ มี Intellisense ขึ้นมาแนะนำ จะเห็นมีว่า Option ขึ้นมาให้เราเลือกเยอะเลย สิ่งที่ขึ้นต้นด้วยรูปกล่องสีม่วงคือ Function สิ่งที่ขึ้นต้นด้วยรูป play สีฟ้าคือ Macro แล้วมันต่างกันยังไง Macro จะเป็น shortcut ไปยัง function เพราะหากสังเกตจะเห็นว่ามี function หลายตัว ถ้าเราพิมพ์จนจบ มันก็จะบอกว่ามันเลือก MessageBoxW ให้เรา ทั้งๆที่ยังมี MessageBoxA อีกด้วย ฟังก์ชัน “A” ใช้สตริง ANSI และฟังก์ชัน “W” ใช้ Unicode เนื่องจาก Windows ใช้ unicode เป็น default encoding เป็นเหตุผลที่ macro MessageBox เลือก MessageBoxW ให้เรา และถ้าสังเกตจะเห็น MessageBoxA และ MessageBoxW จะรับ parameter ต่างกันด้วย คือ MessageBoxA จะรับ LPCSTR คือ MessageBoxA จะรับ LPCWSTR ทดลองเรียก MessageBox ตัวอย่างโค้ด This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters #include <iostream> #include <Windows.h> int main() { MessageBox(NULL, L"My first API call", L"Hello World", 0); return 0; } view raw Win32API_MessageBox.cpp hosted with by GitHub จบเรื่อง Windows API ไว้แค่นี้นะครับ ขอบคุณครับ ไม่มีหมวดหมู่Offensive Coding, Red Teamer, WIndows API HACKRF ONE 102 | RF SIGNAL REPLAY ATTACK มกราคม 21, 2023มกราคม 21, 2023un4ckn0wl3zใส่ความเห็น [ RF Signal Replay Attack ] หลังจากที่เคยเขียน blog เกี่ยวกับ HackRF one ไปเมื่อ 1-2 ปีก่อน (คลิกเพื่ออ่าน) ตอนนี้ในพวก tiktok / youtube shorts มีพวกคลิปที่เป็น viral เกี่ยวกับการ ใช้ Flipper Zero (อ่านต่อ: https://techsauce.co/tech-and-biz/flipper-zero-kickstarter) ในการแก้ไขสัญญาณวิทยุ พวก NFC/RFID หรือพวก keyfob ต่างๆ ซึ่ง ก่อนที่จะมี Flipper Zero ออก มี tool อย่าง HackerRF one (ที่ผมใช้ใน video) และ tool พวก SDR (ProxMark/BladeRF/LimeSDR) ต่างๆนั้นใช้กันมาก่อนหน้าแล้ว เพียงแค่ Flipper Zero นั้นพวกพาง่าย และเป็น swiss knife army จบในตัว จึงออกมาเป็นกระแส ณ ขณะนี้ ใน video นี้สาธิตการโจมตี RF รูปแบบนึงคือ การ Replay Attack (ทำซ้ำสัญญาณวิทยุ) อธิบายคือ เหมือนเราแอบอัดเสียง แล้วเอาเสียงที่อัดไปเปิดใหม่อีกรอบ แต่เปลี่ยนจะคลื่นเสียง เป็นคลื่นวิทยุแทน ในตัวอย่างผม Replay ตัว RF ที่ออกมาจาก remote กริ่งประตู วิธีการนี้สามารถใช้กับ remote รถยนต์บางรุ่นได้ ที่ไม่ได้ออกแบบ RF มาอย่างปลอดภัย ไม่มีหมวดหมู่Flipper-Zero, hackrf, Replay, RF, SDR กัญชา 101 | PANIC ATTACK | คำแนะนำสำหรับคนที่ไม่เคยสูบกัญชา… แต่อยากสูบเป็นครั้งแรก มีนาคม 12, 2022มีนาคม 12, 2022un4ckn0wl3z2 ความเห็น source: https://www.livescience.com/how-cannabis-high-works.html DISCLAIMER บทความนี้เป็นเพียงประสบการณ์และการสืบค้นข้อมูลจากผู้เขียน ไม่มีเอกสารอ้างอิงทางวิชาการ ที่แน่นอน ไม่ควรนำไปอ้างอิงเอกสารหรือบทความทางวิชาการใดๆ เกริ่น…. สวัสดีวันนี้มาแปลกเลยครับจากที่ไม่ได้เขียนบล็อกมานาน กลับมาคราวนี้ไม่ได้จะมาเขียนเรื่องเกี่ยวกับคอมพิวเตอร์นะครับแต่จะมากล่าวถึงสมุนไพรตัวนึงที่คาดว่าจะถูกกฎหมายในอนาคต แต่ไม่รู้เมื่อไหร่วันนั้นจะมาถึง ถ้าเรายังใช้ชีวิติอยู่กับรัฐบาลหัว***ชุดนี้… สมุนไพรตัวนั้นก็คือ กัญชา ครับ (Cannabis,Marijuana,Weed) และคิดว่าหากมันถูกกฎหมายขึ้นมาจริงๆ จะมีจำนวนผู้เสพย์หน้าใหม่เกิดขึ้นเยอะอย่างแน่นอนครับ ที่จะมาเขียนบทความนี้มีวัตถุประสงค์เพื่อให้คำแนะนำและการศึกษา เพื่อลดการเกิดอันตรายจากการใช้งานกัญชาสำหรับมือใหม่ที่ยังไม่เคยลองนะครับ ไม่ได้มีวัตถุประสงค์เพื่อเชิญชวนให้เข้ามาเสพย์กัญชาแต่อย่างใด ถ้าใครมือเก๋าแล้ว ผ่านได้เลย 555 โอเคคับ จะเข้าเรื่องละนะ บทความนี้จะเป็นการแนะนำการใช้งานกัญชาสำหรับคนที่สูบเป็นครั้งแรกนะครับ เพื่อความปลอดภัยจากการใช้งานพืชชนิดนี้ มาทำความรู้จักพืชชนิดนี้กันซักนิดครับ กัญชา นั้นเป็นพืชที่ทำให้ผู้เสพย์มีอาการล่องลอย เคลิ้ม หลอนประสาทเพราะในกัญชามีสารเคมีกลุ่มนึงที่เรียกว่า cannabinoid ซึ่งแยกย่อยสารเคมีออกมาได้อีกเป็น 100 กว่าชนิด แต่มี 2 ตัวที่มักพูดถึงกันบ่อยๆคือ THC (Tetrahydrocannabinol) และ CBD (Cannabidiol) ครับ เนื่องจากร่างการเรามีระบบที่เรียกว่า Endocannabinoid system ซึ่งเดิมทีจะคอยจัดการกับสาร cannabinoid ที่ร่างกายสร้างขึ้นมาเอง (สร้างขึ้นมาในปริมาณที่น้อยมากๆ) และเผอิญว่า cannabinoid ในกัญชานั้น มีลักษณะทางเคมีที่คล้ายกันๆกับที่ร่างกายเราสร้าง ร่างกายเราเลย accept สาร THC และ CBD จากกัญชาได้ทันที THC และ CBD นั้นจะออกฤทธิ์ต่างกันนะครับ หลักๆเลยก็คือ THC จะเป็นสารที่มีฤทธิ์ Psychoactive แปลเป็นไทยก็คือ ออกฤทธิ์ต่อจิตประสาทนั่นเอง ซึ่งใน CBD จะไม่ effect กับร่างกายเราในแง่ Psychoactive นะครับ เพราะฉนั้น สารที่ทำให้เรา Get high เป็น THC ครับ ไม่ใช่ CBD และบทความนี้ผมจะโฟกัสไปที่ THC อย่างเดียวเลยครับ เพราะปกติในช่อดอกกัญชามีสาร CBD ที่น้อยมากๆ แต่ที่รับเข้าไปเต็มคือ THC อาจจะมีแค่บางสายพันธ์เท่านั้นที่ตัดต่อพันธุกรรมมาเพื่อ CBD สำหรับใช้ในทางการแพทย์ THC เมื่อเข้าไปในร่างกายเราแล้ว โดยปกติหากเราใช้โดยการสูบควันเข้าไป แทบจะ effect กับร่างกายเราทันที ต่างกับพวก edible (กินเข้าไป) ซึ่งจะออกฤทธิ์ประมาณ 1 ชั่วโมงหลังจากทานเข้าไป PANIC ATTACKS แน่นอนนะครับว่าสาร THC ที่เรารับเข้าไปในร่างกายไม่ได้มี efffect กับร่างายเราแค่ในด้านดีอย่างเดียว มันมีผลข้างเคียงด้านลบด้วยแน่ๆ และสำหรับมือใหม่แล้ว หากไม่ได้รับคำแนะนำ อยู่ๆไปใช้เลย มีเปอร์เซ็นสูงมากที่จะได้เจอกับ nagative effect จนอาจจะกลัวการใช้งานกัญชาไปเลย (เรื่องดีมากเลยครับ 555) nagative effect ที่พบเจอได้แต่ไม่ได้อันตาย คือ ตาแดง คอแห้ง เวียนหัว คลื่นไส้นิดๆ พูดไม่รู้เรื่อง และใจสั่นครับ มาทำความรู้จักกับ Panic Attacks กันครับ Panic Attack คืออาการวิตกกังวลขั้นสุดเมื่อเราเสพย์ THC เข้าไป สำหรับคนที่ร่างกายคลีนๆ อยู่ๆมารับสาร THC เข้าไปครั้งแรกมีโอกาสเกิด Panic Attack สูงมากคับ เพราะร่างกายเราเพิ่งจะมาจ๊ะเอ๋กับ THC เป็นครั้งแรก ความสัมพันธ์กันระหว่าง THC กับ Panic Attack คือ THC มี effect กับร่างกายเราอย่างนึงคือ จะทำให้ใจเราสั่น สั่นหนักสั่นน้อยอยู่ที่ปริมาณที่ได้รับ THC เข้าไปคับ แต่ปกติมือใหม่ไม่ว่าจะสั่นมากหรือน้อย ยังไม่เคยรับมือกับ Panic Attack หรือไม่รู้มาก่อนว่าการเสพย์กัญชา จะทำให้ใจสั่น จะมีอาการหลังจากนั้นตามมาคือ วิตกกังวล (Panic) คับ ยิ่งเราโฟกัสกับอาการใจสั่งของเรา บวกกับอาการวิตกกังวล อาการ ทั้ง 2 อย่างนี้ จะทวีคูณขึ้นไปอีกคับ อัตราการเต้นของหัวใจเราอาจพุ่งไปถึง 130 bpm โดยที่เราอยู่นิ่งๆ ณ ตอนนี้จิตใจเราจะไม่อยู่กับเนื้อกับตัวแล้ว บวกกับฤทธิ์ของกัญชา จะทำให้เรากังวลเพิ่มไปอีก ว่าเราจะตายไหม เราจะหัวใจวายไหม เราจะกลับเป็นแบบเดิมได้ไหม กลับมาปกติไหม ความคิดแบบนี้จะวนลูป ไปจนกว่าเราจบทริปกัญชาอันแสนสาหัสของเรา อาจใช้เวลา 3 – 4 ชั่วโมง Panic Attack ถือว่าเป็น bad trip ที่สอนผู้ใช้กัญชาว่า อย่าริกลับมาลองอีกได้เป็นอย่างดีเลยคับ (หรือจนกว่าจะได้รับคำแนะนำอย่างถูกต้อง) การเตรียมตัวรับการสาร THC เพื่อป้องกันการเกิดอาการ PANIC ATTACK จะเรียงเป็นข้อๆเลยนะครับ เพื่อการใช้กัญชาอย่างมีความสุขและลดการเกิด Panic Attack ควรจะ… 1.ทำตัวสบายๆ ไม่เครียด ปล่อยวางทุกสิ่ง ถ้าเพื่อนๆมีเรื่องให้เครียดอยู่ เรื่องงาน เรื่องเงิน เรื่องแฟน หรือ กังวลเรื่องใดอยู่ แนะนำสูบวันหลังนะครับ ไปทำให้ตัวเองสบายใจมาก่อน 2.ควรจัดการสถานที่ให้มีความสะดวกสบาย อยู่ในที่ที่เป็นส่วนตัวและปลอดภัย เพื่อลดความกังวลของผู้เสพย์ ควรมีเพื่อนอยู่ด้วยจะดีมาก มีเพื่อนคุยตอนเสพย์กัญชาเป็นอะไรที่ดีมากๆ 3.จับเวลาทุกครั้งเวลาที่เริ่มสูบ เพื่อมอนิเตอร์ตัวเอง ปกติทริปจะอยู่ยาวๆไป 3 – 4 ชั่วโมง 4. Go low and slow เริ่มจาการสูบในปริมาณที่น้อยๆ เช่นสูบไปครั้งแรก ให้รอ 15 นาที ถ้าไม่มีอะไรเกิดให้เติมใหม่ในปริมาณที่เท่าๆกับครั้งแรก การทำแบบนี้ เป็นการหาปริมาณ dose ให้ตัวเอง ถ้าเริ่มต้นด้วยหลุมใหญ่ๆ มักจะเกิด Panic Attack ให้เริ่มทีละช้าๆ น้อยๆไปครับ และควรเริ่มจากพันลำ (joint) แทนที่จะใช้บ้อง (bong) เพื่อลดปริมาณควันที่จะเข้าไปในร่างกายแบบคราวเดียว หรือจะใช้บ้องก็ได้ ในแบบครั้งละครึ่งหลุม 5.ควรเลือกสายพันธุ์กัญชา ที่ THC ไม่สูงจนเกินไป (Mandarin Cookies คือตัวที่ผมเริ่มสูบ บอกเลยว่าของโครตดีย์ 55+) 6.เปิดแอร์เย็นๆ อาการเย็นๆจะทำให้เราเพลิดเพลินได้ดีมากๆ สบายไปกับอากาศเย็นๆ และอาการ get high 7.ทันทีที่สูบไปแล้วมีอาการใจเต้นแรง เริ่มมีอาการกังวล ให้เราเลิกโฟกัสที่จังหวะหัวใจ แล้วก็เลิกกังวล ให้มองว่าเป็นเรื่องปกติ ให้คิดเสมอว่านี่เรากำลังทริปอยู่ ไม่ต้องกลัวว่าเราจะไม่เหมือนเดิม ใครๆก็เป็นแบบนี้ พอกัญชาหมดฤทธิ์เราจะหายดี ให้หาอะไรดู หาเพลงฟัง ลุกขึ้นเต้นได้ยิ่งดี ยิ่งถ้าเราเห็นคนยิ้ม หรือ ดูคลิปตลกๆ เราจะยิ้มไม่หุบเลยครับ รับประกันความสดใส 555 ทั้งนี้ทั้งนั้นหากเราประเมินอาการแล้วว่าเกินควบคุมแล้ว ควรรีบไปห้องฉุกเฉิน ที่ รพ. ใกล้ๆบ้านเลยนะครับ เลjาความจริงหมอไปว่าเราเสพย์ cannabinoid ไป 8.ทั้งก่อนสูบกัญชา ระหว่าง get high หรือ จบทริปไปแล้ว ควรดื่มน้ำมากๆนะครับ 9.ตอนเรา get high เรียกได้ว่าเราจะมี 2 ตัวตนในเวลาเดียวกันเลยนะครับ ตัวตนแรกคือ เราจะรู้เรื่องทุกอย่างว่าเราทำอะไรและมีความพยามยามจะโฟกัสอะไรบางสิ่ง จะพยายามจะต่อต้านการ high ของเรา อีกตัวตนคือสมองเราไม่อยู่แล้ว สมองเราบินไปไหนแล้วก็ไม่รู้ 555 เราจะทำตัวประหลาด ร้องเพลง เต้น หรือขำจนน้ำตาไหล คำแนะนำคือ อย่าไปโฟกัสที่ตัวตนแรกมากนะครับ ให้เรามีความสุขกับตัวตนที่ 2 ของเรา 10. หาขนม เครื่องดื่ม หวานๆ มาวางไว้เยอะๆเลย เพราะตอนที่กำลัง high คอเราจะแห้งมากกว่าปกติ และชอบหาอะไรเข้าปากครับ แต่แนะนำว่าไม่ควรเป็นเครื่องดื่มชูกำลัง หรือ แอลกอฮอล์ แม้งกระทั้งกาแฟนะครับ ของพวกนี้ไม่ควรใช้ร่วมกับกัญชา และควรมีพริกไทยดำ มาไว้ข้างๆด้วย เพราะมีทดลองแล้วว่า พริกไทยดำ สามารถช่วยลดอการ Panic Attack ได้ โดยการเอามาดม หรือ เคี้ยวไปซัก 2-3 เม็ดตอนมีอาการ panic ครับ หรือ จะเป็นพวกน้ำมะนาวปั่นก็ได้ครับ ช่วยได้เหมือนกัน 11.ผู้มีโรคประจำตัวเกี่ยวกับ หลอดเลือด ความดัน หรือ หัวใจ ไม่ควรได้รับสาร THC นะคับ หรือไม่ก็ควรให้แพทย์ให้คำแนะนำ เพราะหากเรามีโรคเหล่านี้เป็นโรคประจำตัว แล้วเกิดอาการ Panic Attack เสี่ยงต่อสุขภาพเรามากๆนะคับ เสริมๆๆๆ * สาร THC อยู่ในร่างกายเราอยู่ได้นาน 2 – 30 วัน เนื่องจาก THC ละลายในไขมัน ไม่ใช่น้ำ หากมีเหตุสุดวิสัยต้องตรวจฉี่หาสารเสพย์ติด ให้ระมัดระวังตัวด้วย เพราะ ณ เวลาที่เขียนบทความนี้ กัญชายังผิดกฎหมาย 100% เพลง/ศิลปิน ฟังระหว่าง get high * Taiwan MC * Marshmello * YB Young Bong * Paper planes (HYE) * proximity * phonk * ghostemane * effie * CAMO * Take On Me (Ellie Ver.) The Last Of Us 2 || Cover by Reinaeiry * MOON * Don’t try this at home * srirajah rockers คลิปตลกๆ * ตลก 6 ฉาก * SkizzTV HAPPY SMOKING ^-^ ref * https://www.sawasdeeclinic.com/%E0%B8%AA%E0%B8%B2%E0%B8%A3%E0%B8%AA%E0%B8%B3%E0%B8%84%E0%B8%B1%E0%B8%8D%E0%B9%83%E0%B8%99%E0%B8%81%E0%B8%B1%E0%B8%8D%E0%B8%8A%E0%B8%B2/ * https://thaicam.go.th/wp-content/uploads/2019/08/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%81%E0%B8%9E%E0%B8%97%E0%B8%A2%E0%B9%8C%E0%B9%81%E0%B8%84%E0%B8%99%E0%B8%99%E0%B8%B2%E0%B8%9A%E0%B8%B4%E0%B8%99%E0%B8%AD%E0%B8%A2%E0%B8%94%E0%B9%8C-%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%81%E0%B8%B1%E0%B8%8D%E0%B8%8A%E0%B8%B2%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%81%E0%B8%9E%E0%B8%97%E0%B8%A2%E0%B9%8C.pdf * https://www.sawasdeeclinic.com/cannabis-endocannabinoid-system/ * https://apps.who.int/iris/bitstream/handle/10665/325957/WHO-MSD-NVI-2016.01-tha.pdf ไม่มีหมวดหมู่ Previous Articles เรื่องที่เก่ากว่า -------------------------------------------------------------------------------- ค้นหาสำหรับ: กรกฎาคม 2024 จ. อ. พ. พฤ. ศ. ส. อา. 1234567 891011121314 15161718192021 22232425262728 293031 « พ.ย. สถิติบล็อก * 123,025 hits เรื่องล่าสุด * Driver 101 – part 1 * Offensive Coding | D/Invoke * Offensive Coding | P/Invoke | Ordinals * Offensive Coding | P/Invoke | CreateProcess * Offensive Coding | P/Invoke | Type Marshalling คลังเก็บ * พฤศจิกายน 2023 * มีนาคม 2023 * มกราคม 2023 * มีนาคม 2022 * พฤษภาคม 2021 * มีนาคม 2020 * ตุลาคม 2019 * กันยายน 2019 * พฤษภาคม 2018 * กุมภาพันธ์ 2018 * มกราคม 2018 * พฤศจิกายน 2017 * ตุลาคม 2017 * กันยายน 2017 * สิงหาคม 2017 * กรกฎาคม 2017 * มิถุนายน 2017 * พฤษภาคม 2017 * เมษายน 2017 * มีนาคม 2017 * กุมภาพันธ์ 2017 * มกราคม 2017 * ธันวาคม 2016 * ตุลาคม 2016 * กันยายน 2016 * พฤษภาคม 2016 * เมษายน 2016 * มีนาคม 2016 * กุมภาพันธ์ 2016 หมวดหมู่ * ไม่มีหมวดหมู่ * Challenge * Hacking * Hardware * Hello * Knowledge * Network * penatration-testing * Programming * Proof of Concept * shellcode * Tutorials AUTHORS * un4ckn0wl3z * Driver 101 – part 1 * Offensive Coding | D/Invoke * Offensive Coding | P/Invoke | Ordinals * Offensive Coding | P/Invoke | CreateProcess * Offensive Coding | P/Invoke | Type Marshalling SOCIAL * View un4ckn0wl3z’s profile on Facebook * View haxtivitiez’s profile on Twitter * View haxtivitiez’s profile on GitHub * View UCNrT38ApdFrVMHjeEBu1MmQ’s profile on YouTube ป้ายกำกับ 32-bit Windows A1 - Injection AI Arduinio Assembly BadUSB BOF Buffer Overflow Burpsuite bWAPP bypass Cheat Engine Computer Networking Convert coverter Crack csharp CTF Deque Docker Download exploit Exploit-Exercises Exploit Development Facebook game.rop.sh game reverse Hardware HID Hotspot http IDA PRO intellij Internship IP Address Java JavaFx KonBoot Lecture Linear Data Structure linux malware metasploit METERPRETER Mikrotik mitmproxy Note NSA Offensive Coding Packet Tracer payload Pre-Internship Protostar Python Queue Red Teamer regex Reverse Engineering REVERSING Reversing for Newbies-lena151 Script SDR shellcode Stack Stack Basic Teensy Teensy Arduino Tutorials USB RubberDucky VM wget WiFi jamming attacks WIndows API x86 XAMPP HAXTIVITIEZ’S FB. FOLLOW ME ON TWITTER My Tweets NULL SECTION * ลงทะเบียน * เข้าสู่ระบบ * เข้าฟีด * แสดงความเห็นฟีด * WordPress.com POWERED BY ~`NULL`ENCORE`~ ~`Null`EnCore`~ ==[] since 2015 Website Powered by WordPress.com. * สมัครเป็นสมาชิก Subscribed * |H4XT1V1T13Z| Sign me up * Already have a WordPress.com account? Log in now. * ความเป็นส่วนตัว * * |H4XT1V1T13Z| * ปรับแต่ง * สมัครเป็นสมาชิก Subscribed * ลงทะเบียน * เข้าสู่ระบบ * Report this content * View site in Reader * Manage subscriptions * Collapse this bar Loading Comments... Write a Comment... อีเมล (Required) ชื่อ (Required) เว็บไซต์