程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 線程-有人能看懂這段代碼嗎,他是怎麼改變esp的 坐等大牛

線程-有人能看懂這段代碼嗎,他是怎麼改變esp的 坐等大牛

編輯:編程解疑
有人能看懂這段代碼嗎,他是怎麼改變esp的 坐等大牛
 #include "stdio.h"
#include "conio.h"
#include "windows.h"

char Msg[] = "Hello C++! I Love you forever!";

int __stdcall RelocThread(int Param)
{
    int Addr = 0;
    char *pMsg = NULL;
    if (!Param)
    {
        Addr = ((int(__stdcall*)(void))RelocThread)();
        Addr = 5 + Addr + *(int*)(Addr + 1);
        pMsg = (char*)(Addr + (int)&Msg - (int)&RelocThread);

        printf("In RelocThread:\n");
        printf("I can Found My start address myself=0x%08X\nand Global Value Msg=0x%X\n", Addr, pMsg);
        printf("%s\n", pMsg);

        ExitThread(0);
    }
    return (*(int*)((int)&Param - 4)) - 5;
}

void main(void)
{
    HANDLE hThread = CreateRemoteThread(GetCurrentProcess(), NULL, 0, (LPTHREAD_START_ROUTINE)RelocThread, 0, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);
    printf("In function main:\nRelocThread=0x%08X,Msg=0x%08X\n", RelocThread, Msg);
    getch();
}


他是怎麼改變esp的

最佳回答:


堆棧上有函數的返回地址,通過故意越界的地址強行改寫,當函數清棧退出的時候,就自動會將esp設置為這個返回地址(已經被改寫)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved