WEBVTT

00:00.710 --> 00:02.450
สวัสดีและยินดีต้อนรับกลับมา

00:02.480 --> 00:08.550
ในบทเรียนวิดีโอนี้ เราจะศึกษาเกี่ยวกับหน่วยความจำเสมือน

00:08.570 --> 00:19.880
ระบบคอมพิวเตอร์มี RAM จำกัด แต่เราสามารถรันโปรแกรมหรือกระบวนการที่ใช้หน่วยความจำจำนวนมหาศาลได้

00:20.620 --> 00:26.980
ซึ่งสามารถทำได้ด้วยการใช้สิ่งที่เรียกว่าหน่วยความจำเสมือน

00:27.550 --> 00:37.810
หน่วยความจำเสมือนช่วยให้โปรแกรมคอมพิวเตอร์มีหน่วยความจำมหาศาลเกินกว่าหน่วยความจำจริงของ

00:37.810 --> 00:39.340
RAM

00:39.370 --> 00:43.330
มาดูแนวคิดโดยละเอียดกันเลยดีกว่า

00:43.510 --> 00:50.110
นี่คือแผนภาพแสดงวิธีการทำงานของโปรแกรมคอมพิวเตอร์

00:50.140 --> 00:52.840
มีส่วนประกอบหลักสามประการ

00:53.720 --> 00:54.650
ซีพียู

00:54.680 --> 00:55.550
แรม

00:55.550 --> 00:57.830
ซึ่งเป็นความทรงจำหลักของคุณ

00:58.620 --> 01:05.280
เรียกอีกอย่างว่าหน่วยความจำเข้าถึงโดยสุ่มและฮาร์ดดิสก์ โปรแกรมจะถูกเก็บไว้ในฮาร์ดดิสก์

01:06.040 --> 01:15.100
แต่เพื่อให้ CPU สามารถดำเนินการโค้ดและคำสั่งในโปรแกรมได้ ระบบปฏิบัติการจะโหลดโปรแกรมเข้าสู่หน่วยความจำ

01:15.100 --> 01:21.520
RAM ก่อน และสร้างกระบวนการขึ้นมา

01:21.550 --> 01:28.460
จากนั้น CPU จะอ่านคำสั่งจาก RAM และดำเนินการตามคำสั่งเหล่านั้น

01:28.480 --> 01:37.810
ในปัจจุบัน RAM มีราคาค่อนข้างถูก แต่ในสมัยก่อนนั้นมีราคาค่อนข้างแพงเมื่อเทียบกับฮาร์ดดิสก์

01:37.840 --> 01:43.980
หน่วยความจำเสมือนถูกสร้างขึ้นเพื่อขยาย RAM ที่มีอยู่

01:43.990 --> 01:52.390
ดังนั้นหน่วยความจำเสมือนจึงสร้างภาพลวงตาให้กับกระบวนการ โดยให้ภาพลวงตาว่ามี RAM จำนวนมากที่พร้อมให้ใช้เฉพาะกับกระบวนการใดๆ

01:52.390 --> 01:56.980
เท่านั้น

01:57.010 --> 02:03.010
สิ่งนี้เป็นไปได้ด้วยแนวคิดของการจำลองเสมือนหรือ RAM เสมือน

02:03.550 --> 02:04.750
หน่วยความจำเสมือน

02:04.780 --> 02:07.070
ตอนนี้ในแผนภาพนี้

02:07.860 --> 02:13.230
คุณจะเห็นได้ว่า RAM ที่มีอยู่จริงอาจมีขนาดเพียงหนึ่งกิกะไบต์เท่านั้น

02:13.560 --> 02:22.460
แต่เนื่องจากการจำลองเสมือนหรือหน่วยความจำเสมือน กระบวนการจึงสามารถเข้าถึงได้ถึงสี่กิกะไบต์หรือมากกว่านั้นสำหรับระบบปฏิบัติการ

02:22.470 --> 02:25.020
64 บิต

