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

Form analysis 4 forms found in the DOM

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>

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) เว็บไซต์