![]() |
| Practical Malware Analysis |
CHAPTER 5 - IDA PRO
Write up Lab5-1
Analyze the malware found in the file Lab05-01.dll using only IDA Pro. The goal of this lab is to give you hands-on experience with IDA Pro. If you’ve already worked with IDA Pro, you may choose to ignore these questions and focus on reverse-engineering the malware.
Phân tích mã độc được tìm thấy trong tệp Lab05-01.dll chỉ bằng IDA Pro. Mục tiêu của lab này là cung cấp cho bạn trải nghiệm thực tế với IDA Pro. Nếu bạn đã làm việc với IDA Pro, bạn có thể chọn bỏ qua những câu hỏi này và tập trung vào kỹ thuật dịch ngược mã độc.
![]() |
| Lab05-01 |
1. What is the address of DllMain?
(Địa chỉ của DllMain là gì?)
Khởi động IDA Pro và mở tệp Lab05.dll, IDA Pro đã phát hiện nó có định dạng PE và kiến trúc Intel x86, nhấn OK để tiếp tục.
Sau khi file đã disassemble, tại cửa sổ Functions tìm đến hàm DllMain(x,x,x) đồng thời trong cửa sổ IDA View-A ta biết được địa chỉ hàm là 100D02E.
Note:
- Khi ta tải một file thực thi, IDA Pro sẽ cố gắng xác định định dạng file và kiến trúc vi xử lý mà file được sinh ra để phục vụ. Ở đây file Lab05.dll được phát hiện có định dạng PE và kiến trúc Intel x86. Trừ khi ta thực hiện phân tích một mã độc chạy trên thiết bị điện thoại chẳng hạn (hoạt động trên kiến trúc vi xử lý khác), ta thường không phải thay đổi thông tin hệ vi xử lý thường xuyên.
- Trong IDAPro để hiện địa chỉ CODE ở giao diện graph thực hiện như sau: Options → General tích chọn Line Prefixes.
- Phím tắt giữa chế độ đồ họa và chế độ text là phím 'Space'.
2. Use the Imports window to browse to gethostbyname. Where is the import located?
(Sử dụng cửa sổ Imports để duyệt đến gethostbyname. Địa chỉ nhập nằm ở đâu?)
Đầu tiên, chúng ta hãy xem hàm gethostbyname.
Đây là chức năng lấy thông tin về trang web mà chúng ta muốn truy cập. Thông tin đó bao gồm IP, v.v.
Tiếp theo trong IDA Pro, trong cửa sổ Imports, nhấn Alt+T để mở hộp thoại tìm kiếm 'gethostbyname'
Double click hàm gethostbyname trong cửa sổ Imports lập tức IDA sẽ tự động chuyển sang cửa sổ IDA View-A để trỏ đến địa chỉ của hàm, kết quả ta có địa chỉ 100163CC trong .idata.
3. How many functions call gethostbyname?
(Hàm gọi gethostbyname có bao nhiêu chức năng?)
Trong cửa sổ IDA View-A đặt dấu nhắc tại vị trí của hàm gethostbyname, tiếp theo từ Menu Jump → List cross references to... (phím tắt Ctrl+X).
Hộp thoai xrefs to gethostbyname sẽ cho biết số lượng hàm gọi.
Quan sát ở cuối cửa sổ sẽ thấy “Line 1 of 18” có 18 dòng nhưng thực tế IDA Pro 8.3 tính toán tham chiếu chéo hai lần, một lần cho loại p (tham chiếu đang được gọi - called) và một lần cho loại r (tham chiếu đang được đọc - read vì nó là call dword ptr [...] để nhập, CPU phải đọc nội dung nhập rồi gọi vào đó). Ở đây ta chỉ quan tâm đến loại p, click vào tab Type để sắp xếp lại tham chiếu chéo sẽ có 9 tham chiếu và hàm gethostbyname được gọi tổng cộng bằng 5 hàm riêng biệt.
Chuột phải vị trí hàm gethostbyname chọn Xrefs graph to... để xem thông tin các liên kết chéo với hàm gethostbyname.
4. Focusing on the call to gethostbyname located at 0x10001757, can you fig-ure out which DNS request will be made?
(Tập trung vào lệnh gọi tới gethostbyname có địa chỉ 0x10001757, bạn có thể biết yêu cầu DNS nào sẽ được thực hiện không?)
IDA sẽ đưa đến vị trí của gethostbyname.
Hãy quan sát đoạn mã này:
Có thể hiểu đoạn mã này như sau: Lệnh mov sẽ chuyển giá trị off_10019040 vào thanh ghi eax trước khi được cộng 0Dh (tương ứng 13 trong hệ thập phân) vào thanh ghi eax. Như vậy ta phải xác định xem giá trị off_10019040 có trỏ về DNS nào không.
Nhấn phím G và nhập off_10019040 để xem:
Như thấy nó trỏ tới một chuỗi [This is RDO]pics.practicalmalwareanalysis.com. Tuy nhiên như đã nói nó đã được công 0Dh (13 byte) trước khi thực hiện lệnh đẩy push vì vậy mà nếu đẩy 13 byte tương ứng với [This is RDO] sẽ chỉ còn lại:
pics.praticalmalwareanalysis.com5. How many local variables has IDA Pro recognized for the subroutine at 0x10001656?
(IDA Pro đã nhận dạng được bao nhiêu biến cục bộ cho chương trình con tại 0x10001656?)
Note:
- Các biến cục bộ được IDA gắn nhãn tương ứng với giá trị âm.
- Các tham số được IDA gắn nhãn và tham chiếu với giá trị dương.
Nhấn phím G tìm đến địa chỉ 0x10001656 để phân tích sub_10001656. Chúng ta thấy phần khoanh đỏ số 1 chính là bắt đầu của hàm sub_10001656, phần khoanh đỏ số 3 chính là số lượng các biến cục bộ, có 23 biến không bao gồm lpThreadParameter ở dòng cuối cùng vì nó là tham số đến. Tùy phiên bản thương mại hoặc bản miễn phí sẽ phát hiện số lượng hơi khác nhau đôi chút.
6. How many parameters has IDA Pro recognized for the subroutine at 0x10001656?
(IDA Pro đã nhận dạng được bao nhiêu tham số cho chương trình con tại 0x10001656)
Vị trí khoanh số 2 trong hình ở câu hỏi 5 cho biết tham số đến là lpThreadParameter và khoanh vị trí số 4 được nhận dạng tức là dword ptr 4. Như vậy IDA nhận ra 1 tham số trong subprocess.
7. Use the Strings window to locate the string \cmd.exe /c in the disassembly. Where is it located?
(Sử dụng cửa sổ Strings để định vị chuỗi \cmd.exe /c trong quá trình disassembly. Nó nằm ở đâu?)
Trong Tab View → Open subviews → Strings ( phím tắt Shitf+F12) để mở cửa sổ Strings
Nhấn Alt+T để mở hộp thoại tìm kiếm strings: \cmd.exe /
8. What is happening in the area of code that references \cmd.exe /c? (Điều gì đang xảy ra trong vùng mã tham chiếu \cmd.exe /c?)
Trong cửa sổ Strings nhấn vào chuỗi " \\cmd.exe /c " và double click vào chuỗi đó. Hàm sẽ mở ở chế độ xem văn bản IDA View-A, như hiển thị ở câu hỏi 7.
Trong dòng chứa "\\cmd.exe /c", double click vào địa chỉ ở bên phải "XREF" (vị trí mũi tên ↑ ) trong hình ảnh bên dưới.
Sau khi double click vào vị trí mũi tên ↑, IDA Pro sẽ chuyển đến vị trí chi tiết của hàm, tiếp theo nhấn phím 'Space' để chuyển sang chế độ xem biểu đồ. Quan sát thấy rằng \\cmd.exe /c được sử dụng trong thủ tục nhỏ bên trái.
Kéo chế độ xem biểu đồ xuống để xem các chương trình con trước nó. Kéo xuống đến khung thứ 4, bạn sẽ thấy văn bản bắt đầu bằng "Hi, Master", như hiển thị bên dưới.
Double click vào aHiMasterDDDD để hiển thị đầy đủ. Mục đích của mã độc được nêu rõ ràng trong phần khoanh đỏ ở hình dưới. Nó bắt đầu một phiên shell từ xa.
9. In the same area, at 0x100101C8, it looks like dword_1008E5C4 is a global variable that helps decide which path to take. How does the malware set dword_1008E5C4? (Hint: Use dword_1008E5C4’s cross-references.)
(Trong cùng một khu vực, tại 0x100101C8, có vẻ như dword_1008E5C4 là một biến toàn cục giúp quyết định nên chọn đường dẫn nào. Vậy mã độc đặt địa chỉ dword_1008E5C4 như thế nào? (Gợi ý: Sử dụng tham chiếu chéo của dword_1008E5C4.))
Nhấn phím 'G' để tìm kiếm địa chỉ 0x100101C8. Được chuyển đến cmp dword_1008E5C4, ebx lệnh này có nghĩa là sẽ so sánh ebx với biến toàn cục.
Tại vị trí dword_1008E5C4 right click chọn Jump to xref to operand... (phím tắt X).
Chúng ta thấy rằng EAX được chuyển vào dword_1008E5C4 và EAX là giá trị trả về từ lệnh gọi hàm được thực hiện trong lệnh trước đó là lệnh call sub_1003695.
Do đó, chúng ta cần xác định hàm đó trả về cái gì? Để làm như vậy, chúng ta kiểm tra sub_10003695 bằng cách double click vào nó và xem xét quá trình disassembly.
Quan sát hình trên nhận thấy hàm sub_10003695 chứa thông tin các lệnh sau như sau:
- Lệnh call ds:GetVersionExA → kiểm tra thông tin phiên bản của Hệ điều hành dưới dạng giá trị.
- Lệnh xor eax, eax → đặt eax = 0.
- Lệnh cmp [eb+VersionInformation.dwPlatformId], 2 → so sánh dwPlatformId nền tảng của Hệ điều hành với giá trị 2.
Note: Theo tài liệu của Microsoft thì giá trị dwPlatformId là 2 nếu version Windows là NT hoặc các verion lớn hơn NT.
- Lệnh setz al → Nếu dwPlatformId=2 mà đúng thì giá trị trả về là 0 (cờ nhớ CF=0) và cờ zero =1 (ZF = 1). Lúc này setz AL =1 (AL lại là 8 bit thấp nhất của eax và eax đã được đặt = 0 ở lệnh XOR trước đó.
Kết luận đây chỉ là một cách kiểm tra đơn giản để đảm bảo rằng Hệ điều hành là Windows NT hoặc version mới hơn và biến toàn cục thường sẽ được đặt thành 1.
10. A few hundred lines into the subroutine at 0x1000FF58, a series of com-parisons use memcmp to compare strings. What happens if the string compar-ison to robotwork is successful (when memcmp returns 0)?
(Vài trăm dòng lệnh trong chương trình con tại 0x1000FF58, một loạt các phép so sánh sử dụng memcmp để so sánh các chuỗi. Điều gì xảy ra nếu chuỗi so sánh với robotwork thành công (khi memcmp trả về 0)?
Nhấn 'G' và tìm tới chương trình con tại 0x1000FF58, kéo lên trên một chút để xem các biến và tham số được chương tình con nhận diện.
Sau khi di chuyển, chúng ta cần tìm Robotwork, vào cửa sổ Strings bằng (phím tắt Shift+F12) (lưu ý do một số dòng máy tính có thêm hàng phím chức năng nên thay vì nhấn Shift+F12 có thể cần phải nhấn đồng thời Fn+shift+f12) và tìm kiếm chuỗi bằng Alt+T.
Tiếp theo click vào vị trí của 'robotwork' IDA sẽ chuyển sang vị trí trong cửa sổ IDA View-A. Right click tại vị trí của robotwork chọn List cross referencess to... ( Phím tắt Ctrl+X).
Tên phần là xdoors_d và chúng ta suy đoán rằng nó có thể được tạo bởi người viết ra mã độc. Xét thấy có các biến liên quan đến chuỗi như 'robotwork', .., v.v. thì rất có thể nó nằm trong vùng .data.
Hãy đặt con trỏ vào phần offset, aRobotwork chọn OK.
Bạn có thể thấy phần memcmp được thấy trong vấn đề. Ngoài ra, địa chỉ trong câu hỏi là 1000FF58, nhưng lý do nó không xuất hiện ngay khi tôi tìm kiếm là vì nó quá xa địa chỉ.
Như vậy, nếu có chuỗi 'robotwork' xuất hiện thì chúng ta sẽ so sánh và nếu đúng thì nó sẽ là 100052A2, double click vào hàm sub_100052A2 để xem chi tiết.
Có vẻ như một khóa đăng ký cụ thể đang được mở (vị trí khung khoanh đỏ).
11. What does the export PSLIST do
(PSLIST xuất có tác dụng gì?)
Trong cửa sổ Exports.
Nhấn 'Space' để xem chế độ đồ họa.
Tiếp theo double click vào sub_10003C3 để nhảy đến vị trí của hàm.
Nhấn 'Space' để xem chế độ đồ họa.
Khi vào trong, nó đặt 1 trong 1008E5BC và gọi hàm sub_100036C3. Phiên bản hệ điều hành được kiểm tra bằng chức năng getversion như ở câu trả lời số 9 chúng ta đã đề cập đến: OSVERSIONINFOA (winnt.h) - Win32 apps | Microsoft Learn
Vì vậy hãy thay đổi chức năng này để nó trông đẹp hơn. Đặt con trỏ lên hàm sub_100036C3 và nhấn N hoặc Nhấp chuột phải → Rename và đổi thành OS_Version_sub_100036C3
Lúc này tên hàm đã thay đổi thành OS_Version_sub_100036C3 và chúng ta sẽ xem xét hàm dành cho sub_10006518 bên dưới. Có thể giả định rằng chức năng của sub_10006518 là in danh sách quy trình. Đổi tên sub_10006518 thành PRINT_PSLIST_sub_10006518.
Chức năng này ban đầu kiểm tra phiên bản hệ điều hành và in danh sách quy trình. Tôi đã kiểm tra các hàm bên dưới và thấy rằng chúng giống các hàm xuất ra PSLIST, vì vậy tôi đã đổi tên chúng.
12. Use the graph mode to graph the cross-references from sub_10004E79.Which API functions could be called by entering this function? Based on the API functions alone, what could you rename this function?
(Sử dụng chế độ biểu đồ để vẽ biểu đồ tham chiếu chéo từ sub_10004E79. Những hàm API nào có thể được gọi bằng cách nhập hàm này? Chỉ dựa vào các hàm API, bạn có thể đổi tên hàm này thành gì?)
Bằng cách sử dụng 'G' để đi đến địa chỉ quan tâm (trong trường hợp này là sub_10004E79).
Sau đó từ Menu View → Graphs → XRefs From để xem một số hàm API trong hàm này.
Dựa trên điều này, có thể suy ra rằng nhiều khả năng Mã định danh ngôn ngữ mặc định của hệ thống sẽ được gửi qua network socket và do đó có thể đặt tên hàm này là LanguageIdentifier_Send.
13. How many Windows API functions does DllMain call directly? How many at a depth of 2 ?(DllMain gọi trực tiếp bao nhiêu hàm Windows API? Có bao nhiêu ở độ sâu 2 ?)
Tìm lại địa chỉ hàm DllMain(x,x,x) sau đó đặt dấu nhấp chọn Hàm _DllMain@12:
Tiếp theo từ Menu View → Graphs → User xrefs chart.
Hộp thoại User xrefs chart xuất hiện, tiến hành điều chỉnh như vùng khoanh vàng và nhấn OK để thực hiện.
Note:
Địa chỉ bắt đầu và kết thúc phải tương ứng với điểm bắt đầu của DllMain - cụ thể là 0x1000D02E. Vì tôi chỉ quan tâm đến các tham chiếu chéo từ DllMain nên chúng tôi chọn độ sâu đệ quy là 1 để chỉ hiển thị các hàm mà DllMain gọi trực tiếp.
Kết quả hiển thị biểu đồ.
Hàm DLLMain gọi 4 hàm Windows API CreateThread, strncpy, strlen và _strnicmp)
Nếu chúng ta mở rộng điều này lên độ sâu 2, biểu đồ sẽ tăng kích thước và sẽ cực kỳ chi tiết.
Ở độ sâu 2, DLLMain gọi tổng số 33 hàm API bao gồm Sleep và nhiều chức năng liên quan đến mạng như socket, kết nối, recv và gửi. Ảnh chụp màn hình bên dưới hiển thị tất cả các hàm (hàm API có màu hồng) với DLLMain được khoanh màu đỏ để tham khảo.
14. At 0x10001358, there is a call to Sleep (an API function that takes one parameter containing the number of milliseconds to sleep). Looking backward through the code, how long will the program sleep if this code executes?
(Tại 0x10001358, có lệnh gọi tới chế độ Sleep (một hàm API nhận một tham số chứa số mili giây để ngủ). Nhìn ngược lại đoạn mã, chương trình sẽ sleep trong bao lâu nếu đoạn mã này thực thi?)
Quay trở lại với lệnh gọi chế độ ngủ, chúng ta có thể thấy EAX được nhân với 1000 trước khi được đẩy vào ngăn xếp và được gọi. Điều này khớp với tham chiếu đến mili giây, trong đó có 1000 mili giây trong một giây.
Nhấn G để đến địa chỉ 0x10001358
Quan sát vào đoạn mã sau:
- call ds: Sleep - Lệnh này sẽ thực thi chế độ ngủ và nó lấy tham số là mili giây để ngủ đồng thời nó được đẩy lên ngăn xếp dưới dạng EAX bằng lệnh push eax ở địa chỉ 0x10001357.
- imul eax, 3E8h - Lệnh này sẽ nhân EAX với 0x3E8 (hoặc 1000 ở dạng thập phân), điều này cho chúng ta biết rằng kết quả của lệnh gọi atoi trước đó được nhân với 1000 để có số giây ngủ.
- mov eax, off_10019020 - Lệnh này sẽ chuyển off_10019020 vào EAX. Để xem chi tiết về phần bù hãy nhấn đúp chuột vào off_10019020:
Kết quả đây là tham chiếu đến chuỗi [This is CTI]30 .
- add eax, 0xD - Lệnh này thêm EAX vào phần bù, khiến EAX trỏ đến 30 cho lệnh gọi atoi , chuỗi này sẽ chuyển chuỗi 30 thành số 30. Lấy 30*1000 = 30.000 mili giây (30 giây), đó là khoảng thời gian chương trình này sẽ ngủ nếu các chuỗi giống nhau khi thực thi.
Kết luận: Chương trình sẽ ngủ 30 giây nếu các chuỗi giống nhau thực thi.
15. At 0x10001701 is a call to socket. What are the three parameters?
(Tại 0x10001701 là lệnh gọi tới socket. Ba thông số là gì?)
Nhấn G để nhảy tới địa chỉ 0x10001701, có thể thấy một cuộc gọi đến socket có 3 tham số (af, type và protocol), tất cả đều được đẩy vào ngăn xếp trước cuộc gọi.
16. Using the MSDN page for socket and the named symbolic constants func-tionality in IDA Pro, can you make the parameters more meaningful? What are the parameters after you apply changes?
(Sử dụng trang MSDN cho socket và các hằng ký hiệu được đặt tên trong IDA Pro, bạn có thể làm cho các tham số có ý nghĩa hơn không? Các thông số sau khi bạn áp dụng thay đổi là gì?)
Đầu tiên hãy truy cập Chức năng socket MSDN để tìm hiểu: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket
Bằng cách xem xét chức năng socket MSDN, chúng ta có thể tìm thấy những con số này tương quan với nhau.
Tiếp theo trong IDA Pro, đưa vị trí con trỏ chuột tại vị trí của số 6 và right click để chọn Symbolic constant → Use standard symbolic constant.
Hộp thoại Please choose a symbol hiện ra với rất nhiều socket function.
Nhấn Ctrl+F để xuất hiện khung tìm kiếm ở phía dưới, tiếp theo hãy tìm: 'IPPROTO_TCP' (tương ứng với 6 trong MSDN socket) và double click nó để sửa đổi.
Kết quả số 6 đã được sửa thành IPPROTO_TCP.
Thực hiện tương tự với các số 2 và 1 ta sẽ có:
Như vậy là các cài đặt đã được thay đổi để dễ xem hơn.
17. Search for usage of the in instruction (opcode 0xED). This instruction is used with a magic string VMXh to perform VMware detection. Is that in use in this malware? Using the cross-references to the function that executes the in instruction, is there further evidence of VMware detection?
(Tìm kiếm cách sử dụng lệnh trong (opcode 0xED). Lệnh này được sử dụng với chuỗi ma thuật VMXh để thực hiện phát hiện VMware. Điều đó có được sử dụng trong mã độc này không? Bằng cách sử dụng các tham chiếu chéo tới hàm thực thi lệnh in, có thêm bằng chứng nào về việc phát hiện VMware không?)
Trong cửa sổ IDA View-A, nhấn Alt+B để mở hộp thoại tìm kiếm Binary search:
Chọn in eax, dx và nhấn đúp vào nó để xem thông tin chi tiết:
Để xác nhận việc chống máy ảo, chúng ta thực hiện tham chiếu chéo như sau:
- Cuộn lên đến vị trí bắt đầu của hàm đó là sub_10006196.
- Nhấn Ctrl+X để mở tham chiếu chéo, chọn tham chiếu đầu tiên và nhấp vào OK.
18. Jump your cursor to 0x1001D988. What do you find? (Chuyển con trỏ tới 0x1001D988. Bạn tìm thấy gì?)
Nhấn phím 'G' để nhảy tới địa chỉ 0x1001D988.
Chúng ta sẽ tìm thấy một loạt chuỗi ngẫu nhiên không có ý nghĩa.
19. If you have the IDA Python plug-in installed (included with the com-mercial version of IDA Pro), run Lab05-01.py, an IDA Pro Python script provided with the malware for this book. (Make sure the cursor is at 0x1001D988.) What happens after you run the script?
(Nếu bạn đã cài đặt plug-in IDA Python (có trong phiên bản thương mại của IDA Pro), hãy chạy Lab05-01.py, tập lệnh IDA Pro Python được cung cấp cùng với phần mềm độc hại cho cuốn sách này. (Đảm bảo con trỏ ở 0x1001D988.) Điều gì xảy ra sau khi bạn chạy tập lệnh?)
Mình chưa cài đặt phiên bản thương mại do đó để chạy được đoạn scrit python sẽ cần chuyển đổi sang định dạng IDC và save vào cùng thư mục.
#include<idc.idc>static main(){auto ea=ScreenEA(),b,i,decoded_byte;for(i=0x0;i<0x50;i++){b=Byte(ea+i);decoded_byte=b*0x55;PatchByte(ea+i,decoded_byte);}}
Sau khi chạy tập lệnh, nó sẽ trở thành một chuỗi văn bản thuần túy.
20. With the cursor in the same location, how do you turn this data into a single ASCII string? (Với con trỏ ở cùng một vị trí, làm cách nào để biến dữ liệu này thành một chuỗi ASCII đơn?)
Đặt vị trí con trỏ tại địa chỉ 0x1001D988 và nhấn phím 'A' để chuyển đổi sang dạng ASCII, ta được dãy ký tự sau: '-1::',27h,'u<&u!=<&u746>1::',27h,'yu&!',27h,'<;2u106:101u3:',27h,'u'
Thực hiện tương tự với các địa chỉ khác cho đến khi không còn khoảng trống ta được các ký tự như sau:
'46!<649u'
'49"4',27h,'0u'
';49,&<&u'
'47uo|dgfa',0.
Nhận thấy những ký tự ASCII này đã được encode để hiểu ý nghĩa các ký tự này chúng ta sẽ decode nó.
Chúng ta thấy rằng nó chứa mã thực thi với thao tác XOR sử dụng 0x55 làm khóa. Đưa toàn bộ vào CyberChef và xóa các khoảng cách không cần thiết ta sẽ được kết quả sau:
-1::'u<&u!=<&u746>1::'yu&!''<;2u106:101u3:'u'46!<649u49"4'0u49,&<&u47uo|dgfa
Tương đương với chuỗi decode:
xdoor is this backdoor, strring decoded for ractical alware alysis ab :)1234
https://gchq.github.io/CyberChef/#recipe=XOR(%7B'option':'Hex','string':'0x55'%7D,'Standard',true)&input=LTE6Oid1PCZ1IT08JnU3NDY%2BMTo6J3l1JiEnJzw7MnUxMDY6MTAxdTM6J3UnNDYhPDY0OXU0OSI0JzB1NDksJjwmdTQ3dW98ZGdmYQ
21. Open the script with a text editor. How does it work? (Mở tập lệnh bằng trình soạn thảo văn bản. Làm thế nào nó hoạt động?)
Sử dụng trình soạn thảo Notepad++ mở file script python:
sea = ScreenEA()
for i in range(0x00,0x50):
b = Byte(sea+i)
decoded_byte = b ^ 0x55
PatchByte(sea+i,decoded_byte)
Tập lệnh Lab05-01.py sử dụng chức năng “ScreenEA” với hàm ScreenEA để lấy vị trí hiện tại của con trỏ trong IDA. Sau đó, nó lặp qua 0x50 byte liên tiếp và sử dụng XOR để so sánh từng byte với 0x55, sau đó sử dụng PatchByte để hợp nhất tất cả chúng lại với nhau trên một dòng.Kết thúc Lab05-01.dll































































































