Thứ Tư, 31 tháng 7, 2013

Application Programming Interfaces

Một application programming interface (API) là một tập hợp functions mà hệ điều hành tạo sẵn cho các chương trình ứng dụng. Nếu bạn muốn reverse dưới windows, điều bắt buộc là bạn phải bồi dưỡng cho mình kiến thức vững vàng về Windows API và các phương thức phổ biến để làm một vài thứ sử dụng APIs.

The Win32 API

Tôi đảm bảo một điều rằng bạn đã được nghe về Win32 API. Win32 là một tập hợp rất lớn các hàm mà tạo nên giao diện chính thức cấp thấp  cho Windows applications. Ban đầu khi Windows được giới thiệu, một số lượng lớn chương trình thực sự được phát triển sử dụng Win32 API, dần dần Microsoft giới thiệu các giao diện đơn giản, cấp cao hơn mà có thể thực hiện hầu hết các đặc tính được cung cấp bởi Win32 API. Một trong những interfaces phổ biến đó là MFC (Microsoft Foundation Classes), đó là một hệ thống cấp bậc của C objects mà có thể được sử dụng cho việc giao tiếp với Windows. Ban đầu, MFC sử dụng Win32 API cho việc gọi vào trong OS. Ngày nay, Microsoft thúc đẩy việc chuyển qua sử dụng .NET Framework cho việc phát triển các ứng dụng Windows. 

.NET framework sử dụng System class cho việc truy nhập các dịch vụ của hệ điều hành, những gì một lần nữa là một interface vào trong Win32 API.

Nguyên nhân cho sự tồn tại của các lớp cao hơn đó là Win32 không thực sự thân thiện với programmer. Nhiều operations yêu cầu việc gọi một chuỗi các hàm, thường yêu cầu khởi tạo các cấu trúc dữ liệu lớn và các cờ. Nhiều programmer đã nhanh chóng trở nên thất vọng khi sử dụng Win32 API. Các lớp cao hơn làm thuận tiện cho việc sử dụng, nhưng chúng cũng gây ảnh hưởng đến hiệu suất, bởi vì mọi lời gọi đến OS phải đi qua các lớp cao. Thỉnh thoảng các lớp cao thường thực hiện rất ít và tại một lúc khác chúng chứa một số lượng code đóng vai trò bắc cầu.

Nếu bạn đang dự định reversing các ứng dụng Windows, một điều quan trọng là bạn phải hiểu Win32 API. Đó là bởi vì bất kể giao diện cấp cao nào mà ứng dụng employ , cuối cùng nó cũng sử dụng Win32 API cho việc giao tiếp với OS. Một vài ứng dụng sẽ sử dụng native API, nhưng điều đó khá hiếm.

Core Win32 API chứa gần 200 APIs (nó phụ thuộc vào phiên bản của windows và có hay không undocumented Win32 APIs). Các APIs được chia thành 3 loại: Kernel, USER, GDI.
Figure 3.3 shows mối quan hệ giữa Win32 interface DLLs, NTDLL.DLL, và kernel components.


Những thứ được liệt kê dưới đây là các thành phần quan trọng của Win32 API:

  • Kernel APIs (còn được gọi BASE APIs) được implemented trong KERNEL.DLL module và bao gồm tất cả các dịch dụ không liên quan đến GUI, ví dụ như là file I/O, memory management, process and thread management, ... KERNEL32.DLL thường gọi native APIs thấp hơn từ NTDLL.DLL để implement các dịch vụ khác nhau. Kernel APIs được sử dụng để tạo và làm việc với kernel-level objects ví dụ như files, synchronization objects, ... tất cả được implemted trong system's object manager. 
  • GDI APIs được implemented trong GDI32.DLL và bao gồm các dịch vụ đồ họa cấp thấp ví dụ như vẽ một đường thẳng, hiển thị một bitmap, ... GDI nói chung không được biết về sự tồn tại của windows và controls. GDI APIs được implemented chủ yếu trong kernel, bên trong WIN32K.SYS module. GDI APIs tạo ra system calls tới WIN32K.SYS để implement hầu hết APIs. GDI xoay quanh GDI objects được sử dụng cho drawing objects, ví dụ như device contexts, brushes, pens, ... Những đối tượng này không bị quản lý bởi kernel's object manager. 
  • USER APIs được implemented trong USER32.DLL module và bao gồm tất cả các dịch vụ cấp cao liên quan đến GUI ví dụ như window-management, menus, dialog boxes, user-interface controls,... Tất cả GUI objects được vẽ bởi USER sử dụng GDI calls để thực hiện các hành động vẽ thực sự; USER phụ thuộc chặt chẽ vào GDI để thực hiện công việc của nó. USER APIs xoay quanh các đối tượng liên quan đến user-interface như là windows, menus, những thứ giống như vậy. Các đối tượng này không bị quản lý bởi kernel's object manager. 
The Native API 

Native API là interface thực sự với Windows NT system. Trong Windows NT Win32 API chỉ là một lớp nằm phía trên native API. Bởi vì NT kernel không có gì phải làm với GUI, native API không bao gồm bất cứ dịch vụ liên quan đến đồ họa nào. Native API là direct interface tới Windows kernel, cung cấp interfaces cho việc giao tiếp trực tiếp với memory manager, I/O system, object manager, processes và threads, ...

Các chương trình ứng dụng không bao giờ phải gọi trực tiếp tới native API - có thể phá vỡ tính tương thích của ứng dụng đó trong Window9x. Đó là một trong những lý do tại sao Microsoft không bao giờ document nó; các chương trình ứng dụng được mong đợi chỉ sử dụng Win32 APIs cho việc giao tiếp với hệ thống. Ngoài ra, bởi việc không làm lộ ra native API giữ lại sự tự do để thay đổi và revise nó mà không ảnh hưởng đến Win32 applications. 

Thỉnh thoảng việc gọi hoặc đơn thuần là hiểu một native API là quan trọng, trong những trường hợp có thể reverse implementation của nó để hiểu mục đích thực sự của nó. 

Về mặt kĩ thuật, native API là một tập hợp các hàm được exported từ cả NTDLL.DLL (cho user-mode callers) và từ NTOSKRNL.EXE (cho kernel-mode callers). APIs trong native API luôn luôn bắt đầu một trong 2 prefixes: hoặc là Nt hoặc là Zw , vì vậy các hàm có tên giống như NtCreateFile hoặc ZwCreateFile.

 

Không có nhận xét nào:

Đăng nhận xét