首页
社区
课程
招聘
[原创]从逆向工程的角度来看C++ (五)
发表于: 2009-5-1 12:19 4818

[原创]从逆向工程的角度来看C++ (五)

2009-5-1 12:19
4818

进入本次正题:

                                 (五)[  C++ 之 I/O流操作  ]

由于这一章东西比较多, 现在仅仅弄一点点开个头, 以后在慢慢扩充.

////cpp://

// Lesson5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>

int main(int argc, char* argv[])
{
int i;
__asm int 3
cin>>i;
float f;
cin>>f;
char c;
cin>>c;
char buf[100];
cin>>buf;

cout<<"i="<<i<<endl;
cout<<"buf="<<buf<<endl;
cout<<flush;
cout<<hex<<"0x"<<i<<endl;

return 0;
}

////Dasm

00401070 > 55              push ebp
00401071    8BEC            mov ebp,esp
00401073    81EC B0000000   sub esp,0B0
00401079    53              push ebx
0040107A    56              push esi
0040107B    57              push edi
0040107C    8DBD 50FFFFFF   lea edi,dword ptr ss:[ebp-B0]
00401082    B9 2C000000     mov ecx,2C
00401087    B8 CCCCCCCC     mov eax,CCCCCCCC
0040108C    F3:AB           rep stos dword ptr es:[edi]
0040108E    90              nop
0040108F    8D45 FC         lea eax,dword ptr ss:[ebp-4]
00401092    50              push eax                                 ; >>的参数
00401093    B9 80464300     mov ecx,offset Lesson5.cin               ; ecx传 cin符号.
00401098    E8 F3E20000     call Lesson5.istream::operator>>         ; 被重载的>>
0040109D    8D4D F8         lea ecx,dword ptr ss:[ebp-8]
004010A0    51              push ecx
004010A1    B9 80464300     mov ecx,offset Lesson5.cin
004010A6    E8 E5E10000     call Lesson5.istream::operator>>
004010AB    8D55 F4         lea edx,dword ptr ss:[ebp-C]
004010AE    52              push edx
004010AF    B9 80464300     mov ecx,offset Lesson5.cin
004010B4    E8 67E10000     call Lesson5.istream::operator>>
004010B9    8D45 90         lea eax,dword ptr ss:[ebp-70]
004010BC    50              push eax
004010BD    B9 80464300     mov ecx,offset Lesson5.cin
004010C2    E8 19DB0000     call Lesson5.istream::operator>>
004010C7    68 14104000     push Lesson5.00401014                    ; endl的地址.
004010CC    8B4D FC         mov ecx,dword ptr ss:[ebp-4]
004010CF    51              push ecx                                 ; i
004010D0    68 28E04200     push Lesson5.0042E028                    ; ASCII "i="
004010D5    B9 40464300     mov ecx,offset Lesson5.cout              ; 又是把cout给ecx
004010DA    E8 B1C90000     call Lesson5.ostream::operator<<         ; 继续调用重载
004010DF    8BC8            mov ecx,eax                              ; 呵呵, 这里直接把返回值给ecx,继续输出
004010E1    E8 8AC60000     call Lesson5.ostream::operator<<
004010E6    8BC8            mov ecx,eax                              ; 同上
004010E8    E8 18FFFFFF     call Lesson5.00401005
004010ED    68 14104000     push Lesson5.00401014
004010F2    8D55 90         lea edx,dword ptr ss:[ebp-70]
004010F5    52              push edx
004010F6    68 20E04200     push Lesson5.0042E020                    ; ASCII "buf="
004010FB    B9 40464300     mov ecx,offset Lesson5.cout
00401100    E8 8BC90000     call Lesson5.ostream::operator<<
00401105    8BC8            mov ecx,eax
00401107    E8 84C90000     call Lesson5.ostream::operator<<
0040110C    8BC8            mov ecx,eax
0040110E    E8 F2FEFFFF     call Lesson5.00401005
00401113    68 32104000     push Lesson5.00401032
00401118    B9 40464300     mov ecx,offset Lesson5.cout
0040111D    E8 E3FEFFFF     call Lesson5.00401005
00401122    68 14104000     push Lesson5.00401014
00401127    8B45 FC         mov eax,dword ptr ss:[ebp-4]
0040112A    50              push eax
0040112B    68 1CE04200     push Lesson5.0042E01C                    ; ASCII "0x"
00401130    68 0F104000     push Lesson5.0040100F
00401135    B9 40464300     mov ecx,offset Lesson5.cout
0040113A    E8 E4FEFFFF     call Lesson5.00401023
0040113F    8BC8            mov ecx,eax
00401141    E8 4AC90000     call Lesson5.ostream::operator<<
00401146    8BC8            mov ecx,eax
00401148    E8 23C60000     call Lesson5.ostream::operator<<
0040114D    8BC8            mov ecx,eax
0040114F    E8 B1FEFFFF     call Lesson5.00401005
00401154    33C0            xor eax,eax
00401156    5F              pop edi
00401157    5E              pop esi
00401158    5B              pop ebx
00401159    81C4 B0000000   add esp,0B0
0040115F    3BEC            cmp ebp,esp
00401161    E8 4A030000     call Lesson5._chkesp
00401166    8BE5            mov esp,ebp
00401168    5D              pop ebp
00401169    C3              retn

////Release 差不多了, 就不贴了.

小结:>> 和<< 还有很多都是运算符重载, 再重载调用前, 先把>>后面的参数压栈,

再将cin或cout的地址放到ecx中去, 然后调用被重载的>>函数 .

PS:这一章东西蛮多, 像cin ,cout 等I/O 输入输出在Win32 Gui程序中也用不到,

        这一章就以后再扩充吧.

//今天3.26 晚8 点. 来补充一点.

C++的标准库不带.h的. 带.h的是旧的标准库, 已被某某委员会抛弃了.

但是新的标准库因为在名字空间std中(这是为了防止名字污染), 所以我们要显示的指定名字空间. 而使用旧的则不需要指定名字空间. 如:

#include <iostream>

#include <string>

#include <vector>

using namespace std;

...

旧的:

#include <iostream.h>

#include <string.h>

/....

来看看C++标准库的一些内置数据类型:

string: 这个也是以类的形式实现的. string str("test"); string str2(str); string str; 这三种方式都是利用string的构造函数进行赋值的.
string str ="test" ; 这是利用运算符重载进行赋值的.

const char *cstr = str.c_str(); 返回c字符数组. 必须是const.

vector : 这个是以模板和类的形式实现的.下一节具体分析.


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//