02:25.050 --> 02:32.790
ไม่เพียงเท่านั้น กระบวนการต่างๆ มากมายสามารถทำงานแบบขนานกันได้เกือบหมด และแต่ละกระบวนการสามารถสัญญาได้ถึง

02:32.820 --> 02:44.670
4 กิกะไบต์ แม้ว่า RAM จริงจะมีเพียงหนึ่งกิกะไบต์ก็ตาม และสามารถทำงานแบบขนานกันได้โดยไม่รบกวนกัน

02:45.240 --> 02:46.920
แล้วมันจะเป็นไปได้อย่างไร?

02:47.220 --> 02:52.920
สิ่งนี้เป็นไปได้เพราะฮาร์ดดิสก์ถูกใช้เป็นหน่วยความจำเสมือน

02:52.920 --> 03:01.430
ดังนั้นฮาร์ดดิสก์ที่รวมเข้ากับหน่วยความจำทางกายภาพจริงจะสร้างความสามารถในการสร้างหน่วยความจำเสมือน

03:01.440 --> 03:09.030
ดังนั้นสิ่งใดก็ตามที่ไม่เพียงพอ คุณจะใช้ฮาร์ดดิสก์เพื่อทำหน้าที่เป็นหน่วยความจำเสมือนหรือ RAM เสมือน

03:09.040 --> 03:15.400
ลองยกตัวอย่าง เรามีสองกระบวนการ คือ กระบวนการที่หนึ่งและกระบวนการที่สอง

03:16.010 --> 03:18.200
กระบวนการที่หนึ่งอาจมีสองหน้า

03:18.380 --> 03:21.680
หน้าเป็นเพียงส่วนหนึ่งของบล็อกหน่วยความจำ

03:22.820 --> 03:30.740
ดังนั้น หากถือว่ากระบวนการหนึ่งใช้พื้นที่หนึ่งหน้าในหน่วยความจำทางกายภาพ จากนั้นจึงโหลดหน้าที่สองไว้ที่นั่นด้วย

03:30.740 --> 03:32.600
แต่แล้วก็มาถึงขั้นตอนที่สอง

03:32.630 --> 03:34.550
ใครจำเป็นต้องใช้หนึ่งหน้า

03:34.580 --> 03:41.120
ระบบปฏิบัติการจะสลับหน้าที่สองจากหน่วยความจำทางกายภาพไปยังฮาร์ดดิสก์

03:41.980 --> 03:50.500
ดังนั้นหน้าที่สองซึ่งอยู่ในกระบวนการที่หนึ่งยังคงอยู่ในหน่วยความจำเสมือนแต่ถูกสลับไปที่ฮาร์ดดิสก์

03:50.650 --> 03:56.410
ทำเช่นนี้เพื่อให้กระบวนการที่สองสามารถโหลดเพจของตนลงในหน่วยความจำทางกายภาพได้

03:57.160 --> 04:00.070
และเมื่อกระบวนการที่สองเสร็จสิ้นการดำเนินการ

04:00.100 --> 04:08.620
จากนั้นหน้าที่สองจะถูกสลับกลับเข้าไปในหน่วยความจำทางกายภาพเพื่อให้กระบวนการที่หนึ่งดำเนินการดำเนินการต่อ

04:08.650 --> 04:13.960
ตอนนี้การดำเนินการเสร็จสิ้นอย่างรวดเร็วและราบรื่นมากจนผู้ใช้ไม่สังเกตเห็น

04:14.740 --> 04:21.760
ดังนั้นนี่คือสิ่งที่ทำให้มีหน่วยความจำเสมือนซึ่งมีขนาดใหญ่กว่าหน่วยความจำทางกายภาพจริงของคุณมาก

04:21.970 --> 04:29.590
เราใช้ฮาร์ดดิสก์เพื่อสร้างภาพลวงตาว่ามีหน่วยความจำจำนวนมาก

04:30.340 --> 04:31.990
ตอนนี้เรามาทำการทำงานเชิงปฏิบัติกันบ้างดีกว่า

04:34.150 --> 04:36.430
ไปดาวน์โหลดสิ่งนี้ได้เลย

04:36.460 --> 04:37.630
หากคุณยังไม่ได้ทำเช่นนั้น

04:38.740 --> 04:50.650
ตัวอย่าง. ตอนนี้เราจะดำเนินการตัวอย่าง 4-1 และเปิดเพื่อใช้ตรวจสอบ

04:53.590 --> 04:54.820
กระบวนการแฮ็กเกอร์

05:03.280 --> 05:08.170
เมื่อเลื่อนลงไปด้านล่าง เราจะเห็นว่าตัวอย่างที่ 4-1 อยู่ในหน่วยความจำ

05:10.100 --> 05:17.630
หากคุณดับเบิลคลิกที่นี่ เราจะได้รับรายละเอียดเพิ่มเติมและข้อมูลเกี่ยวกับกระบวนการนี้

05:19.410 --> 05:22.260
ตอนนี้ไปดู Memory กัน

05:23.820 --> 05:29.220
ที่นี่คือที่ที่คุณสามารถดูหน่วยความจำทั้งหมดที่กำลังใช้งานอยู่

05:29.250 --> 05:32.550
หน่วยความจำเสมือนสำหรับกระบวนการนี้

05:33.380 --> 05:39.740
ตัวอย่างที่ 4-1 exe ตรงนี้คุณจะเห็นที่อยู่ฐาน

05:41.270 --> 05:48.560
จากนั้นในคอลัมน์ที่สอง คุณสามารถดูได้ว่ามีการแมปไว้หรือไม่ เป็นรูปภาพ หรือเป็นส่วนตัว

05:49.340 --> 05:53.600
จากนั้นในคอลัมน์ที่สาม คุณจะเห็นขนาดของบล็อกหน่วยความจำแต่ละบล็อก

05:54.700 --> 05:56.920
และคุณก็สามารถดูการอนุญาตได้

05:58.960 --> 06:00.010
ในคอลัมน์ที่สี่

06:00.250 --> 06:01.900
อ่าน เขียน หรืออ่าน

06:01.900 --> 06:02.170
เขียน.

06:02.170 --> 06:04.480
ดำเนินการหรือเขียน

06:04.630 --> 06:06.700
มุ่งมั่นและดำเนินการ

06:06.700 --> 06:07.660
และอื่นๆอีกมากมาย

06:08.500 --> 06:16.930
สำหรับแต่ละรายการ คุณยังสามารถขยายและดูรายละเอียดภายในที่นี่ได้

06:19.090 --> 06:23.590
แล้วคำว่าส่วนตัวนี้หมายถึงอะไร?

06:23.620 --> 06:30.340
ส่วนตัวหมายถึงตำแหน่งหน่วยความจำนี้ไม่ได้แชร์กับกระบวนการอื่น

06:31.490 --> 06:32.930
เช่น สแต็ค

06:34.480 --> 06:39.100
สแต็กคือที่ที่กระบวนการจัดเก็บตัวแปรภายในเครื่อง

06:39.760 --> 06:43.390
รวมถึงเมื่อมัลแวร์แตกตัวของตัวเองด้วย

06:44.170 --> 06:51.940
นอกจากนี้ยังใช้ตำแหน่งหน่วยความจำส่วนตัวด้วย ดังนั้นแพ็กเกอร์และมัลแวร์จะใช้ตำแหน่งส่วนตัว

06:53.050 --> 06:57.880
และยังใช้ประโยชน์จาก API ที่เรียกว่า VirtualAlloc ด้วย

06:58.250 --> 07:06.070
ดังนั้น VirtualAlloc API มักจะแยกโปรแกรมไปยังตำแหน่งหน่วยความจำส่วนตัว

07:07.070 --> 07:07.910
รูปภาพ

07:08.890 --> 07:14.050
รูปภาพคือโมดูลของโปรแกรม

