calcMemAlign_for_mprotect
来源:互联网 发布:淘宝的鞋子是正品吗 编辑:程序博客网 时间:2024/06/05 14:18
前言
mprotect调用时,开始地址和块大小都要内存对齐
记录
// fnTest_mprotect.cpp : Defines the entry point for the console application.//#include "stdafx.h"#ifndef PAGESIZE#define PAGESIZE 4096#endif// mprotect调用时,开始地址要内存对齐, size也要是PAGESIZE的倍数bool calcMemAlign_for_mprotect(unsigned long ulDataAddr, int iDataLen, int* piDataAddrAlign, int* piDataLenAlign) { // ulDataAddr 必须是无符号数, 防止bit31为1的地址计算的不对 int iMod_DataLenTotal = 0; int iMod_Page = 0; int iDataLenTotal = 0; int iPageCnt = 0; if ((NULL == piDataLenAlign) || (NULL == piDataLenAlign)) { return false; } iMod_Page = (ulDataAddr % PAGESIZE); *piDataAddrAlign = ulDataAddr - iMod_Page; // 找到内存地址对齐A iDataLenTotal = iDataLen + (ulDataAddr % PAGESIZE); // 从A开始要改变多少size的内存属性 iMod_DataLenTotal = iDataLenTotal % PAGESIZE; // 从A开始要改变几页 iPageCnt = (iDataLenTotal - iMod_DataLenTotal) / PAGESIZE + ((iMod_DataLenTotal > 0) ? 1 : 0); *piDataLenAlign = iPageCnt * PAGESIZE; return true;}int main(int argc, char* argv[]){ int iDataAddr = 0; int iDataLen = 0; int iDataAddrAlign = 0; int iDataLenAlign = 0; // test case printf("----------------------------------------\r\n"); iDataAddr = 0xafe4; iDataLen = sizeof(int); if (calcMemAlign_for_mprotect(iDataAddr, iDataLen, &iDataAddrAlign, &iDataLenAlign)) { printf("iDataAddr = 0x%x, iDataLen = 0x%x\r\n", iDataAddr, iDataLen); printf("iDataAddrAlign = 0x%x, iDataLenAlign = 0x%x\r\n", iDataAddrAlign, iDataLenAlign); } // test case printf("----------------------------------------\r\n"); iDataAddr = 0xaffe; iDataLen = sizeof(int); if (calcMemAlign_for_mprotect(iDataAddr, iDataLen, &iDataAddrAlign, &iDataLenAlign)) { printf("iDataAddr = 0x%x, iDataLen = 0x%x\r\n", iDataAddr, iDataLen); printf("iDataAddrAlign = 0x%x, iDataLenAlign = 0x%x\r\n", iDataAddrAlign, iDataLenAlign); } // test case printf("----------------------------------------\r\n"); iDataAddr = 0xaffe; iDataLen = 0x1234; if (calcMemAlign_for_mprotect(iDataAddr, iDataLen, &iDataAddrAlign, &iDataLenAlign)) { printf("iDataAddr = 0x%x, iDataLen = 0x%x\r\n", iDataAddr, iDataLen); printf("iDataAddrAlign = 0x%x, iDataLenAlign = 0x%x\r\n", iDataAddrAlign, iDataLenAlign); } // test case printf("----------------------------------------\r\n"); iDataAddr = 0xb6f06fe0; iDataLen = 0x4; if (calcMemAlign_for_mprotect(iDataAddr, iDataLen, &iDataAddrAlign, &iDataLenAlign)) { printf("iDataAddr = 0x%x, iDataLen = 0x%x\r\n", iDataAddr, iDataLen); printf("iDataAddrAlign = 0x%x, iDataLenAlign = 0x%x\r\n", iDataAddrAlign, iDataLenAlign); } // test case printf("----------------------------------------\r\n"); iDataAddr = 0xb6f06fe0; iDataLen = 0x24; if (calcMemAlign_for_mprotect(iDataAddr, iDataLen, &iDataAddrAlign, &iDataLenAlign)) { printf("iDataAddr = 0x%x, iDataLen = 0x%x\r\n", iDataAddr, iDataLen); printf("iDataAddrAlign = 0x%x, iDataLenAlign = 0x%x\r\n", iDataAddrAlign, iDataLenAlign); } // test case printf("----------------------------------------\r\n"); iDataAddr = 0xb6f06fe0; iDataLen = 0x1024; if (calcMemAlign_for_mprotect(iDataAddr, iDataLen, &iDataAddrAlign, &iDataLenAlign)) { printf("iDataAddr = 0x%x, iDataLen = 0x%x\r\n", iDataAddr, iDataLen); printf("iDataAddrAlign = 0x%x, iDataLenAlign = 0x%x\r\n", iDataAddrAlign, iDataLenAlign); } /* run result ---------------------------------------- iDataAddr = 0xafe4, iDataLen = 0x4 iDataAddrAlign = 0xa000, iDataLenAlign = 0x1000 ---------------------------------------- iDataAddr = 0xaffe, iDataLen = 0x4 iDataAddrAlign = 0xa000, iDataLenAlign = 0x2000 ---------------------------------------- iDataAddr = 0xaffe, iDataLen = 0x1234 iDataAddrAlign = 0xa000, iDataLenAlign = 0x3000 ---------------------------------------- iDataAddr = 0xb6f06fe0, iDataLen = 0x4 iDataAddrAlign = 0xb6f06000, iDataLenAlign = 0x1000 ---------------------------------------- iDataAddr = 0xb6f06fe0, iDataLen = 0x24 iDataAddrAlign = 0xb6f06000, iDataLenAlign = 0x2000 ---------------------------------------- iDataAddr = 0xb6f06fe0, iDataLen = 0x1024 iDataAddrAlign = 0xb6f06000, iDataLenAlign = 0x3000 */ return 0;}
修改内存属性的例子
// 修改内存属性 int iAddrObj = (int)0x12345678; // 0x12345678 is object mem addr int iAddrMyFun = (int)0x87654321; // 0x87654321 is my fun int iAddrBeginAlign = 0; int iDataLenAlign = 0; if (calcMemAlign_for_mprotect(iAddrObj, sizeof(int), &iAddrBeginAlign, &iDataLenAlign)) { printf("calcMemAlign_for_mprotect ok\r\n"); if (0 == mprotect((void*)iAddrBeginAlign, iDataLenAlign, PROT_WRITE | PROT_READ)) { printf("mprotect ok\r\n"); *(int*)iAddrObj = (int)iAddrMyFun; printf("modify mem ok\r\n"); // arrived here } }
ModifyMemFunAddr
对calcMemAlign_for_mprotect再封装一下,去改内存中的地址
bool ModifyMemFunAddr(int iMemAddr, int iAddrMyFun, int* piAddrOldFun) { // 修改内存属性 bool bRc = false; int iAddrBeginAlign = 0; int iDataLenAlign = 0; int iRc = 0; do { if (NULL == piAddrOldFun) { break; } if (!calcMemAlign_for_mprotect(iMemAddr, sizeof(int), &iAddrBeginAlign, &iDataLenAlign)) { break; } iRc = mprotect((void*)iAddrBeginAlign, iDataLenAlign, PROT_WRITE | PROT_READ); if (0 != iRc) { printf("* mprotect error, iRc = 0x%x\r\n\r\n", iRc); showErrno(); break; } *piAddrOldFun = *(int*)iMemAddr; *(int*)iMemAddr = (int)iAddrMyFun; bRc = true; } while (0); return bRc;}
ModifyMemFunAddr调用例子
int iAddrOldFun = 0;int iAddrObjMemory = xx;int iAddrNewFun = xxx;if (ModifyMemFunAddr(iAddrObjMemory, iAddrNewFun, &iFunOldAddr)) { // when task over // maybe used iFunOldAddr to restore memory content by ModifyMemFunAddr again. printf("my fun replaced ok\r\n"); break; }
0 0