Hì hì, nếu trên file .exe thì cuối phần trên coi như đã xong. Giờ nếu bạn thử rename file DLL lại cho giống tên file gốc và chạy Unikey.exe xem nó có load ngon lành hay ko? Hoặc là ko thấy gì, hoặc là crash. Nhưng tốt nhất bạn đừng cố chạy làm gì, mắc công phải restart máy đó. Giờ xin mượn tài liệu PE File mà anh Kiên đã dịch để giải thích 2 khái niệm. Thứ nhất là : Nên nhớ lúc nãy ta Dump tại ImageBase 870000, fix Import cũng từ đó, nên cần chỉnh ImageBase lại cho đúng như khi dump. Mở LordPE lên, PE Editor, chọn file vừa fix Import khi nãy : Sửa thành 870000: Nhấn Save ,close LordPE, coi như fix xong ImageBase. Tuy nhiên file vẫn chưa run tốt, ta đến với khái niệm thứ 2: ImageBase: địa chỉ nạp được tiên cho PE File. Lấy ví dụ : Nếu như giá trị trong trườ ng này là 400000h, PE Loader sẽ cố gắng nạp file vào trong không gian địa chỉ ào mà bắt đầu tại 400000h. Từ “được ưu tiên” ở đây có nghĩa là PE Loader không thể nạp file tại địa chỉ đó nếu như có một module nào khác đã chiếm giữ vùng địa chỉ này. 99 % các trường hợp giá trị của ImageBase luôn là 400000h Trong các packer ,đa số đều compress/encrypt Relocation của file lại. Nhưng ở Armadillo, nó ko làm điều đó, nó chỉ thay thế bằng một Relocation khác để dành cho packer. Đó chính là section .reloc1. Còn section chứa relocation ban đầu là .reloc lại ko bị encrypt bất cứ cái gì. Khi pack file .exe, Armadillo vẫn để relocation là section .reloc , nhưng với dll, nó lại dùng section .reloc1. Nên ta cần fix lại cho đúng relocation của file dll sau khi unpack. Giờ dùng Olly, load file sau khi fix lại. Mở memory map: Ta thấy rằng, với Olly mà ta dùng unpack , File này luôn được load ở ImageBase 870000. Quay trở lại main UPC. Enter hàm Call thứ 3 dưới OEP, ta thấy lời gọi CALL [IAT ] lúc này chính xác : Giữ nguyên đó, load thêm file vào một “Olly cá biệt” . Ở đây tricky chọn Olly của diablo, các bạn có thể lên home của lão ta mà down về. Tại sao cá biệt ,vì nó luôn load file dll vào ImageBase khác với các Olly kia : Base Relocations Section : Khi mà trình linker tạo ra một file Exe, nó chuẩn bị một nơi mà tại đó file sẽ được ánh xạ vào trong bộ nhớ . Dựa trên điều này, trình linker sẽ đặt các địa chỉ thật của đoạn mã và những mục dữ liệ u vào trong file thực thi. Nếu vì bất cứ lý do gì file thực thi kết thúc quá trình nạp ở một nơi nào đó nế u không trong phạm vi không gian địa chỉ ảo , thì những địa chỉ này sẽ bị trình linker đặ t vào trong image không đúng. Thông tin được lưu trong Section .reloc cho phép trình PE loader fix những địa chỉ này trong loaded image vì vậy chúng sẽ lại chính xác. Mặt khác, nếu trình loader có thể nạp file tại những địa chỉ base address được thừa nhận bởi trình linker ,thì dữ liệu ở Section .reloc là không cần thiết và bị lờ đi. ImageBase = 8C0000. Từ OEP, lại enter hàm call thứ 3, ta thấy CALL[IAT] lúc này đã sai bét : Dựa vào lời giải thích ở khái niệm Relocation, chắc các bạn đã hiểu tại sao ? ImageBase lúc này đã khác, nhưng vì Relocation bị sai nên nó ko load IAT vào đúng vị trí . Khi ta chạy file mà ko có Olly, ImageBase lúc đó lại khác, IAT ko được load đúng nơi, nên file sẽ ko chạy, hoặc chạy nhưng bị lỗi .Okie, close Olly của diablo đi. Quay lại Olly kia, chọn PE Header trong Memory map : Đó là phần DOS Signature. Kéo xuồng cho tới khi thấy thêm thông tin này ở PE Header: Ta thấy địa chỉ của Relocation là 94000 + 870000 = 904000, tức là nơi load section .reloc1 : Giờ ta phải fix địa chỉ quay về đúng Relocation gốc của file. Double Click vào section .reloc : Đó chính là phần dữ liệu của Relocation gốc. Vậy địa chỉ bắt đầu là tại 8A1000. Ta cũng nhớ lúc đầu cho cho ArmInline redirect IAT vào phần trống trong section này, cả ImportREC nữa. Nên kéo xuống cho tới chỗ đã redirect : Phần tô xanh là nơi đã redirect IAT. Vậy các byte ở trên chính là nơi kết thúc của Relocation : Relocation cũng lấy length giống IAT. Lấy theo các nhóm DWORD (4 bytes), và trừ cho nơi bắt đầu. Ở đây nơi kết thúc là 8A2D27, nên phải lấy 8A2D28 - 8A1000= 1D28. Lưu ý: địa chỉ bắt đầu và size của Relocation phải tuyệt đối chính xác, nếu sai có thể gây lỗi khá nặng khi chạy file, vì file sẽ bị load đè lên các module khác trong memory. Ta có thể fix lại trong Olly, nhưng dùng LordPE cho tiện. Close Olly đi, mở LordPE PE Editor (mở file fix): Chọn Directories : Ta fix lại RVA = 8A1000 – IamgeBase:870000 = 31000. Size = 1D28. Save file. Giờ xem file đã rename thành UKHook40.dll chưa ? Nếu rồi thì chạy Unikey.exe. Nó load ngon lành . Lưu ý: một số bản Unikey cũ như 4 beta, nếu bạn ko fix relocation mà dùng UPX(hay vài packer khác ) pack file dll lại cho size giảm đi. Chạy Unikey.exe, nó có thể load DLL suôn sẻ. Ở đây đừng hiểu lầm là có check file size. Vì UPX vô tình tìm đúng Relocation gốc và encrypt nó lại. Do đó mà chạy ko . Chọn Directories : Ta fix lại RVA = 8A 100 0 – IamgeBase:8 700 00 = 3 10 00. Size = 1D28. Save file. Giờ xem file đã rename thành UKHook 40. dll chưa ? Nếu rồi thì chạy Unikey.exe. Nó load. thông tin này ở PE Header: Ta thấy địa chỉ của Relocation là 9 400 0 + 8 700 00 = 904 000 , tức là nơi load section .reloc1 : Giờ ta phải fix địa chỉ quay về đúng Relocation gốc của file Lấy ví dụ : Nếu như giá trị trong trườ ng này là 400 000 h, PE Loader sẽ cố gắng nạp file vào trong không gian địa chỉ ào mà bắt đầu tại 400 000 h. Từ “được ưu tiên” ở đây có nghĩa là PE Loader