日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1.API的调用过程(3环部分)

發布時間:2025/3/20 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.API的调用过程(3环部分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Application Programming Interface,簡稱API函數。

主要是存放在C:\WINDOWS\system32下面所有的dll

幾個重要的DLL

  • Kernel32.dll:最核心的功能模塊,比如管理內存、進程和線程相關的函數等…
  • User32.dll:是Windows用戶界面相關應用程序接口,如創建窗口和發送消息等.
  • GDI32.dll:全稱是Graphical Device Interface(圖形設備接口),包含用于畫圖和顯示文本的函數比如要顯示一個程序窗口,就調用了其中的函數來畫這個窗口.
  • Ntdil.dll:大多數API都會通過這個DLL進入內核(0環).

絕大多數的api都是在0環實現的(極少數是在3環),3環只是提供的一個接口

下面我們來看看ReadProcessMemory這個api函數

打開IDA:C:\WINDOWS\system32\Kernel32.dll拖進去,Alt+T搜索ReadProcessMemory

參數壓棧后它調用了另外一個函數,返回結果就是eax,小于0的話跳到下面這


那個Call是BaseSetLastNTError函數設置完錯誤號清0eax又跳回去


跳到這直接返回了所以失敗返回的是0


如果eax不小于0,eax清0,eax+1,返回1

會發現這個api好像沒干什么事情,其實功能都在NtReadVirtualMemory里了
但這個函數數并不是Kernel32.dll提供的(一般看見紫色函數名就不是一個模塊的)

打開導入表可看到它來自ntdll,接下來我打開ntdll找到這個函數。


只是提供一個操作碼,一個方式進入0環,3環想進入0環都要提供一個操作碼,真正讀內存這個函數是在0環實現的。

我們來重寫3環的接口,這樣可以防止別人對我們的程序下api斷點,hook檢測之類的。

#include<windows.h> #include<stdio.h>void __declspec(naked) read(HANDLE hProcess,LPVOID addr,LPVOID buffer,DWORD len) {_asm{mov eax, 115hmov edx, 7FFE0300hcall dword ptr[edx]ret} }int main(int argc, char* argv[]) {HWND hwnd = FindWindow(L"#32770",L"驅動加載工具 V1.3版");DWORD pid;GetWindowThreadProcessId(hwnd,&pid);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);DWORD val = 0;read(hProcess,(LPVOID)0x001D6EBC,&val,4);printf("val: %d", val);getchar();return 0; }

總結

以上是生活随笔為你收集整理的1.API的调用过程(3环部分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。