1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

Hướng dẫn UDF - LDMemory.au3

Thảo luận trong 'Hướng dẫn - Bài tập căn bản' bắt đầu bởi ZedTerminator, 24/7/21.

  1. ZedTerminator

    ZedTerminator Thành viên mới
    • 3/6

    Tham gia ngày:
    23/7/21
    Bài viết:
    1
    Đã được thích:
    4
    Hello anh em, mình join forum khá lâu rồi, sau đó một thời gian thì mình ko làm việc với Autoit nữa.
    Cách đây nửa năm mới quay lại làm mấy cái về automation. Mà lâu mới quay lại thì mất tài khoản cũ mất tiu rồi vì không nhớ nên đăng ký lại. Tiện đây mình thấy nhiều bro đang sử dụng cái UDF Memory NomadMemory bị outdated khá lâu rồi và gần đây mình có test lại thì nó không còn thực sự chạy ngon nữa nên mình dành thời gian gần một buổi để viết lại cái UDF Memory mới phù hợp với việc đọc ghi memory hiện tại.
    Máy mình test là Windows 10 bản 21H1 build 19043
    UDF này mình có tham khảo các nguồn khác nhau nữa do mình chủ yếu làm bên C++ nhưng vẫn là mình tự tay viết ra và đã test các tác vụ đọc ghi cơ bản.
    Chức năng của UDF này bao gồm:
    • _OpenProcess: Trả về handle của process hiện tại
    • _ProcessReadMemory: Đọc dữ liệu tại một địa chỉ nhất định trong bộ nhớ
    • _ProcessReadMemoryPointer: Đọc dữ liệu trong bộ nhớ thông qua pointer và offsets
    • _ProcessWriteMemory: Ghi dữ liệu tại một địa chỉ nhất định trong bộ nhớ
    • _ProcessWriteMemoryPointer: Ghi dữ liệu trong bộ nhớ thông qua pointer và offsets
    • _ProcessListModules: Liệt kê các module của một process nhất định theo PID
    • _CreateToolHelp32Snapshot: Hàm tạo snapshot các module như bên C++ :(( chỗ này mình cũng không biết giải thích như nào, các bro tự tìm hiểu nhé.
    • _ProcessGetModuleBaseAddress: Lấy địa chỉ là base address của một module dựa trên PID
    • _IsProcessAlive: Kiểm tra xem process có đang chạy hay không dựa vào procID hoặc procName
    Nói chung ở đây mình liệt kê zị thôi chứ ở trong UDF mình đã giải thích khá tường tận từng hàm rồi :v
    Còn bây giờ chuyển qua cách dùng lun thôi :v
    Bước đầu tiên là anh em cần quyền Admin và import cái UDF của mình vào nha :V

    Mã (AutoIt):

    #RequireAdmin
    #include "LDMemory.au3"
     
    Tiếp theo là gì :v là check xem process có đang chạy hay không? Ở trong UDF mình có viết hai hàm kiểm tra cái này, anh em dùng cái nào cũng được :v

    Mã (AutoIt):

    $procName = "popcapgame1.exe"
    $procID = _IsProcessAlive($procName)
     
    Oke nếu process đang chạy thì có nghĩa là tồn tại $procID :v cái này anh em có thể dùng 1 câu If để check xem nó có > 0 không. Vì hàm return về 0 hoặc False nhé tùy theo cái biến anh em truyền vào là pID hay procName

    Tiếp theo là LẤY HANDLE

    Mã (AutoIt):

    $handle = _OpenProcess($procID, $_PROCESS_ALL_ACCESS, False)
     
    Anh em để ý cái $_PROCESS_ALL_ACCESS là quyền truy cập của handle vào process sau khi lấy được nó, ở đây các hằng số này mình đã khai báo bên file CONSTANTS.au3 nha anh em. Tùy vào tác vụ anh em muốn handle mà quyền sẽ khác nhau: Tham khảo tại: https://docs.microsoft.com/en-us/windows/win32/procthread/process-security-and-access-rights

    Mã (AutoIt):

    Global $_PROCESS_QUERY_INFORMATION = 0x400
    Global $_PROCESS_QUERY_LIMITED = 0x1000
    Global $_PROCESS_READ = 0x10
    Global $_PROCESS_WRITE = 0x20
    Global $_PROCESS_CREATE_THREAD = 0x2
    Global $_PROCESS_CREATE_PROCESS = 0x80
    Global $_PROCESS_ALL_ACCESS = 0x1F0FFB
     
    Sau khi lấy được handle, bây giờ anh em có thể đọc ghi process memory được rồi :v
    Code mẫu:
    Đọc ghi địa chỉ nhất định:
    Mã (AutoIt):

    $sunAddress = 0x004D54D4
    $value = _ProcessReadMemory($handle, $sunAddress)

    ; $value chính là giá trị đọc được tại địa chỉ 0x004D54D4
    ; Dễ như ăn cơm đúng ko :v
     
    Đọc pointer và offset:
    [​IMG]

    Mã (AutoIt):

    $procName = "popcapgame1.exe"
    $procID = _IsProcessAlive($procName)
    $handle = _OpenProcess($procID, $_PROCESS_ALL_ACCESS, False)

    $sunAddress = 0x00329670

    $baseAddr = _ProcessGetModuleBaseAddress($procID, "popcapgame1.exe")

    $pointer = $baseAddr + $sunAddress

    Dim $offsets[5] = [0x320, 0x18, 0x0, 0x8, 0x5578]

    $pointer = _ProcessReadMemory($handle, $pointer)

    $valToWrite = 9999

    $test = _ProcessWriteMemoryPointer($handle, $pointer, $valToWrite, $offsets)
    MsgBox(0,0,$test)
     

    Kết quả:
    [​IMG]

    Tương tự với _ProcessReadMemory với _ProcessReadMemoryPointer nha anh em :v đọc UDF đi mình giải thích rồi :3
    Cảm ơn anh em :v dùng thì ghi nguồn giùm mình với nha :v mình cũng mấy cả buổi để làm ra đấy :v
    À mình spoil chút :( mình có làm youtube hướng dẫn bên C++
    Có gì a e có hứng thú với C++ nữa thì có thể tham khảo kênh của mình: https://www.youtube.com/channel/UCClRkljzWgsXWMAt7pY-LCg
    Cảm ơn anh em nhiều
     

    Các file đính kèm:

    Chỉnh sửa cuối: 25/7/21
  2. kenkaka1610

    kenkaka1610 Thành viên mới
    • 1/6

    Tham gia ngày:
    25/7/21
    Bài viết:
    1
    Đã được thích:
    0
    Đang nghiên cứu mấy vụ này. Cảm ơn bạn.
     
  3. Tran Hai Ho

    Tran Hai Ho Thành viên mới
    • 1/6

    Tham gia ngày:
    1/8/21
    Bài viết:
    2
    Đã được thích:
    0
    Mình vừa tập học autoit nhưng code của bác em làm theo thì nó không giống Cheat, Bác có thể làm 1 ví dụ cụ thể đọc Point>Address không ạ
     
  4. [Ken]

    [Ken] Thành viên mới
    • 1/6

    Tham gia ngày:
    23/12/20
    Bài viết:
    1
    Đã được thích:
    0
    Chỉ 1 từ thôi "quá tuyệt vời" :D
    Cảm ơn bác đã chia sẻ!
     
  5. Tungtata

    Tungtata Tà tà mà sống ~ Thành viên BQT Administrator
    • 93/113

    Tham gia ngày:
    25/8/15
    Bài viết:
    289
    Đã được thích:
    924
    Nơi ở:
    Hà Nội
    Ngày xưa mình cũng thích món này lắm mà nó cao siêu quá nên ko học đc :D
     
  6. Nicorobin

    Nicorobin Thành viên mới
    • 1/6

    Tham gia ngày:
    30/3/22
    Bài viết:
    2
    Đã được thích:
    0
    anh ơi ,anh xem dùm code này với ạ em sai ở đâu mà ko đọc được pointer vậy anh , kết quả là false . đây là bài 8 của cheatengine tutorial ạ, em cảm ơn,

    #RequireAdmin
    #include "LDMemory.au3"

    $procName = "Tutorial-i386.exe"
    $procID = _IsProcessAlive($procName)
    $handle = _OpenProcess($procID, $_PROCESS_ALL_ACCESS, False)

    $Address = 0x006426B0

    $baseAddr = _ProcessGetModuleBaseAddress($procID, "Tutorial-i386.exe")
    MsgBox(0,'$baseAddr',$baseAddr)

    $pointer = $baseAddr + $Address

    Dim $offsets[4] = [0xC, 0x14, 0x0, 0x18]

    $data=_ProcessReadMemoryPointer($handle,$pointer, $offsets)


    MsgBox(0,'$data',$data)
     
    Chỉnh sửa cuối: 31/3/22
  7. gugugu

    gugugu Thành viên mới
    • 1/6

    Tham gia ngày:
    26/10/22
    Bài viết:
    1
    Đã được thích:
    0
    ôi bạn là cứu tinh cuộc đời tôi<3)
     

Chia sẻ trang này

Đang tải...