Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Phần mềm 4Gb patch cho 32bit App. How Do They Do It?

  1. #1
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Thumbs down Phần mềm 4Gb patch cho 32bit App. How Do They Do It?

    Hôm trước mình lượn web kiếm đc phần mềm cho phép 32bit App sử dụng trên 2Gb trên Win 64bit. Mình tò mò và đã tìm hiểu cách hoạt động của nó. Hôm nay chia sẻ với anh em.

    Mục đích chính của bài viết là phát triển phần mềm. Nó cũng chả to lớn gì, nhưng mong bạn nào leech thì ghi nguồn.

    Các bạn có thể down phần mềm ở phần đính kèm.
    Ngắn gọn vậy thôi , bây h ta đi trả lời câu hỏi How do they do it ?

    Sau khi load phần mềm vào OllyDbg , ta trace đến đoạn này
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		1.PNG
Lần xem:	14
Size:		17.4 KB
ID:		8285


    Nó có nhiệm vụ sau :
    Visual C++ Code:
    1.   EAX = GetOpenFileNameW( &Local_149 ) ; // 4011CE , 4011DD , 4011FA
    2.   if( EAX != 0 ) // GetOpenFileNameW thành công. 401200 , 401202
    3.   {          
    4.               4gb_patch.00401087 ( &Local_149 ) ; // 401209 , 40120F , 401210
    5.   }
    6.   return;

    Bên trong hàm 4gb_patch.00401087 :
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		2.PNG
Lần xem:	3
Size:		3.9 KB
ID:		8286

    Đoạn từ 4010A1 đến 4010AD có nhiệm vụ thêm “.Backup” vào cuối chuỗi Local_149 và lưu chuỗi mới vào Local_132.

    Visual C++ Code:
    1. Local_132 = strcat(&Local_149 , L“.Backup) ;


    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		3.PNG
Lần xem:	4
Size:		6.1 KB
ID:		8287

    Đoạn trên có nhiệm vụ tạo file backup :

    Visual C++ Code:
    1. CopyFileW( &Local_149 , &Local_132 , TRUE) ; // ARG.1 là tham số vào của hàm 4gb_patc.00401087 và cũng là Local_149.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		4.PNG
Lần xem:	3
Size:		9.0 KB
ID:		8296

    Đoạn trên có nhiệm vụ mở file đã chọn :

    Visual C++ Code:
    1. hFile  = CreatFileW( &Local_149 , GENERIC_READ|GENERIC_WRITE , FILE_SHARE_READ , NULL , OPEN_EXISTING , NORMAL , NULL);

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		5.PNG
Lần xem:	2
Size:		3.5 KB
ID:		8288

    Visual C++ Code:
    1. DWORD dwFileSize = GetFileSize( hFile , NULL );

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		6.PNG
Lần xem:	5
Size:		18.5 KB
ID:		8289

    Đoạn trên có nhiệm vụ so sánh dwFileSize với 8000h , nếu <= 8000h thì lấy nó làm Size để cấp phát luôn, còn > 8000h thì chỉ cấp phát Size = 8000h thôi. ( 8000h bytes = 32 kb ).

    Visual C++ Code:
    1. VirtualAlloc( NULL, Size , MEM_COMMIT , PAGE_READWRITE ) ;
    2. ReadFile (hFile , Buffer , Size , &pBytesRead , NULL );

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		7.PNG
Lần xem:	0
Size:		5.4 KB
ID:		8290

    Visual C++ Code:
    1. SetFilePointer( hFIle , 0 , NULL , FILE_BEGIN );

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		11.PNG
Lần xem:	2
Size:		3.0 KB
ID:		8297

    Đoạn trên có nhiệm vụ sau:
    Lúc đó , EDI = 3F0000 ,là còn trỏ Buffer do hàm VirtualAlloc cấp phát và đã được ghi vào bởi hàm ReadFile. Vậy EDI = 3F0000 là điểm khởi đầu của File đã chọn.
    Chuyển 4 bytes từ EDI + 3C = 3F003C vào EAX . Để hiểu được đoạn này cần có hiểu biết về PE file format.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		PEFigure1.jpg
