Rất cám ơn anh Moon. Bài viết thật hay . Hôm nay benina cũng mới tìm ra 1 cách đặt breakpoint và áp dụng cho pp stack trong W32dasm. Benina xin trình bày như sau: Lấy ví dụ 1 của anh moon: Homepage: http://www.audio-recorder.net/ Sost: Audio Recorder Deluxe v2.2.36 Crack file: ard.exe Bắt đầu nhe: -Open chương trình arg.exe trong W32Dasm. -Vào Menu Debug của W32dasm chọn Debuger Option, Chọn 2 dòng : Debug Only This Process Display Program Generrated Exceptions -Sau đó chọn Load Process trong menu Debug, (Hay chọn Ctrl-L) để tải chương trình vào bộ nhớ. -Khi đó sẽ xuất hiện 2 cửa sổ : benina gọi tắt là "Cửa sổ trái" và "Cửa sổ phải". (Các bạn tự tìm hiểu 2 cửa sổ này nhe, có trong Help hết đó).Còn cửa sổ chính của W32Dasm tui gọi tắt là "Cửa sổ chính" -Sau khi W32Dasm load chương trình vào bộ nhớ thì tạm dừng tại dòng lệnh Entry point (Nhìn cửa sổ bên phải ta biết được điều này). Do đó các hàm API chương trình sử dụng đã load vào bộ nhớ rồi. -Click vào cửa sổ chính, chọn Button Imports. -Sẽ xuất hiện cửa sổ "W32Dasm Alphabetical List of Imported Functions" chứa List các hàm "nhập khẩu" , chắc chắn có các hàm API đã load vào trong bộ nhớ mà chương trình chuẩn bị sử dụng. -Tìm hàm USER32.MessageBoxA trong list. -Bước này là bước đặt breakpiont cho W32Dasm: DClick vào hàm USER32.MessageBoxA.trong cửa sổ "W32Dasm Alphabetical List of Imported Functions" . Trong cửa sổ chính vệt sáng sẽ nhảy đến dòng lệnh gọi hàm USER32.MessageBoxA đầu tiên, Click vào dòng sáng trong cửa sổ chính , Ấn F2 để đánh dấu breakpoint tại đó. Sau đó về lại cửa sổ "W32Dasm Alphabetical List of Imported Functions" ,DClick vào hàm USER32.MessageBoxA tiếp để đánh dấu breakpoint cho tất cả lệnh gọi hàm USER32.MessageBoxA trong chương trình. (Chương trình này có 3 điểm breakpoint gọi hàm USER32.MessageBoxA). -Sau khi đặt xong các breakpoint ,để cho khỏi rối mắt các bạn đóng cửa sổ "W32Dasm Alphabetical List of Imported Functions" lại -Tiếp tục ta click cửa sổ bên phải để thao tác run và trace chương trình. Đầu tiên, ta chọn vào mục "Enable Documented API Details" để khi chương trình ngắt tại điểm breakpoint thì sẽ hiện ra cho chúng ta biết các giá trị trong hàm API khi bị ngắt. Ấn F9 chạy chương trình. Ô là la, Chương trình ngắt tại điểm ngắt đầu tiên gọi hàm USER32.MessageBoxA và hiện ra cửa sổ "W32Dasm API Details" có nội dung như sau: API int Arg00 = MessageBoxA(Arg01,Arg02,Arg03,Arg04) API Address=0049939C, API Return Address=004993A2 Arg01 = (HWND) 0002041e (Window"") Arg02 = (LPCTSTR) 004e6758 -> "Incorrect code" Arg03 = (LPCTSTR) 004e6448 -> "Help" Arg04 = (UINT) 00000030 Các bạn thấy gì chưa . Cái này giống của anh Moon nè : Arg02 = (LPCTSTR) 004e6758 -> "Incorrect code" -Bây giờ chúng ta xoá hết các breakpoint đã đặt . Đầu tiên ta Pause chương trình bằng cách ấn vào nút Pause ở cửa sổ phải. Sau đó, Click vào cửa sổ bên trái.Phía bên phải ở giữa có chử BPts , phía dưới là list các điểm breakpoint đã đặt (Tui gọi cửa sổ này là cửa sổ List Breakpoint). Click vào button DA để bỏ qua các điểm breakpoint đã đánh dấu (Muốn xoá thì click vào button Clear). -Sau đó click vào cửa sổ chính của W32Dasm. Di chuyển vệt sáng đến: :004993A2 5E pop esi Nhấn F2 , breakpoint tại điểm này (Giống cách của anh Moon) -Tiếp tục ,Click vào cửa sổ phải , Ấn F9 chạy chương trình, sau do den chuong trinh an nut OK,W32Dasm sẽ ngắt tại điểm ngắt ta đặt ở trên: Ta đang ở đây trong cửa sổ chính: :004993A2 5E pop esi Làm như anh Moon , Ấn F8 để trace cho qua RET thì dừng lại tại điểm này: * Possible StringData Ref from Data Obj ->"Help" | :0041B20C 6848644E00 push 004E6448 * Possible StringData Ref from Data Obj ->"Hmbnqqdbs bncd" | :0041B211 6858674E00 push 004E6758 * Referenced by a (U)nconditional or ©onditional Jump at Address: |:0041B1D7(U) | :0041B216 E859E10700 call 00499374 * Referenced by a (U)nconditional or ©onditional Jump at Address: |:0041B19A© | :0041B21B 68007F0000 push 00007F00 đang ở dây :0041B220 6A00 push 00000000 Các bạn có thấy dòng này giống anh Moon không * Possible StringData Ref from Data Obj ->"Hmbnqqdbs bncd" | :0041B211 6858674E00 push 004E6758 Đến đây thì Bén nina đi bú sữa đây. Cách này có 1 số nhược điểm, các bạn tự tìm hiểu nhe BENINA 11/8/2004. BÀI NÀY BENINA TẶNG RIÊNG CHO FORUM NÀY ĐỂ CHÀO MỪNG NGÀY RA MẮT FORUM Armadillo 3.x part 1 version2 por Tk0017 Benina dịch General Information Program UltraEdit®/UltraEdit®-32 - v10.20d Protection Armadillo 3.x [ CodeSplicing + IAT Scrambler ] Tools LordPE Deluxe, ImpRec 1,6, OllyDbg 1,10, ArmTools 0,1, HexWorkshop 4,23, Notepad and Calculadora Difficulty Insignificant Benina dịch "to give atoms him" This it will be a brief tutorial and with few images; it is a simple explanation of like using the ArmTools tool. Đây là một tut vắn tắt với vài hình ảnh, chủ yếu là nghiên cứu cách sử dụng ArmTools We began executing our file uedit32.exe, once loaded we opened the LordPE and we see that single uedit32.exe is a process, with which we discarded nanomites and the CopyMemII. Chúng ta bắt đầu chạy file uedit32.exe, nó được tải vào vùng nhớ và đang thực thi, chúng ta mở LordPE và sẽ thấy chỉ có 1 process đơn của file uedit32.exe, vậy nó ko có nanomites và CopyMemII Let us look for the OEP of ours app, load it in the Olly, we hide dbg, we go to the window Memory Map and put a F2 [ Break-on-Access ] in the section Chúng ta hảy tìm OEP của app (ứng dụng), load nó vào Olly, chúng ta hide dbg, và goto đến window Memory Map của Olly, put F2 [ Break-on-Access ] vào section như hình: Memory map Address Size Owner Section Contains Type Access Initial 00400000 00001000 uedit32 PE header Imag R RWE 00401000 0015D000 uedit32 .text Imag R RWE 0055E000 00039000 uedit32 .rdata Imag R RWE 00597000 0004A000 uedit32 .data Imag R RWE 005E1000 00001000 uedit32 .SHARED data Imag R RWE 005E2000 00030000 uedit32 .text1 code Imag R RWE 00612000 00010000 uedit32 .adata code Imag R RWE 00622000 00020000 uedit32 .data1 imports Imag R RWE 00642000 00110000 uedit32 .pdata Imag R RWE 00752000 0006F000 uedit32 .rsrc resources Imag R RWE We give a F9 and one stops here Nhấn F9 và ngừng tại đây: 00604940 |. 8945 08 MOV DWORD PTR SS:[EBP+8],EAX 00604943 |> 837D 10 08 /CMP DWORD PTR SS:[EBP+10],8 00604947 |. 0F82 6E010000 |JB uedit32.00604ABB 0060494D |. 8B4D 0C |MOV ECX,DWORD PTR SS:[EBP+C] 00604950 |. 33D2 |XOR EDX,EDX 00604952 |. 8A11 |MOV DL,BYTE PTR DS:[ECX] 00604954 |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 00604957 |. 33C2 |XOR EAX,EDX 00604959 |. 25 FF000000 |AND EAX,0FF 0060495E |. 8B4D 08 |MOV ECX,DWORD PTR SS:[EBP+8] 00604961 |. C1E9 08 |SHR ECX,8 00604964 |. 8B1485 0C6A6200 |MOV EDX,DWORD PTR DS:[EAX*4+626A0C] If we observed in the state bar [ 00401000 says "Break-on-Access when reading ]" and what we want in "they when executing" so that is not our OEP, if realize in direction 00604943 more becomes a verification and soon a jump to a direction of memory very under the listing is made, if we followed this code we will see that it is a curl that finishes in Chúng ta quan sát thanh state dưới Olly [ 00401000 says "Break-on-Access when reading "], chúng ta chỉ muốn ngừng khi “executing “(chứ ko phải “reading”như tại đây) vì lúc đó chính là OEP mà chúng ta cần tìm, và chỉ thị tại 00604943 là chỉ thị thẩm tra để nhảy đến 1 direction nằm xa phía dưới list code của chúng ta. Nếu chúng ta dò theo lệnh nhảy đó, chúng ta sẽ thấy rằng có 1 vòng lặp kết thúc tại chỉ thị mà jump nhảy đến. 00604AB0 |. 83E9 08 |SUB ECX,8 00604AB3 |. 894D 10 |MOV DWORD PTR SS:[EBP+10],ECX 00604AB6 |.^E9 88FEFFFF \JMP uedit32.00604943 00604ABB |> 837D 10 00 CMP DWORD PTR SS:[EBP+10],0 00604ABF |. 74 3C JE SHORT uedit32.00604AFD . 00 400 000 00 0 01 0 00 uedit32 PE header Imag R RWE 00 4 01 0 00 0 015 D 000 uedit32 .text Imag R RWE 00 55E 000 00 03 900 0 uedit32 .rdata Imag R RWE 00 59 700 0 00 04A 000 uedit32 .data Imag R RWE 00 5E 100 0 00 0 01 0 00 . 00 5E 100 0 00 0 01 0 00 uedit32 .SHARED data Imag R RWE 00 5E 200 0 00 0 300 00 uedit32 .text1 code Imag R RWE 00 612 00 0 00 01 0 00 0 uedit32 .adata code Imag R RWE 00 62 200 0 00 0 200 00 uedit32 .data1 imports. (U)nconditional or ©onditional Jump at Address: | :00 41B19A© | :00 41B21B 6 800 7F 000 0 push 00 007 F 00 đang ở dây :00 41B2 20 6A 00 push 00 000 000 Các bạn có thấy dòng này giống anh Moon không