07:14.200 --> 07:25.240
ตัวอย่างเช่น ไฟล์ปฏิบัติการและตำแหน่งหน่วยความจำ DLL ที่มีโค้ดที่ใช้ในการดำเนินการ รวมถึงไลบรารีลิงก์ไดนามิก

07:25.240 --> 07:28.810
เรียกว่า รูปภาพ

07:29.680 --> 07:30.910
เราก็มีแผนที่ด้วย

07:31.810 --> 07:40.150
บางครั้งบางส่วนของไฟล์บนดิสก์จำเป็นต้องถูกแมปลงในหน่วยความจำเสมือนเพื่อให้กระบวนการใช้งานได้

07:40.860 --> 07:56.550
ดังนั้นส่วนของหน่วยความจำที่มีข้อมูลแมปดังกล่าวจึงเรียกว่า แมป และกระบวนการนี้สามารถปรับเปลี่ยนเนื้อหาของไฟล์บนฮาร์ดดิสก์ได้โดยการปรับเปลี่ยนเนื้อหาที่แมปไว้ในหน่วยความจำโดยตรง

07:56.700 --> 08:05.370
ดังนั้นแผนที่เป็นเพียงตัวชี้ไปยังฮาร์ดดิสก์ ดังนั้นเมื่อกระบวนการต้องการเข้าถึงบางสิ่งบางอย่าง มันจะผ่านตำแหน่งต่างๆ

08:05.370 --> 08:10.290
ในแผนที่ซึ่งจะอ้างอิงถึงฮาร์ดดิสก์ในที่สุด

08:10.860 --> 08:12.600
นั่นคือความหมายของแผนที่

08:13.770 --> 08:24.540
ภายในนี้ หากคุณขยายบล็อกหน่วยความจำนี้ คุณจะเห็นคอมมิท และบางส่วนอาจสำรองไว้

08:25.710 --> 08:28.230
และบางครั้งคุณยังมองเห็นว่าฟรีด้วย

08:29.140 --> 08:37.850
Commit หมายความว่าจะต้องมีพื้นที่ทางกายภาพใน RAM ที่ได้รับการจัดสรรให้

08:37.870 --> 08:38.980
นั่นเป็นเพียงความมุ่งมั่น

08:40.050 --> 08:49.860
หากคุณเห็นการสำรอง แสดงว่ายังไม่ได้รับการจัดสรรหน่วยความจำ RAM ทางกายภาพ แต่กำลังถูกจองอยู่

08:50.640 --> 08:59.220
เมื่อหน่วยความจำทางกายภาพใน RAM ถูกจัดสรรให้กับหน่วยความจำเสมือนแล้ว หน่วยความจำนั้นจะเปลี่ยนไปเป็นคอมมิต

09:00.440 --> 09:02.540
และบางครั้งคุณจะเห็นว่าฟรี

09:03.470 --> 09:14.330
ฟรี หมายความว่าที่อยู่เหล่านั้นอยู่ในหน่วยความจำเสมือน แต่ยังไม่ได้รับการกำหนดหรือทำให้พร้อมใช้งานสำหรับกระบวนการ

09:15.760 --> 09:22.120
จากนั้นคุณจะเห็นว่าภายใต้คอลัมน์ Protection คุณได้อ่าน เขียน และดำเนินการแล้ว

09:23.620 --> 09:33.730
การอ่านหมายความว่าสามารถอ่านเนื้อหาของหน่วยความจำนั้นได้ แต่คุณไม่สามารถเขียนลงในตำแหน่งหน่วยความจำเหล่านั้นได้ และไม่สามารถดำเนินการอะไรๆ

09:34.120 --> 09:37.960
ในตำแหน่งหน่วยความจำนี้ได้

09:38.650 --> 09:39.460
เขียน.

09:39.490 --> 09:48.280
การเขียนหมายถึงสามารถอ่านหรือเขียนเนื้อหาของตำแหน่งหน่วยความจำนั้นได้ และ X.

09:48.310 --> 09:48.970
ดำเนินการ.

09:49.600 --> 09:56.290
การดำเนินการหมายถึงตำแหน่งนั้นที่ประกอบด้วยโค้ดที่สามารถดำเนินการหรือรันได้

09:56.710 --> 10:05.080
ดังนั้นเมื่อคุณเห็นว่ามี X อยู่ที่นั่น แสดงว่านี่คือตำแหน่งที่คุณจะพบโค้ดสำหรับการรันโปรแกรมได้

10:05.870 --> 10:09.110
ต่อไปเราจะมาดูสตริงในหน่วยความจำเสมือน

10:10.000 --> 10:12.370
ความทรงจำของกระบวนการ

10:13.230 --> 10:18.420
มีข้อมูลจำนวนมากที่ถูกใช้โดยกระบวนการระหว่างการดำเนินการ

10:18.900 --> 10:28.080
ข้อมูลบางส่วนเป็นสตริงที่มนุษย์สามารถอ่านได้ เช่น URL ชื่อโดเมน ที่อยู่ IP ชื่อไฟล์ ชื่อเครื่องมือ

10:28.110 --> 10:30.390
และอื่นๆ

10:33.630 --> 10:39.540
หากคุณคลิกที่บล็อกหน่วยความจำใดๆ ที่นี่ มุมมองเลขฐานสิบหกจะเปิดขึ้นมา

10:39.600 --> 10:45.120
มันจะแสดงไบต์ดิบที่พบในตำแหน่งเหล่านั้น

10:46.480 --> 10:50.080
ตัวอย่างเช่น เมื่อคุณดับเบิลคลิกที่นี่ มุมมองเลขฐานสิบหกจะเปิดขึ้นมา

10:51.100 --> 11:01.600
และคุณสามารถเห็นตำแหน่งนี้ที่นี่ 400000 ตามด้วยศูนย์ประกอบด้วยไบต์ทั้งหมดเหล่านี้และไบต์วิเศษ

11:02.620 --> 11:05.770
4D 5A ซึ่งเราจะดูต่อไป

11:07.090 --> 11:13.120
ดังนั้นนี่บอกคุณว่านี่คือตำแหน่งที่สามารถปฏิบัติการได้เนื่องจากไบต์วิเศษ MZ นี้

11:14.200 --> 11:19.540
คอลัมน์นี้จะแสดงการตีความของไบต์เหล่านี้

11:28.230 --> 11:31.020
บางครั้งคุณจะเห็นตัวอักษรสุ่มแบบนี้

11:33.270 --> 11:39.660
เนื่องจากบางส่วนเป็นโค้ดที่สามารถปฏิบัติการได้และบางส่วนยังเป็นสตริงด้วยซ้ำ

11:39.660 --> 11:41.430
เช่น มีคำว่า Hello world อยู่ที่นั่น

11:42.150 --> 11:49.290
ขณะนี้คอลัมน์แรกเป็นค่าออฟเซ็ตของข้อมูลจากที่อยู่เริ่มต้นของบล็อกหน่วยความจำ

11:49.680 --> 11:55.710
ดังนั้นเมื่อคุณเห็นศูนย์ที่นี่ แสดงว่ามีการชดเชยจากที่อยู่ 400000

11:56.520 --> 12:12.870
หากฉันไปที่ตำแหน่งนี้และเปิดมุมมองเลขฐานสิบหก 00000010 จะถูกชดเชยจากที่อยู่ 400000 และที่นี่ 000 คือออฟเซ็ตจากที่อยู่นี้

12:12.870 --> 12:14.550
401000.

12:15.550 --> 12:21.640
สิ่งสำคัญที่ต้องทราบตอนนี้คือคอลัมน์นี้ซึ่งประกอบด้วยสตริง แม้ว่าไบต์บางส่วนจะไม่ใช่สตริงจริงๆ

12:21.640 --> 12:30.610
แต่โปรแกรมดูเลขฐานสิบหกจะพยายามแปลให้เป็นโค้ดที่มนุษย์อ่านได้ ซึ่งก็คือสตริงที่มนุษย์อ่านได้

12:31.240 --> 12:35.260
คุณสามารถค้นหาสตริงด้วยวิธีนี้ได้ แต่มีวิธีที่ง่ายกว่า

12:36.750 --> 12:39.630
คุณสามารถใช้ปุ่ม Strings ได้ที่นี่

12:43.480 --> 12:51.340
คุณสามารถระบุความยาวขั้นต่ำและอื่นๆ รวมถึงค้นหาสตริงในภูมิภาคใดก็ได้

12:52.700 --> 12:53.690
จากนั้นคลิกตกลง

12:55.370 --> 12:57.890
จากนั้นมันจะค้นหาสตริงทั้งหมดให้กับคุณ

12:57.890 --> 13:00.860
และคุณสามารถเลื่อนลงมาดูสตริงที่นี่

13:04.100 --> 13:05.030
และคุณสามารถกรองมันออกได้

13:05.030 --> 13:12.050
สม่ำเสมอ. ดังนั้นการใช้เทคนิคนี้ คุณจะสามารถค้นหาข้อมูลเกี่ยวกับมัลแวร์ได้มากมาย

13:13.280 --> 13:14.420
มาลองกันอีกครั้งดีกว่า

13:15.650 --> 13:18.080
และครั้งนี้เราจะมาเพิ่มรูปภาพ

13:21.650 --> 13:22.070
เอาล่ะ.

13:22.070 --> 13:23.870
ตอนนี้ก็พบสายเพิ่มเติมแล้ว

13:26.690 --> 13:31.820
และคุณจะเห็นว่าเมื่อฉันเลื่อนดู ฉันจะเห็นคำว่า Hello world ที่นั่นและที่อยู่หน่วยความจำนี้

13:35.030 --> 13:36.980
แล้วคุณสามารถกรองเพิ่มเติมได้ที่นี่

13:38.460 --> 13:39.450
เมื่อไหร่ก็ตามที่คุณต้องการ

13:39.480 --> 13:46.980
คุณสามารถใช้ regex สำหรับนิพจน์ทั่วไปและอื่นๆ และสตริงที่มีอักขระอะไร

13:46.980 --> 13:48.870
หากคุณกำลังมองหาสายเฉพาะ

13:50.250 --> 13:52.950
บางครั้งคุณอาจต้องการค้นหา http

13:56.220 --> 13:58.890
และคุณสามารถเห็น http บางส่วนได้ที่นี่

14:03.540 --> 14:10.350
และนี่อาจเปิดเผยเซิร์ฟเวอร์บางส่วนที่กระบวนการของคุณพยายามเชื่อมต่อด้วย

14:12.750 --> 14:19.410
ดังนั้นเราจึงสามารถใช้การค้นหาสตริงแบบนี้และการวิเคราะห์แบบนี้เพื่อต่อต้านมัลแวร์ได้

14:20.160 --> 14:28.980
ดังนั้น การวิเคราะห์หน่วยความจำเสมือนจะให้ข้อมูลมากมายสำหรับการตรวจจับมัลแวร์

14:28.980 --> 14:35.730
ดังที่คุณจะเห็น เพียงแค่วิเคราะห์แบบนี้ก็สามารถบอกได้ว่านี่คือมัลแวร์หรือไม่

14:36.180 --> 14:44.760
คุณยังสามารถรับข้อมูลเกี่ยวกับชื่อมัลแวร์ ชื่อแฮกเกอร์ จุดหมายปลายทาง URL ที่อยู่ IP และอื่นๆ

14:44.760 --> 14:46.290
ได้อีกด้วย

14:47.340 --> 14:51.840
นี่จึงเป็นวิธีง่ายๆ ในการตรวจจับและจำแนกมัลแวร์

14:53.430 --> 14:56.580
นั่นก็คือทั้งหมดสำหรับบทเรียนนี้

14:56.760 --> 14:58.110
ขอบคุณที่รับชมครับ.

14:58.110 --> 14:59.670
แล้วพบกันใหม่ในตอนหน้าครับ