Lần xem:	4
Size:		38.5 KB
ID:		8293

    IMAGE_DOS_HEADER là cấu trúc nằm ở trên cùng 1 PE file.
    Cấu trúc nó có dạng:


    DOS File Code:
    1. ->DOS Header
    2.     e_magic:     0x5A4D  
    3.     e_cblp:      0x0090  
    4.     e_cp:        0x0003  
    5.     e_crlc:      0x0000  
    6.     e_cparhdr:   0x0004  
    7.     e_minalloc:  0x0000  
    8.     e_maxalloc:  0xFFFF  
    9.     e_ss:        0x0000  
    10.     e_sp:        0x00B8  
    11.     e_csum:      0x0000  
    12.     e_ip:        0x0000  
    13.     e_cs:        0x0000  
    14.     e_lfarlc:    0x0040  
    15.     e_ovno:      0x0000  
    16.     e_res:       0x0000000000000000  
    17.     e_oemid:     0x0000  
    18.     e_oeminfo:   0x0000  
    19.     e_res2:      0x0000000000000000000000000000000000000000  
    20.     e_lfanew:    0x000000E0

    Cấu trúc này có kích cỡ 64 bytes, 3C = 60 sẽ trỏ tới e_lfanew , giá trị DWORD này là offset để tới IMAGE_NT_HEADER. => EAX sẽ chứa điểm khởi đầu của IMAGE_NT_HEADER sau khi + EDI.

    DOS File Code:
    1. ->File Header  
    2.     Machine:               0x014C  (I386)  
    3.     NumberOfSections:      0x0003  
    4.     TimeDateStamp:         0x3B7D8476  (GMT: Fri Aug 17 20:54:14 2001)  
    5.     PointerToSymbolTable:  0x00000000  
    6.     NumberOfSymbols:       0x00000000  
    7.     SizeOfOptionalHeader:  0x00E0  
    8.     Characteristics:       0x010F
    9.                            (RELOCS_STRIPPED)  
    10.                            (EXECUTABLE_IMAGE)  
    11.                            (LINE_NUMS_STRIPPED)  
    12.                            (LOCAL_SYMS_STRIPPED)  
    13.                            (32BIT_MACHINE)

    Trừ 4 bytes của Signature ta còn 22 ( 16h ) – 4 = 18. Từ điểm khởi đầu của cấu trúc

    IMAGE_FILE_HEADER + 18 = Characteristics.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		9.PNG
Lần xem:	4
Size:		8.8 KB
ID:		8294
    Lúc đó Characteristics = 10Fh tương ứng với các thông số như trên.
    Chương trình sẽ cho Characteristics = Characteristics OR 20h = 12Fh sẽ có các thông số sau :


    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		10.PNG
Lần xem:	2
Size:		8.7 KB
ID:		8295

    Vậy nó thêm thông số Large address aware.
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		8.PNG
Lần xem:	6
Size:		9.6 KB
ID:		8291

    Visual C++ Code:
    1. WriteFile(hFile , Buffer, Size , &BytesWritten , NULL ) ;
    2. CloseHandle(hFile);

    Tuyệt , nó thêm mỗi cờ Large address aware là có thể cho phép 32bit App sử dụng memory như 64bit App ? Why ?

    Bài viết chỉ trả lời câu hỏi How ? và phần của các bạn là trả lời Why ?
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 25-11-2011 lúc 03:18 PM.

  2. #2
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Đây là một option khi build ứng dụng, đại khái nếu cờ này được bật thì hệ điều hành cho phép sử dùng 4 GB bộ nhớ ảo (virtual address space) trên windows 64-bit, thay vì mặc định là 2GB. Đây là tùy chọn, nên đa phần khi build, các trình biên dịch không bật cờ này, bạn có thể bật nó lên lúc build

    tham khảo :

    Ref Links Code:

Các đề tài tương tự

  1. ADO.NET Set value patch cho combobox
    Gửi bởi yetikun trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 04-05-2013, 08:01 PM
  2. Bài tập C Cộng, trừ, nhân, chia hai số nhị phân dấu chấm động 32bit
    Gửi bởi babychip1506 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 15-04-2011, 04:25 PM
  3. Học cách viết .patch cho Makefile ?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình shell Linux
    Trả lời: 2
    Bài viết cuối: 17-02-2011, 11:10 AM
  4. Cần tìm patch vs 1 cho VS 2005 tren Win 7 x 64
    Gửi bởi trilan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-11-2010, 09:45 PM
  5. [C#] Get the patch of Process
    Gửi bởi Jaychen trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 14-12-2007, 11:01 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn