FzzrRW 2017-01-04 15:43 采纳率: 88.9%
浏览 912
已采纳

有人能看懂这段代码吗,他是怎么改变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的

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-01-04 15:52
    关注

    堆栈上有函数的返回地址,通过故意越界的地址强行改写,当函数清栈退出的时候,就自动会将esp设置为这个返回地址(已经被改写)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样