Kết quả 1 đến 3 của 3

Chủ đề: phần mềm OllyDbg

  1. #1
    Ngày tham gia
    Aug 2015
    Bài viết
    3

    phần mềm OllyDbg

    có bạn nào biết cách sủ dụng phần mềm ollydbg :ermm:

  2. #2
    Ngày tham gia
    Aug 2015
    Bài viết
    1
    sử dụng ollydbg, ## cơ bản ##
    copyright by moonbaby - rea.fareastking.com


    i - giới thiệu :

    - ollydbg hay gọi tắt là olly, là một chương trình debugger dễ sử dụng, trực quan . thích ứng cho mọi cấp độ cracker khác nhau.
    - có thể nói olly bao hàm rất nhiều tính năng mà nếu sử dụng riêng lẻ ta phải cần đến nhiều chương trình kết hợp lại . hiện nay olly đã có version 1.0
    - phần hướng dẫn sử dụng olly này bao gồm ba phần :
    *** phần i : cài đặt và cấu hình olly
    *** khần ii : tổng quan về olly
    *** phần iii : sử dụng olly

    ii – cài đặt và cấu hình olly

    - olly không cần cài đặt, khi load về ta chỉ việc bung nén vào trong một thư mục là đã có thể sử dụng olly. tuy nhiên, để có thể sử dụng thêm một số chức năng của olly ta cần phải cấu hình thêm và tìm thêm một số plugins được viết riêng cho chương trình.
    - bạn có thể load olly từ trang chủ http://home.t-online.de/home/ollydbg hay từ http://moonbaby.envy.nu/002-tools/olly với các plugin và cấu hình định sẵn.
    - sau khi unzip olly vào thư mục ( chẳng hạn ollydbg ) bạn sẽ thấy có một thư mục định sẵn plugins, bạn cần tạo thêm một thư mục nữa là udd. đồng thời nếu bạn tải olly về từ trang chủ sẽ không có file ollydbg.ini ( file này lưu giữ cấu hình của olly ), nhưng khi bạn chạy olly lần đầu tiên thì chương trình sẽ tạo file này cho bạn.
    - khởi động olly lên, bạn chọn options --> appearance --> directories. ở đây bạn sẽ thấy hai đường dẫn là udd path và plugin path, bạn hãy chọn đường dẫn về thư mục của olly. sau đó chương trình yêu cầu bạn khỏi động lại để chập nhận chỉnh sửa.
    - sau khi khởi động lại bạn sẽ nhìn thấy trên thanh công cụ chính của olly xuất hiện thêm một mục mới plugins.
    - khi bạn tải olly từ trang web http://moonbaby.envy.nu/002-tools/olly, trong này đã có sẵn file ollydbg.ini, một số plugins cần thiết và đã được cấu hình sẵn cho bạn các số thông số về màu sắc, màu nền cũng như một số các tuỳ chọn khác. khi bạn tải olly về từ trang chủ thì khi khởi động chương trình màu sắc của olly sẽ trông không được đẹp. để chỉnh sửa mà sắc bạn chọn options --> appearance, trong cửa sổ này bạn vào từng mục và chọn màu sắc, font và kích thước chữ, màu nền, màu highline ..... sau đó khởi động lại olly để kích hoạt thay đổi.
    - khi đã quen thuộc với olly, bạn nên vào phần help để tìm hiểu thêm và cấu hình olly theo ý của bạn. song nếu bạn mới bắt đầu sử dụng olly, tôi khuyên bạn nên sử dụng cấu hình định sẵn khi bạn tải về từ http://moonbaby.envy.nu/002-tools/olly

    iii – tổng quan về olly :

    olly có thể chia thành 5 cửa sổ chính . để chuyển đổi qua lại giữa các cửa sổ này ta dùng phím tab. và phím shift-tab sẽ chuyển về cửa sổ trước đó.

    iii.1 - cpu :

    - hầu hết thời gian chúng ta tập trung vào đây. cửa sổ này chia làm 4 ô nhỏ. ta xét từ trái sang phải :
    ** ô thứ nhất : hiển thị địa chỉ của code. khi ta double-click vào nó thì ngay dòng chúng ta double-click vào sẽ đổi thành “ $ == > “, bên trên nó sẽ là “ $ - x “ và bên dưới sẽ là “ $ + x “. các giá trị “ x “ này chính là số byte của câu lệnh.
    ** ô thứ hai : chính là mã lệnh. khi ta double-click vào nó thì có nghĩa ta đặt breakpoint tại đó. và khi double-click lần nữa thì xoá bỏ điểm đặt breakpoint này.
    ** ô thứ ba : code assembler. đây là ô rất quan trọng trong suốt quá trình trace code. khi ta double-click vào nó thì sẽ hiện lên ô “assemble at ******xx”, chúng ta có thể sửa code của chương trình thông qua ô này.
    ** ô thứ tư : hiển thị thông tin của chương trình. chúng ta sử dụng ô này để tìm các chuỗi đặt biệt. và khi chúng ta chuyển sang cửa sổ “text string reference” thì mọi thông tin của cửa sổ này chính là thông tin của ô này. khi ta double-click vào nó thì sẽ hiện lên ô “ add comment at ******xx” cho chúng ta ghi chú lại thông tin, chú giải cần thiết để sử dụng cho lần sau.

    iii.2 - registers [fpu, mmx, 3dnow!] :

    - cửa sổ thứ hai nằm bên phải cửa sổ thứ nhất.
    - hiển thị các thanh ghi và cờ trong assembly. cửa sổ này cần thiết để chúng ta theo dõi sự thay đổi giá trị của các thanh ghi, các lệnh toán học ….

    iii.3 - cửa số thứ ba :

    - cửa sổ nhỏ nằm ngay bên dưới của sổ thứ nhất.
    - thông báo cho ta biết địa chỉ thực, giá trị tính toán, ... trước khi đưa vào hiển thị ở cửa sổ thứ hai.
    - trong cửa sổ này, khi ta right click vào một dòng thì có thể xuất hiện cửa sổ phụ với các tùy chọn ( tối đa là 4 tuỳ chọn ) modify data, follow address in dump, follow value indump và appearance.
    - tuy nhiên phải ghi nhớ một điều, thông số xuất hiện trong cửa sổ này là giá trị của dòng lệnh trong cửa sổ thứ nhất khi ta trace tới. còn khi ta dò thì không xuất hiện thông số trong cửa sổ này
    *** modify data : khi chọn mục này sẽ xuất hiện cửa sổ modify dword at ***xx với ba giá trị là hexadecimal, signed và unsigned. ưu điểm của của sổ này là trong một số trường hợp ta có thể xem được số serial thực của chương trình.
    *** follow address in dump : chuyển cửa sổ thứ tư đến địa chỉ mà ta chọn. rất cần thiết khi ta cần xem xét giá trị của chương trình được lưu tại địa chỉ này
    *** follow value indump : chuyền cửa sổ thứ tư đến giá trị của địa chỉ mà ta chọn.
    *** appearance : thông báo về các tùy chọn trong options --> appearance .

    iii.4 - address, hex dump, ascii hay unicode

    - cửa sổ thứ tứ nằm bên dưới cửa sổ thứ ba .
    - cần thiết để ta quan sát sự thay đổi các giá trị tính toán của chương trình.
    - trong một vài trường hợp ta có thể tìm thấy chuỗi serial ở đây.

    iii.5 - stack

    - cửa sổ thứ năm nằm bên dưới của sổ thứ hai và ngay bên phải cửa sổ thứ ba.
    - đây là bộ nhớ tạm của chương trình.
    - các thông số của một hàm trước khi xử lý sẽ được lưu tạm vào trong stack này. theo dõi chặt chẽ sự thay đổi các vùng nhớ và giá trị của cửa sổ này sẽ giúp ích rất nhiều trong quá trình tìm ra chuỗi serial thực.

    ---------------------------------------------------------




    install, run and write a script in olldg

    thưa các bạn. đặc biệt cho newbie.
    như các bạn thấy đó, khi chúng ta học crack , đa số các phần mềm bây giờ thường được pack bằng một packer nào đó . nhưng chúng ta là newbie thì ko biết unpack như thế nào. thường thì chúng ta tìm một unpacker để unpack . nếu ko có thì chúng ta phải học các tut mup , còn gọi là các tut unpack ‘bằng tay’ rồi thực hành theo để unpack các phần mềm chúng ta muốn crack. các tut mup dạy cho chúng ta các bước sau:
    -find oep
    -dump chương trình trong bộ nhớ bắt đầu tại oep vừa tìm được ra 1 file
    -fix iat
    -sau đó là rebuild pe.
    (oep,iat,pe... là gì hôm nào rãnh tui tổng hợp cho các bạn)
    thường thường đối với một lọai packer, chúng ta tìm oep giống nhau cho các chương trình bị pack bằng packer đó. khi các bạn biết cách tìm oep rồi thì công việc này thật nhàm chán. vì nó chỉ là các thao tác lập lại mỗi khi chúng ta muốn unpack lọai packer đó. vì vậy để không phải mỗi lần chúng ta unpack là phải đem tut mup ra đọc, rồi thao tác y chang như vậy để tìm oep , các cracker đã dùng ngôn ngữ script trong olly để “viết các thao tác nhàm chán” đó lưu lại thành một file script . khi unpack bạn chỉ cần chạy file đó là olly sẽ tự động tìm cho bạn oep. khỏe re phải không bạn. hi`
    một trong những tay cracker của vn viết rất nhiều các script là lão hacnho. các bạn hảy vào website của lão ta mà tìm các script nhé: http://www.reaonline.net/forum/links.php?url=http://www.hacnho.nhandan.info
    mục đích của tut này là giúp các bạn newbie chạy được một file script và làm quen với ngôn ngữ script để hiểu được những gì các tác giả viết trong file script. không khó lắm đâu các bạn. chúng ta học từ từ rồi sẽ biết thôi mà. 


    1.cài đặt ollydbgscript và chạy một file script:

    cài đặt ollyscript theo các bước sau:
    1. đầu tiên bạn phải có ollydbg đã được cài đặt sẳn.( điều này là tất nhiên rồi)
    2. cài đặt 1 thư mục có tên là “plugins” trong thư mục chứa ollydbg trên máy bạn.
    3. bạn download file ollyscript.dll trên mạng về và copy nó vào thư mục “plugins” đã tạo ở trên
    4. mở olldbg lên , vào menu options , chọn appearance/directories. một dialog pops up ra
    5. trong dialog vừa bật lên ta set “plugin path” đến thư mục “plugins” đã tạo ra ở trên.
    6. restart ollydbg. bây giờ ollyscript đã có trong menu plugins .
    7. để chạy một script , ta chọn “run script…” trong menu plugins/ollyscript và chọn file script và bạn muốn run.

    2.giới thiệu về ngôn ngữ script:

    để viết các file script các bạn ko cần một chương trình sọan thảo riêng nào cả , chỉ cần sọan thảo trong notepad là được và lưu ra file có đuôi .txt hay gì cũng được, thỏai mái như “lai cái” hi`hi`.
    bây giờ tui giới thiệu với các bạn cái ngôn ngữ script đơn giản này như đang giởn này:
    tui xài olly 1.10 và plugins v0.91. các bạn hảy vào trang web olly tải về nhé.
    đầu tiên tui xin giới thiệu về cái menu của nó

    a-menus:

    bạn vào menu plugins của olly, chọn ollyscript, ta thấy các menu con như sau:
    -run script…: cho người sử dụng chọn một file script và chạy nó.
    -abort : bỏ qua khi ko muốn script chạy tiếp
    -pause: tạm ngừng script khi nó đang chạy
    -resume: chạy tiếp khi script bị paused
    -about: thông tin về plugin này
    bây giờ chúng ta vào mục chính nhé:

    b-về ngôn ngữ ollyscript:

    ngôn ngữ script trong olly tương tự về mặt ngôn ngữ như ngôn ngữ asm. nhưng khác ở chổ nó ko cần phải biên dịch ra một file .exe , mà thực chất nó là một ngôn ngữ thông dịch trong olly. nếu các bạn nào biết dùng ngôn ngữ lisp trong autocad thì script cũng tương tự như vậy trong olly. tại sao tui nói nó là ngôn ngữ thông dịch chứ ko phải biên dịch, vì khi olly khi run 1 script thì gặp lệnh nào là thực hiện ngay lệnh đó, chứ ko phải biên dịch hết file script rồi mới chạy. các bạn nên có khái niệm về vấn đề này.

    i/qui ước dữ liệu:

    đây cũng chính là rule của ollyscript
    sau đây là một số quy ước của script về dữ liệu src (nguồn) và dest (đích) cho các lệnh (như lệnh “mov dest,src” chẳng hạn):
    -constant ( hằng số): giống như asm là 1 số hex, nhưng trong script không có những ký hiệu trước hay sau số hex.
    ví dụ:
    trong script , một số hex được viết là 00ff chứ ko phải 0x00ff hay 00ffh
    -variable (biến): giống như pascal, biến được mô tả sau từ khóa var nhưng ko cần khai báo lọai biến vì chỉ có 1 lọai biến là số hex.
    -chỉ có một lọai thanh ghi 32-bit trong script như : eax,ebx, ecx, edx, esi, edi, ebp, esp, eip. không có thanh ghi 16-bit như ax , hay 8-bit như al. nhưng bạn có thể dùng lệnh shl/shr và and để lấy giá trị của chúng.
    -tham chiếu đến một vùng nhớ nào đó ta cho địa chỉ nhớ nằm trong 2 dấu […. ]
    ví dụ:
    [401000] : trỏ đến vùng nhớ tại địa chỉ 401000
    [ecx] : trỏ đến vùng nhớ tại địa chỉ ecx
    -để dùng flag (cờ) trong script ta dùng dấu cảm thán “!” trước tên flag
    ví dụ: !cf, !pf, !af, !zf, !sf, !df, !of
    -byte string (chuổi byte, mỗi 1 byte là 2 số hex) để được script hiểu nó phải đặt trong 2 dấu thăng # và chuổi byte phải là số chẳn các số hex giữa 2 dấu # (2 số hex cho 1 byte nên lúc nào cũng phải chẳn)
    ví dụ: #6a0000# (có 6 số là số chẳn chứa trong 2 dấu #)
    -hay hơn nữa là byte string có chứa wildcard là dấu “?”.
    ví dụ: #6a??00# hay #6?0000#
    -chuổi ký tự trong script được viết giữ 2 dấu “…..”
    ví dụ: chuổi ký tự benina là “benina”
    -đối với một số lệnh,để lấy giá trị của một biến ta đặt biến đó trong {..}
    ví dụ:
    var x
    mov x,”00402222”
    mov eax,{x}======== >>eax=00402222
    ii/các biến riêng của script:

    quote:
    $result
    đây là giá trị trả về của vài chức năng giống như chức năng find….

    $version

    biến này chứa version hiện hành của ollyscript
    ví dụ:
    cmp $version, "0.8"
    ja version_above_08


    iii/comments (ghi chú thích khi viết script):
    bất cứ khi nào tui muốn học một ngôn ngữ mới , việc đầu tiên tui phải học là cách comment trong ngôn ngữ đó. vì khi ta tiến hành viết lệnh, nếu ko ghi chú thích đầy đủ, chừng nữa tiếng sau…. , tui ko biết tui đã viết gì…. tui ngu bẩm sinh mà. vì vậy tui sẽ giới thiệu với các bạn cách comment trong script như sau:
    - comment cho 1 dòng lệnh ta dùng “//” trước lời chú thích
    - comment một cụm lời chú thích ta đặt “/*” đầu cụm và “*/” cuối cụm chú thích

    iv-skeleton script (nhân của một script):

    như các bạn biết khi học pascal, một chương trình pascal chuẩn như sau:


    quote:
    program tenchuongtrinh
    khai báo biến, hằng, ….
    begin
    các lệnh;
    end.



    cái đó chính là nhân của một chương trình pascal. vậy nhân của script như thế nào?.thực ra trong ollyscript ko qui định về nhân, nhưng để qui định chung khi “thuở ban đầu mới yêu nhau” , benina xin đề xuất một cái nhân như sau:


    quote:
    /*=================
    tên script
    ==================*/
    khai báo biến, includes …(không bắt buộc)
    các lệnh script
    ……………
    …………..
    ret // exits script



    thực chất ra các dòng comment về tên script ko cần thiết, nhưng chúng ta hảy tập thói wen này để sau này dễ tra cứu script này làm gì.
    ở đây chúng ta thấy lệnh ret ở cuối file. nó chính là lệnh thóat khỏi script trở về olly. nó cũng tương tự như lệnh end trong pascal thôi.


    v-chương trình đầu tiên của bạn:
    để cho đỡ buồn chán bây giờ tui sẽ hướng dẫn các bạn làm một file script đơn giản:
    các bạn hảy bật notepad lên và sọan thảo một file .txt như sau:


    quote:
    /*///////////////////////////////////
    chuong tinh dau tien cua ban
    /////////////////////////////////////*/
    msg “benina is a good newbie” // hiện hộp thọai
    ret // exits script



    bây giờ các bạn hảy lưu file text trên vào một thư mục bất kỳ.hảy bật olly lên, chú ý: ta hảy open 1 file .exe nào đó trong olly rồi mới chạy script trên được nhé. xong chưa các bạn, bây giờ chạy script trên xem sao.
    bùm, nó hiển thị một dialog có dòng thông báo: “benina is a good newbie” đúng ko các bạn. hêhê … sau đó nó hiện 1 hộp thọai báo “script finished”….vậy là ta viết script được rồi…pó tay luôn .
    sẳn đây tui giới thiệu với các bạn một lệnh sau:
    như các bạn biết, trong tut “let’s cracking by olly” mà tui đã viết , có nói về lệnh comment cho các routine trong olly (ko phải comment trong script nhe, đừng có lộn!). nó có phím tắt là button “;”. khi sử dụng lệnh này các bạn sẽ chú thích được 1 ghi chú trong của sổ cpu tại cột comment. thưa các bạn, trong script củng cho phép bạn thao tác được như lệnh “;”. chỉ thị sau tương tự như lệnh “;” trong olly:


    quote:
    cmt addr, text
    -----------------
    thêm vào dòng chú thích text tại địa chỉ addr
    ví dụ:
    cmt eip, “this is the ep”



    như các bạn biết , thanh ghi eip chứa chỉ thị lệnh sắp thực hiện. vì vậy khi open 1 file trong olly , eip luôn chứa chỉ thị lệnh đầu tiên của chương trình đó cũng chính là ep của chương trình. bây giờ ta viết lại script trên như sau:


    quote:
    /*///////////////////////////////////
    chuong tinh dau tien cua ban
    /////////////////////////////////////*/

    msg “benina is a good newbie” // hiện hộp thọai
    cmt eip, “this is the ep”
    ret // exits script



    bạn hảy cho chạy script trên, và nó làm việc như ý chứ?. bạn có thấy tại dòng lệnh đầu tiên trong của sổ cpu của olly có dòng comment “this is the ep” không?. ok!
    sở dĩ tui post lệnh cmt này trước cho các bạn vì trong tut của lão hacnho hay sử dụng cái lệnh này để ghi chú oep đã tìm được. bây giờ thì chúng ta đã lấn sâu vào script một chút rồi đấy.

    chú ý: khi viết script , nhiều khi bị rối, chương trình chạy tầm bậy, ta muốn debug xem script chạy sai chổ nào, chúng ta hảy ứng dụng lệnh msg làm breakpoint trong script nhé. khi đó chương trình ngừng lại cho chúng ta xem xét…hihi.hay các bạn dùng lệnh sau là breakpoint cũng được:


    quote:
    pause
    ----------
    tạm ngừng tiến trình script đang thực thi. muốn resume tiếp tục thì ta vào menu plugins /ollyscript/resume
    ví dụ: trong file script ta đánh vào lệnh:
    pause



    vậy là coi như chương trình đầu tiên đã xong.

    vi-khai báo biến, hằng, và includes

    -khai báo biến:

    quote:
    var varname
    ------------
    khai báo biến để được dùng trong script
    phải khai báo trước khi dùng biến
    ví dụ:
    var x



    -khai báo hằng: thực ra trong script ko có khai báo hằng , muốn khai báo hằng chúng ta cho 1 biến có giá trị đầu tiên, đơn giản vậy thôi.
    trước tiên chúng ta xem lệnh gán giá trị trong script, nó giống như asm vậy

    quote:
    mov dest,src
    -----------------
    gán giá trị trong src vào dest
    src có thể là một long hex string với định dạng như sau #<số hex>#, ví dụ: #1234# (số số hex phải là số chẳn nhé)
    ví dụ:
    mov x, 0f
    mov y, "hello world"
    mov eax, ecx
    mov [ecx], #00dead00beef00#
    mov !cf, 1
    mov !df, !pf


    vậy khai báo hằng như sau:

    quote:
    ví dụ:

    var x
    mov x, “benina is a good newbie”



    -includes một file script:

    quote:
    #inc file
    ----------------
    includes một file script trong một file script khác
    ví dụ:
    #inc “anotherscript.txt”



    ghi chú: lệnh này không nhất thiết phải ở đầu chương trính script, bạn muốn đặt ở đâu cũng được. mục đích chính của nó là, khi script chạy gặp lệnh này thì thực thi tất cả các lệnh trong file “anotherscript.txt” , sau đó mới thực thi tiếp các lệnh sau lệnh #inc (với điều kiện trong “anotherscript.txt” ko có lệnh ret)

    để ứng dụng các điều vừa học, các bạn hảy viết 2 file script như sau:


    quote:
    /*///////////////////////////////////
    file : script1.txt
    /////////////////////////////////////*/
    var x
    mov x,"benina is a good newbie" // khai bao hang x

    #inc "script2.txt" // thực thi các lệnh trong script2.txt

    msg “script2 da chay xong!!”

    ret // exits script




    quote:
    ------------------------------------
    /*///////////////////////////////////
    file : script2.txt
    /////////////////////////////////////*/

    msg x
    // chu y trong script2 khong co lệnh ret



    ---------------------------
    bây giờ bạn hảy cho olly chạy file script1 xem sao. ok! bạn đã hiểu rồi nhé, không cần giải thích dài dòng. chỉ chú ý là trong script2 ko có lệnh ret thôi

    vii-các lệnh thao tác trong olly:

    trong olly các lệnh “thao tác bằng tay” như f9 (run), f8 , f7….. đều được script tự động thực hiện. sau đây là các lệnh script tương tự như các lệnh thao tác trong olly. mấy cái lệnh này tui ko dịch nhé, vì quá dễ mà:

    quote:
    ai
    --
    executes "animate into" in ollydbg
    example:
    ai

    an addr
    -------
    analyze module which contains the address addr.
    example:
    an eip // same as pressing ctrl-a

    ao
    --
    executes "animate over" in ollydbg
    example:
    ao
    rtr
    ---
    executes "run to return" in ollydbg
    example:
    rtr

    rtu
    ---
    executes "run to user code" in ollydbg
    example:
    rtu

    run
    ---
    executes f9 in ollydbg
    example:
    run


    sti
    ---
    execute f7 in ollydbg.
    example:
    sti


    sto
    ---
    execute f8 in ollydbg.
    example:
    sto
    esti
    ----
    executes shift-f7 in ollydbg.
    example:
    esti

    esto
    ----
    executes shift-f9 in ollydbg.
    example:
    esto
    ti
    --
    executes "trace into" in ollydbg
    example:
    ti

    ticnd cond
    ----------
    traces into calls until cond is true
    example:
    ticnd "eip > 40100a" // will stop when eip > 40100a

    to
    --
    executes "trace over" in ollydbg
    example:
    to

    tocnd cond
    ----------
    traces over calls until cond is true
    example:
    tocnd "eip > 40100a" // will stop when eip > 40100a
    pause
    -----
    pauses script execution. script can be resumed from plugin menu.
    example:
    pause




    tóm tắt các lệnh trên như sau: (để chúng ta dễ tra khi đọc code hay viết code cho script)

    quote:
    ai --------- ctrl-f7 : animate into
    an---------ctrl-a : analyze module
    ao---------ctrl-f8 : animate over
    rtr--------ctrl-f9 : run to return
    rtu-------alt-f9 : run to user code
    run---------f9 : run
    sti-----------f7: step into
    sto----------f8: step over
    esti---------shift-f7: giống như f7, nhưng nếu khi chương trình dừng lại trên một exception, thì olly bắt đầu thử chuyển exception đến handler được chỉ định trong chương trình.
    esto--------shift-f9: giống như f9, nhưng nếu khi chương trình dừng lại trên một exception, thì olly bắt đầu thử chuyển exception đến handler được chỉ định trong chương trình.
    ti------------ctrl-f11: trace into
    to-----------ctrl-f12: trace over
    ticnd------ctrl-f11 kết hợp với ctrl-t: trace into và set condition
    tocnd------ctrl-f12 kết hợp với ctrl-t: trace over và set condition
    pause--------f12 ; pause


    =================
    đến đây thì xin các bạn cho benina đi ngũ nhe. buồn ngũ quá rồi. hôm nào rãnh post tiếp.

    benina (5/10/2004)

    ---------------------------------------------------------------------------




    phần tiếp theo:

    xin lỗi trước các bạn, vì lỡ khui “thùng bia ollysrcipt” ra rồi thành thử ra phải nhậu cho hết, chứ benina quải quá, không có thời gian để mà nhậu. muốn gác kiếm rồi nhưng còn vương vấn sự đời nên lâu lâu cũng nhậu vài ba cái tut cho vui để có dịp nào thảnh thơi benina sẽ nhậu với các bạn mấy cái script này cho nó kỹ càng. còn bây giờ benina chỉ sắp xếp các cái lệnh script cho các bạn có hệ thống. đồng thời tóm tắt , và điểm sáng một số lệnh quan trọng để các bạn có khái niệm. benina sẽ ko dịch tòan bộ các lệnh này, vì thực ra cũng dễ dịch lắm. nếu bạn nào rãnh rỗi cứ dịch ra cho anh em thì rất tốt.



    viii-các lệnh giống trong asm:

    các lệnh này của script đều có trong tập lệnh asm, nên thật dễ dàng khi tiếp xúc các lệnh này.

    quote:
    add dest, src
    -------------
    adds src to dest and stores result in dest
    example:
    add x, 0f
    add eax, x
    add [401000], 5
    add y, " times" // if y was 1000 before this command then y is "1000 times" after it


    and dest, src
    -------------
    ands src and dest and stores result in dest
    example:
    and x, 0f
    and eax, x
    and [401000], 5

    dec var
    -------
    substracts 1 from variable
    example:
    dec v


    inc var
    -------
    adds 1 to variable
    example:
    inc v

    mov dest, src
    -------------
    move src to dest.
    src can be a long hex string in the format #<some hex numbers>#, for example #1234#.
    remember that the number of digits in the hex string must be even, i.e. 2, 4, 6, 8 etc.
    example:
    mov x, 0f
    mov y, "hello world"
    mov eax, ecx
    mov [ecx], #00dead00beef00#
    mov !cf, 1
    mov !df, !pf

    or dest, src
    -------------
    ors src and dest and stores result in dest
    example:
    or x, 0f
    or eax, x
    or [401000], 5
    shl dest, src
    -------------
    shifts dest to the left src times and stores the result in dest.
    example:
    mov x, 00000010
    shl x, 8 // x is now 00001000

    shr dest, src
    -------------
    shifts dest to the right src times and stores the result in dest.
    example:
    mov x, 00001000
    shr x, 8 // x is now 00000010


    sub dest, src
    -------------
    substracts src from dest and stores result in dest
    example:
    sub x, 0f
    sub eax, x
    sub [401000], 5


    xor dest, src
    -------------
    xors src and dest and stores result in dest
    example:
    xor x, 0f
    xor eax, x
    xor [401000], 5
    ---------------------------------------------------



    tóm lại: các lệnh sắp xếp trong mục này là:

    quote:
    add,sub, dec,inc, and,or,xor,shl,shr, mov



    ix-lệnh nhảy và lệnh so sánh:

    a>label(nhãn)

    trước hết phải nói về nhãn (label) vì lệnh nhảy lúc nào cũng liên quan đến label. trong ngôn ngữ lập trình cấp cao, khi ta muốn điều khiển một lệnh nhảy , nhảy đến 1 routine nào, thì ta phải khai báo trước routine đó một cái tên nhãn (label). lúc đó chương trình chúng ta mới biết đường mà nhảy . trong script, lables khai báo như sau:

    quote:
    labels
    ----------
    labels được định nghĩa bằng cách đặt dấu “:” sau một cái name.
    example:
    some_label:



    sau đây tui cũng xin giới thiệu với các bạn một lệnh định nhãn của script cho window cpu.
    trong tut “let’s cracking by olly” , tui có post về cách định một nhãn cho một dòng lệnh trong olly để khi nào ta muốn đến đó debug thì ta cho olly nhảy đến nhãn đó là xong. lệnh định nhãn trong olly là shotcut “:” . trong script, nó hổ trợ cho chúng ta thực hiện lệnh trên như sau:


    quote:
    lbl addr, text
    --------------
    inserts a label at the specified address
    example:
    lbl eip, "nicejump"



    b>compare (lệnh so sánh):

    như các bạn biết, lệnh so sánh lúc nào cũng đi chung với lệnh nhảy, nên tui sắp xếp chúng vào một mục.


    quote:
    cmp dest, src
    -------------
    compares dest to src. works like it's asm counterpart.
    example:
    cmp y, x
    cmp eip, 401000



    c>jumps(các lệnh nhảy):

    các lệnh nhảy trong script:


    quote:
    ja label
    --------
    use this after cmp. works like it's asm counterpart.
    example:
    ja some_label

    jae label
    ---------
    use this after cmp. works like it's asm counterpart.
    example:
    jae some_label

    jb label
    --------
    use this after cmp. works like it's asm counterpart.
    example:
    jb some_label

    jbe label
    ---------
    use this after cmp. works like it's asm counterpart.
    example:
    jbe some_label

    je label
    --------
    use this after cmp. works like it's asm counterpart.
    example:
    je some_label

    jmp label
    ---------
    unconditionally jump to a label.
    example:
    jmp some_label

    jne label
    ---------
    use this after cmp. works like it's asm counterpart.
    example:
    jne some_label

    ===============


    tóm lại: các lệnh trong mục này:

    quote:
    lables in file script;lbl;cmp;ja;jae;jb;jbe;je;jne;jmp



    x-lệnh patch thay đổi code :

    nó tương tự như các lệnh assemble (shotcut space), fill with nops, edit binary (ctrl-e):

    quote:
    asm addr, command
    -----------------
    assemble a command at some address.
    returns bytes assembled in the reserved $result variable
    example:
    asm eip, "mov eax, ecx"

    fill addr, len, value
    ---------------------
    fills len bytes of memory at addr with value
    example:
    fill 401000, 10, 90 // nop 10h bytes

    repl addr, find, repl, len
    --------------------------
    replace find with repl starting att addr for len bytes.
    wildcards are allowed
    example:
    repl eip, #6a00#, #6b00#, 10
    repl eip, #??00#, #??01#, 10
    repl 401000, #41#, #90#, 1f


    tóm lại: có 3 lệnh để patch:

    quote:
    asm,fill,repl




    xi-lệnh về breakpoint:

    trong script cũng cho ta lệnh set breakpoint. các bạn chú ý lệnh bp nó giống như set breakpoint toggle f2, và lệnh bphws , nó giống như lệnh bpm trong si. tức là set bp tại một address trong vùng nhớ , khi chương trình chạm đến vùng nhớ này, tùy theo mod đọc hay viết vào vùng nhớ này mà nó break chương trình


    quote:
    bc addr
    -------
    clear unconditional breakpoint at addr.
    example:
    bc 401000
    bc x
    bc eip

    bp addr
    --------
    set unconditional breakpoint at addr.
    example:
    bp 401000
    bp x
    bp eip

    bpcnd addr, cond
    ----------------
    set breakpoint on address addr with condition cond.
    example:
    bpcnd 401000, "ecx==1"

    bpl addr, expr
    --------------
    sets logging breakpoint at address addr that logs expression expr
    example:
    bpl 401000, "eax" // logs the value of eax everytime this line is passed

    bplcnd addr, expr, cond
    -----------------------
    sets logging breakpoint at address addr that logs expression expr if condition cond is true
    example:
    bplcnd 401000, "eax", "eax > 1" // logs the value of eax everytime this line is passed and eax > 1

    bpmc
    ----
    clear memory breakpoint.
    example:
    bpmc

    bphwc addr
    ----------
    delete hardware breakpoint at a specified address
    example:
    bphwc 401000

    bphws addr, mode
    ----------------
    set hardware breakpoint. mode can be "r" - read, "w" - write or "x" - execute.
    example:
    bphws 401000, "x"

    bprm addr, size
    ---------------
    set memory breakpoint on read. size is size of memory in bytes.
    example:
    bprm 401000, ff

    bpwm addr, size
    ---------------
    set memory breakpoint on write. size is size of memory in bytes.
    example:
    bpwm 401000, ff


    tóm tắt lệnh:

    quote:
    bc,bp,bpcnd,bpl,bplcnd,bpmc,bphwc,bphws,bprm,bpwm



    xii-lệnh về các hộp thọai:

    các lệnh liên quan đến việc cho hiển thị hộp đối thọai với srcipt.


    quote:
    ask question
    ------------
    displays an input box with the specified question and lets user enter a response.
    sets the reserved $result variable (0 if cancel button was pressed).
    example:
    ask "enter new eip"
    cmp $result, 0
    je cancel_pressed
    mov eip, $result


    msg message
    -----------
    display a message box with specified message
    example:
    msg "script paused"

    msgyn message
    -----------
    display a message box with specified message and yes and no buttons.
    sets the reserved $result variable to 1 if yes is selected and 0 otherwise.
    example:
    msgyn "continue?"



    tóm lại:

    quote:
    ask,msg,msgyn



    xiii-các lệnh dump:

    ứng dụng các lệnh này để ta viết 1 script có chức năng dump chương trình ra 1 file , mà ko cần dùng các phần mềm dump chuyên nghiệp. đặc biệt các bạn chú ý lệnh dump dpe


    quote:
    dm addr, size, file
    -------------------
    dumps memory of specified size from specified address to specified file
    example:
    dm 401000, 1f, "c:\dump.bin"

    dma addr, size, file
    -------------------
    dumps memory of specified size from specified address to specified file appending to that file if it exists
    example:
    dma 401000, 1f, "c:\dump.bin"

    dpe filename, ep
    ----------------
    dumps the executable to file with specified name.
    entry point is set to ep.
    example:
    dpe "c:\test.exe", eip


    tóm lại:

    quote:
    dm,dma,dpe



    xiv-các lệnh về tìm kiếm:

    các lệnh này rất quan trọng trong việc đọc tut mup, các bạn nên hiểu rõ các lệnh này. tui xin dịch các lệnh findop cho các bạn


    quote:
    find addr, what
    ---------------
    searches memory starting at addr for the specified value.
    when found sets the reserved $result variable. $result == 0 if nothing found.
    the search string can also use the wildcard "??" (see below).

    example:
    find eip, #6a00e8# // find a push 0 followed by some kind of call
    find eip, #6a??e8# // find a push 0 followed by some kind of call

    findop addr, what
    -----------------
    searches code starting at addr for an instruction that begins with the specified bytes.
    when found sets the reserved $result variable. $result == 0 if nothing found.
    the search string can also use the wildcard "??" (see below).
    example:
    findop 401000, #61# // find next popad
    findop 401000, #6a??# // find next push of something



    lệnh này có ý nghĩa như sau:
    tìm một chỉ thị lệnh bắt đầu với những bytes được chỉ định trong tham số what .địa chỉ bắt đầu tìm kiếm là địa chỉ addr . khi đã tìm xong, nó sẽ set kết quả địa chỉ dòng lệnh trong biến $result. nếu $result==0 tức là ko tìm thấy. khi tìm kiếm string cũng có thể dùng widcard “??”. xem các ví dụ trên
    lệnh này rất hay dùng trong các tut mup để tìm kiếm một dòng lệnh nào đó.
    chú ý: lệnh find và findop khác nhau ở chồ: find thì tìm trong memory cái gì đó còn findop thì tìm dòng lệnh code.

    tóm tắt các lệnh :

    quote:
    find,findop



    xv-các lệnh về liên quan đến log window:

    các lệnh sau can thiệp vào của sổ log trong olly (trong olly bạn nhấn button “l” trên thanh menu để cho hiển thị cửa sổ log.cửa sổ này ghi nhận lại những gì mà olly đã log trong quá trình thực thi chương trình.cửa sổ này cũng có thể ứng dụng trong filegen để tìm file lưu serial)


    quote:
    #log
    ----
    enables logging of executed commands.
    the commands will appear in ollydbg log window, and will be prefixed with -->
    example:
    #log

    ghi chú: lệnh này sẽ cho hiển thị các lệnh trong script mà nó đã thực thi trong cửa sổ log

    log src
    -------
    logs src to ollydbg log window.
    if src is a constant string the string is logged as it is.
    if src is a variable or register its logged with its name.
    example:
    log "hello world" // the string "hello world" is logged
    var x
    mov x, 10
    log x // the string "x = 00000010" is logged.


    tóm tắt:

    quote:
    #log, log



    xvi-các lệnh gets:

    các lệnh này chủ yếu để lấy thông tin nào đó từ dữ liệu ta cung cấp


    quote:
    gn addr
    -------
    gets the symbolic name of specified address (ex the api it poits to)
    sets the reserved $result variable
    example:
    gn 401000

    gpa proc, lib
    -------------
    gets the address of the specified procedure in the specified library.
    when found sets the reserved $result variable. $result == 0 if nothing found.
    useful for setting breakpoints on apis.
    example:
    gpa "messageboxa", "user32.dll" // after this $result is the address of messageboxa and you can do "bp $result".

    gmi addr, info
    --------------
    gets information about a module to which the specified address belongs.
    "info" can be modulebase, modulesize, codebase or codesize (if you want other info in the future versions plz tell me).
    sets the reserved $result variable (0 if data not found).
    example:
    gmi eip, codebase // after this $result is the address to the codebase of the module to which eip belongs



    tóm tắt:

    quote:
    các lệnh này mới rất hay. tui tóm tắt như sau
    gn: ứng dụng lấy tên của hàm api tại địa chỉ chỉ định
    gpa : ứng dụng lấy địa chỉ của một hàm api nào đó để đặt bp tại địa chỉ đó
    gmi: thấy thông tin về module mà eip(hay một adrr) đang trỏ. nhiều khi tử huyệt cần crack ko nằm trong file exe mà lại nằm trong file dll. ta ứng dụng lệnh này để lấy thông tin module





    xvii-các lệnh tranfer (dời thao tác)

    (dời sự thực thi của script đến một label nào đó trong trong file script):
    có 2 trạng thái cần phân biệt:
    -breakpoint (điểm ngắt trong olly): ngắt do người dùng ép buộc
    -exception (sự phản kháng của olly): ngắt do olly phản kháng.
    các lệnh này can thiệp vào 2 trạng thái ngắt ở trên. mục đích chính của các lệnh này là báo cho script biết, khi nào ngắt xảy ra thì rời ngắt thực thi tiếp (cob,coe) hay nhảy đến một đọan script nào đó thực thi tiếp(eob,eoe). vì vậy khi viết script, lệnh này đặt đâu cũng được miễn trước break mà ta dự tính sẽ xử lý.


    quote:
    eob label
    ---------
    transfer execution to some label on next breakpoint.
    example:
    eob some_label

    eoe label
    ---------
    transfer execution to some label on next exception.
    example:
    eob some_label
    cob
    ---
    makes script continue execution after a breakpoint has occured (removes eob)
    example:
    cob

    coe
    ---
    makes script continue execution after an exception has occured (removes eoe)
    example:
    coe



    tóm tắt:


    quote:
    eob,eoe,cob,coe



    xiii-các lệnh thực thi trong script:

    lệnh dễ và cũ , tui ko dịch , chỉ dịch các lệnh mới mà thôi


    quote:
    #inc file
    ---------
    includes a script file in another script file
    example:
    #inc "anotherscript.txt"
    cmt addr, text
    --------------
    inserts a comment at the specified address
    example:
    cmt eip, "this is the entry point"
    ret
    ---
    exits script.
    example:
    ret
    dbh
    ---
    hides debugger
    example:
    dbh

    dbs
    ---
    unhides debugger
    example:
    dbs



    eval
    ----
    mục đích: kết hợp một string với một giá trị đã tính tóan thành một string mới được set trong biến $result

    evaluates a string expression that contains variables.
    the variables that are declared in the current script can be enclosed in curly braces {} to be inserted.
    sets the reserved $result variable
    example:
    var x
    mov x, 1000
    eval "the value of x is {x}" // after this $result is "the value of x is 00001000"

    exec/ende
    ---------
    mục đích của các lệnh này là can thiệp vào trong quá trình thực thi của olly, như thay đổi giá trị thanh ghi, hay exit tiến trình thực thi.

    executes instructions between exec and ende in the context of the target process.
    values in curly braces {} are replaced by their values.
    example:
    // this does some movs
    var x
    var y
    mov x, "eax"
    mov y, "0deadbeef"
    exec
    mov {x}, {y} // mov eax, 0deadbeef will be executed
    mov ecx, {x} // mov ecx, eax will be executed
    ende
    // this calls exitprocess in the debugged application
    exec
    push 0
    call exitprocess
    ende
    ret

    go addr
    -------
    executes to specified address (like g in softice)
    example:
    go 401005


    integration with other plugins (tích hợp với một plugins khác)
    ---------------------------------
    you can call ollyscript from your plugin and make it execute a script.
    use something like the source code below:
    (bạn có thể gọi ollscript từ một plugin củ abạn và bắt nó thực thi một script .ta xử dụng hàm này

    hmodule hmod = getmodulehandle("ollyscript.dll");
    if(hmod) // check that the other plugin is present and loaded
    {
    // get address of exported function
    int (*pfunc)(char*) = (int (char*)) getprocaddress(hmod, "executescript");
    if(pfunc) // check that the other plugin exports the correct function
    pfunc("myscript.txt"); // execute exported function
    }



    tóm tắt:

    quote:
    #inc,cmt,ret,dbh,dbs, exec/ende,eval,go, hmodule


    đến đây là hết tut này. benina hy vọng qua tut này , các cracker sẽ viết rất nhiều script tuyệt đẹp.
    benina (9/10/2004)


    ------------------------------------------------------------------------------




    command line plugin




    welcome, sau một thời gian làm quen với olly hôm nay em xin giới thiệu với mọi người một plugin không kém phần quan trọng của olly , đó chính là plugin command line. mặc dù còn nhiều tính năng hạn chế nhưng plugin này cũng vẫn cung cấp cho chúng ta các chức năng đầy đủ mà một chương trình debug cần phải có. nhưng bù lại thì mã nguồn của plugin này là mở cho nên cho phép chúng ta add thêm bất kì câu lệnh mới nào vào đồng thời nó cũng cho phép chúng ta chỉnh sửa các chức năng của những câu lệnh đã có. bài viết này được dịch ra từ file help , mong rằng sẽ đáp ứng được phần nào thông tin , cũng như chức năng cơ bản của plugin này.

    như chúng ta đã biết , để gọi plugin này trong olly chúng ta dùng phím tắt sau : alt + f1. hiện tại theo tài liệu mà em có thì plugin này hỗ trợ những câu lệnh sau :

    1. expressions (biểu thức) :

    code:
    calc expression : tính toán giá trị của một biểu thức
    ? expression : tương tự như trên
    expression (kí tự đầu tiên không được là chữ cái) : tương tự như trên
    watch expression : theo dõi, quan sát một biểu thức
    w expression : tương tự2. assignments (gán) :

    code:
    set reg=expression : ghi giá trị của biểu thức vào thanh ghi chung 8, 16, hay 32 bits
    reg=expression : tương tự
    set memory=expression : ghi giá trị của biểu thức vào bộ nhớ 8 , 16, hay 32 bits3. disassembler :

    code:
    at expression : theo dõi địa chỉ trong cửa sổ disassembler
    follow expression : tương tự
    orig : đi tới thanh ghi eip hiện tại
    * : tương tự4. dump and stack :

    code:
    d expression : theo một địa chỉ trong cửa sổ dump
    dump expression : tương tự
    da [expression] : dump theo dạng assembler
    db [expression] : dump ở dạng byte (hexa)
    dc [expression] : dump dưới dạng ascii text
    dd [expression] : dump dưới dạng địa chỉ (áp dụng cho stack)
    du [expression] : dump theo dạng unicode text
    dw [expression] : dump ở dạn word (hexa)
    stk expression : lần theo một địa chỉ trong stack5. assembling :

    code:
    a expression [,command] : assemble tại một địa chỉ6. labels and comments (các lệnh liên quan đến nhãn và chú thích):

    code:
    l expression, label : gán nhãn cho một địa chỉ
    c expression, comment : gán chú thích tại một địa chỉ7. breakpoint commands (các lệnh liên quan đến việc đặt bp trong olly):

    code:
    bp expression [,condition] : đặt breakpoint int3 tại địa chỉ
    bpx label : đặt breakpoint lên tất cả các hàm call
    bc expression : xóa điểm đặt bp tại địa chỉ
    mr expression1 [,expression2] : đặt một bp là memory on access trên một phạm vi nào đó
    mw expression1 [,expression2] : đặt một bp là memory on write trên một phạm vi nào đó
    md : xóa điểm đặt bp memory
    hr expression : đặt 1-byte bp có dạng hardware on access lên một địa chỉ
    hw expression : đặt 1-byte bp có dạng hardware on write lên một địa chỉ
    he expression : đặt một bp có dạng hardware on execute lên một địa chỉ
    hd [expression] : xóa điểm đặt hardware bp tại một địa chỉ8. tracing commands (các lệnh liên quan đến việc trace code trong olly):

    code:
    stop : tạm dừng sự thi hành
    pause : tương tự
    run : chạy chương trình
    g [expression] : chạy chương trình đến một địa chỉ nào đó
    ge [expression] : bỏ qua các ngoại lệ để điều khiển và chạy đến một địa chỉ nào đó

    s : nhảy vào trong một hàm
    si : tương tự
    so : nhảy qua một hàm
    t [expression] : trace vào trong một hàm đến một địa chỉ nào đó
    ti [expression] : tương tự
    to [expression] : trace qua một hàm đến một điạh chỉ nào đó
    tc condition : trace vào trong một hàm đến một điều kiện nào đó
    toc condition : trace qua một hàm đến một điều kiện nào đó
    tr : thực thi cho đến khi return
    tu : thực thi cho đến đoạn user code9. ollydbg windows (các lệnh liên quan đến cửa sổ):

    code:
    log : xem cửa sổ log
    mod : xem cửa sổ executable
    mem : xem cửa sổ memory
    cpu : xem cửa sổ cpu
    cs : xem cửa sổ call stack
    brk : xem cửa sổ break points
    opt : xem cửa sổ options10. miscellaneous commands (các lệnh khác):

    code:
    exit : đóng ollydbg
    quit : tương tự
    open [filename] : mở một file để debug (executable file or dll)
    close : đóng chương trình đang debug
    rst : restart lại chương trình đang debug
    help : mở cửa help của plugin command line
    help ollydbg : mở cửa sổ help của olly
    help apifunction : mở cửa sổ help của hàm api
    các lệnh dùng trong plugin command line không phân biệt chữ hoa và chữ thường , các tham số trong ngoặc vuông là những tùy chọn. các biểu thức có thể bao gồm các hằng số, các thanh ghi và các tham chiếu bộ nhớ , bên cạnh đó nó còn hỗ trợ tất cả các phép tính số học cơ bản và các boolean function. theo mặc định thì tất cả các hằng số đều ở dạng hexa. để biểu diễn các hằng số về dạng decimal , đi kèm nó là dấu thập phân. ví dụ :


    code:
    1. 2 + 2 : tính toán giá trị của biểu thức (cộng ở kiểu hexa);

    2. 2.0 + 2.0 : tính toán giá trị của biểu thức (cộng ở kiểu thập phân);

    3. at [eax+10] : disassemble tại địa chỉ mà địa chỉ này là nội dung của dw mem tại địa chỉ eax + 0x10;

    4. bp kernel32.getprocaddress : đặt một bp lên hàm api . chú ý bạn có thể đặt một bp trong file dll hệ thống , nhưng chỉ đối với các hệ điều hành nt;

    5. bpx getprocaddress : đặt bp lên tất cả các lệnh gọi hàm api getprocaddress;

    6. bp 412010,eax==wm_close : đặt một conditional bp tại địa chỉ 0x412010. chương trình sẽ dừng lại khi mà giá trị của eax = wm_close;
    kienmanowar(rea – crackerteam) – 05/01/2005

    "nguồn hvaonline"

  3. #3
    Ngày tham gia
    Nov 2015
    Bài viết
    2
    phiền chủ top vừa nghe nhạc vừa đọc =))
    phải nói là rất dài đấy

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •