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
原创粉丝点击