C++逆向之基本数据类型的表现形式

实验环境为VS2015
#include <stdio.h>

void decodeOprand()
{
    /*
    00C91650  push        ebp
    00C91651  mov         ebp,esp
    00C91653  sub         esp,0C0h              // 默认提高堆栈的大小为C0h;在x86系统中,内存是小端存储方式
    00C91659  push        ebx
    00C9165A  push        esi
    00C9165B  push        edi
    00C9165C  lea         edi,[ebp-0C0h]
    00C91662  mov         ecx,30h
    00C91667  mov         eax,0CCCCCCCCh        // 填充为0CCCCCCCCh,防止中间出现问题,如果出现问题则可以及时的产生中断,以便调试器可以接收到中断
    00C9166C  rep stos    dword ptr es:[edi]
    */

    // 防止被和谐
    // 00C9166E  mov         dword ptr [i],0  
    // 去掉 右键->显示符号名后可以看到
    // 00C9166E  mov         dword ptr [ebp-8],0  
    // 可以证明i <=> ebp-8;即我们声明的变量符号i,在汇编中代表的是地址ebp-8;也可以看出来是栈变量;即局部变量为栈变量
    // 第一个变量的起始地址为ebp-8;
    // int i = 0;   

    // 00F41A75  mov         dword ptr [ebp - 14h], 2
    // 增长的幅度为 0x14h - 0x08h = 0Ch;
    // int b = 2;
    // int c = 3;

    char a = 1;
    // char d = 4;
    // short b = 2;
    int c = 3;
    // short e = 5;

    // 相同的差0Ch,不同之间差0Fh
    // short和int之间是一样的,只是对地址的解释不一样
    // short是将从[]地址解释为word大小;int是将从[]地址解释为dword大小
    // 以有符号整数进行解释
    // 在分析过程中其实无需知道到底是哪个,只需要知道每个内存单元的功能,以及怎么解释的即可
}

void decodePointer()
{
    int nVar = 0x12345678;
    int* pnVar = &nVar;
    char* pcVar = (char*)&nVar;
    short* psnVar = (short*)&nVar;

    printf("%08x \r\n", *pnVar);
    printf("%08x \r\n", *pcVar);
    printf("%08x \r\n", *psnVar);
}

void decodePointerOperator()
{
    // cVar 代表的是数组的第一个数据的首地址 
    // __cdecl调用约定,参数传递为从右到左;调用方负责清理堆栈
    // 00834B48  mov         byte ptr [ebp-10h],1 
    char cVar[5] = { 0x01,0x23,0x45,0x67,0x89 };

    // 01194B5C  lea         eax,[ebp-10h]  
    // 01194B5F  push        eax
    printf("%x\r\n", cVar);
    int* pnVar = (int*)cVar;
    char* pcVar = (char*)cVar;
    short* psnVar = (short*)cVar;

    /*
    00C34B6E  mov         eax,dword ptr [ebp-1Ch]
    00C34B71  add         eax,4
    00C34B74  mov         dword ptr [ebp-1Ch],eax

    00C34B77  mov         eax,dword ptr [ebp-28h]
    00C34B7A  add         eax,1
    00C34B7D  mov         dword ptr [ebp-28h],eax

    00C34B80  mov         eax,dword ptr [ebp-34h]
    00C34B83  add         eax,2
    00C34B86  mov         dword ptr [ebp-34h],eax
    */

    // 首地址 + sizeof(指针type) * n;
    pnVar += 1;
    pcVar += 1;
    psnVar += 1;

    // 每加一个*就是在这个指针的type上减掉一个星

    int a = 1;
    int* i = &a;
    int** pI = &i;
    int*** pPi = &pI;
    int**** p = &pPi;

    /*
    01054C89  mov         eax,dword ptr [ebp-70h]
    // 下面是*的操作,有几句就是几颗*
    01054C8C  mov         ecx,dword ptr [eax]
    01054C8E  mov         edx,dword ptr [ecx]
    01054C90  mov         eax,dword ptr [edx]
    01054C92  mov         ecx,dword ptr [eax]
    */

    printf("%x\r\n",****p);

    // * 的运用:假设int**** p = (int****)&nVar; 那么***p == nVar;
}

void usePointer()
{
    // 要修改被const限制的局部变量i
    const int i = 10;

    int* pnI = (int*)&i;
    *pnI = 20;
    
    // 在内存中其实已经改了,但是为什么输出的还是10呢
    // 答案是常量传播,看反汇编即可明确
    /*
    008B4B64  push        0Ah
    008B4B66  push        8B6C0Ch
    008B4B6B  call        008B1352
    */
    // 经由常量传播,直接吧0Ah传递给了printf函数
    printf("%d %d\r\n",i,*pnI);
}
int main()
{
    decodeOprand();
    decodePointer();
    decodePointerOperator();

    usePointer();
    getchar();
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • 引言 前面一篇简单的总结了下入门Kotlin的第一步——配置开发环境引入Kotlin库,接下来正式踏入Kotlin...
    CrazyMO_阅读 1,575评论 1 0
  • 黑夜里毫无睡意 听到窗外雨滴滴答答声 还有那蛐蛐叽叽咋咋的叫个不停 起身推窗探头 路灯在秋雨的敲打中 显得有些柔弱...
    溪水映月阅读 470评论 11 39