OllyDbg笔记-修改Messagebox的标题
目錄
?
基本概念
實例
?
基本概念
調(diào)試逆向分為動態(tài)分析和靜態(tài)分析;
動態(tài)分析:使用調(diào)試工具加載程序并且運行,隨著程序運行調(diào)試者可以隨時中斷目標(biāo)指令流程。
靜態(tài)分析:很多不方便的場合運行軟件。
OD(OllyDbg):動態(tài)調(diào)試工具;
IDA Pro:靜態(tài)調(diào)試工具
OD相關(guān)的快捷鍵:
| F2 | 下斷點,也就是指定斷點的地址 |
| F3 | 加載一個可執(zhí)行程序,進行調(diào)試分析 |
| F4 | 程序執(zhí)行到光標(biāo)處 |
| F5 | 縮小、還原當(dāng)前窗口 |
| F7 | 單步步入 |
| F8 | 單步步過 |
| F9 | 直接運行程序,遇到斷點處,程序暫停 |
| Ctrl+F2 | 重新運行程序到起始處,一般用于重新調(diào)試程序 |
| Ctrl+F9 | 執(zhí)行到函數(shù)返回處,用于跳出函數(shù)實現(xiàn) |
| Alt+F9 | 執(zhí)行到用戶代碼處,用于快速跳出系統(tǒng)函數(shù) |
| Ctrl+G | 輸入十六進制地址,快速定位到該地址處 |
?
實例
這里不研究遠程線程注入,在此直接把基址固定,
設(shè)置如下:
使用VS2012編寫如下代碼:
#include <windows.h> #include <iostream> #include <string> using namespace std;int WINAPI WinMain (HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow) {while(1){MessageBoxA(NULL, "World", "Hello", 0);}return 0; }這里先使用OD修改標(biāo)題:
從這里可以看到,在匯編里面,一個函數(shù)的參數(shù)入棧,剛好是相反的。
原始運行截圖如下:
這里直接進入0041CC7C地址就可以了。這里
修改為:
讓他跑起來:
這個就是OD的基本做法,下面來寫個程序去改!
這里有個知識點,就是有些進程頁是只讀的,不能修改,可以使用VirtualProtectEx這個函數(shù)改變其屬性如下,把一個只讀的改成可讀可寫的,但注意最后要改回來
DWORD dwPrev;if(!VirtualProtectEx(hProcess, (LPVOID)(offset - 0x1), 10, PAGE_EXECUTE_READWRITE, &dwPrev)){cout << "VirtualProtectEx failed " << GetLastError() << " " << dwPrev << endl;getchar();return 0;}.... .... .... ....if(!VirtualProtectEx(hProcess, (LPVOID)(offset), DWORD(sizeof(title)), dwPrev, &dwPrev)){cout << "VirtualProtectEx failed 2" << GetLastError() << " " << dwPrev << endl;getchar();return 0;}這樣其標(biāo)題就是空白的了
完整代碼如下:
#include <iostream> #include <windows.h> #include <string> #include <Psapi.h> using namespace std;int main(int argc, int *argv[]){HWND hwnd = FindWindowA(nullptr, "Hello");if(!hwnd){getchar();return 0;}DWORD pid = 0;GetWindowThreadProcessId(hwnd, &pid); //獲取進程標(biāo)識if (pid == 0){cout << "GetWindowThreadProcessId failed" << endl;getchar();return 0;}HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);if(hProcess == NULL){cout << "OpenProcess failed" << endl;getchar();return 0;}DWORD offset = 0x0041CC7C;BYTE value[5] = {0};DWORD dwSize;DWORD title = 0x0;//if(ReadProcessMemory(hProcess, (LPVOID)offset, &value, sizeof(value) / sizeof(value[0]), &dwSize) == 0){// cout << "modify failed" << endl;// cout << value << endl;//}//else{// cout << "read : " << value << endl;//}DWORD dwPrev;if(!VirtualProtectEx(hProcess, (LPVOID)(offset - 0x1), 10, PAGE_EXECUTE_READWRITE, &dwPrev)){cout << "VirtualProtectEx failed " << GetLastError() << " " << dwPrev << endl;getchar();return 0;}if(WriteProcessMemory(hProcess, (LPVOID)offset, &title, DWORD(sizeof(title)), nullptr) == 0){cout << "failed" << endl;cout << GetLastError() << endl;getchar();return 0;}else{cout << "Finished" << endl;cout << value << endl;}if(!VirtualProtectEx(hProcess, (LPVOID)(offset), DWORD(sizeof(title)), dwPrev, &dwPrev)){cout << "VirtualProtectEx failed 2" << GetLastError() << " " << dwPrev << endl;getchar();return 0;}CloseHandle(hProcess);getchar();return 0; }項目打包下載地址:
https://github.com/fengfanchen/CAndCPP/tree/master/HackMessageBox
總結(jié)
以上是生活随笔為你收集整理的OllyDbg笔记-修改Messagebox的标题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL工作笔记-使用JPA映射mys
- 下一篇: html写界面,C++|Qt后台处理业务