nichkhun 发表于 2012-4-2 23:28:36

天书夜读逆向开始读书笔记02

我写的代码对源代码稍微做了点修饰,这样想自己好表达一些, 而且方便深入点。// tsyd01.cpp : Defines the entry point for the console application.// #include "stdafx.h"#include <iostream>                                  //增加1个输出输入流的头文件 myfunction(double a, double b)                   //来分析这个函数{       double c = a + b;       return c;} int main(int argc, char* argv[]){              double Number1, Number2;                //定义2个变量       std::cout << "Please enter the two numbers add up !\n\n";          //输入提示语              std::cin >> Number1 >>Number2;      //接收2个变量              std::cout << "Number1 + Number2 = " << myfunction(Number1,Number2);    //输入函数              std::cin.ignore(100, '\n');                     //停止一会,看下结果       std::cin.get();       return 0;}VC反汇编 我们的myfunction函数1:    // tsyd01.cpp : Defines the entry point for the console application.2:    //3:4:    #include "stdafx.h"5:    #include <iostream>               //增加1个输出输入流的头文件6:7:    myfunction(double a, double b)          //来分析这个函数8:    {00401A50   push      ebp                  //保存ebp00401A51   mov         ebp,esp         //把esp保存到ebp中,这样esp和ebp都是栈顶00401A53   sub         esp,48h            //esp往上开辟一段空间,来存储我们的局部变量00401A56   push      ebx                  //保存ebx, esi, edi00401A57   push      esi00401A58   push      edi00401A59   lea         edi,   //取(局部变量)的地址,取局部变量地址保存00401A5C   mov         ecx,12h          00401A61   mov         eax,0CCCCCCCCh00401A66   rep stos    dword ptr    //上面的都写入int 3中断9:      double c = a + b;00401A68   fld         qword ptr       //压一个浮点数入栈 b00401A6B   fadd      qword ptr    //加上另一个浮点数, 这里面应该有一个隐含的装载过程00401A6E   fst      qword ptr             //float的强制转换. 这里它另外使用了内存10:       return c;00401A71   call      __ftol (0040b43c)11:   }00401A76   pop         edi                  //返回我们的推栈,操作还原00401A77   pop         esi00401A78   pop         ebx00401A79   mov         esp,ebp         //还原栈顶00401A7B   pop         ebp00401A7C   ret在看下main函数这个和第一篇的main函数开头是一样的13:   int main(int argc, char* argv[])14:   {00401A90   push      ebp         //操作保存ebp00401A91   mov         ebp,esp    //将栈顶指针给ebp00401A93   sub         esp,50h   //向上开辟一段空间00401A96   push      ebx         //保存ebx00401A97   push      esi            //保存esi00401A98   push      edi            //保存edi00401A99   lea         edi,//将ebp-50h的地址给edi00401A9C   mov         ecx,14h   //ecx = 14 (循环14次)00401AA1   mov         eax,0CCCCCCCCh//int 3 中断00401AA6   rep stos    dword ptr                //循环开辟10次int 3中断15:16:       double Number1, Number2;            //定义2个变量17:       std::cout << "Please enter the two numbers add up !\n\n";       //输入提示语00401AA8   push      offset string "Please enter the two numbers add"... (00472038) //保存我们的字符串00401AAD   push      offset std::cout (004800c0)                  //在保存我们的输出流从右往左保留顺序00401AB2   call      @ILT+965(std::operator<<) (004013ca)//调用输出我也不知道为什么这样做, 估计是编译器的缘故把,或者我的理解是错的00401AB7   add         esp,8      //推栈平衡18:19:       std::cin >> Number1 >>Number2;      //接收2个变量00401ABA   lea         eax,         //ebp-10的地址给eax00401ABD   push      eax                        //保存地址Number200401ABE   lea         ecx,            //在把ebp-8的地址给ecx00401AC1   push      ecx                        //保存地址Number100401AC2   mov         ecx,offset std::cin (00480150)//在此我认为是为我们输入的分配空间ecx 估计是debug的缘故,等下看下发行版的和OD看下就知道了。00401AC7   call      @ILT+630(std::basic_istream<char,std::char_traits<char> >::operator>>) (0040127b)       //然后开始接收第一个输入00401ACC   mov         ecx,eax   //把输入的传送到ecx中00401ACE   call      @ILT+630(std::basic_istream<char,std::char_traits<char> >::operator>>) (0040127b) //在接收我们的输入20:21:       std::cout << "Number1 + Number2 = " << myfunction(Number1,Number2); //输入函数00401AD3   mov         edx,dword ptr       //保存寄存器操作00401AD6   push      edx00401AD7   mov         eax,dword ptr 00401ADA   push      eax00401ADB   mov         ecx,dword ptr 00401ADE   push      ecx00401ADF   mov         edx,dword ptr 00401AE2   push      edx00401AE3   call      @ILT+730(myfunction) (004012df) //调用我们的函数myfunction00401AE8   add         esp,10h         //推栈平衡00401AEB   push      eax               //保存eax寄存器,在这里我很费解,这里的eax不是int 3中断的么?还保存。。。00401AEC   push      offset string "Number1 + Number2 = " (0047201c)    //保存函数计算出来的结果00401AF1   push      offset std::cout (004800c0)   //保存我们的输出00401AF6   call      @ILT+965(std::operator<<) (004013ca)//调用输出00401AFB   add         esp,8      //推栈平衡00401AFE   mov         ecx,eax   00401B00   call      @ILT+340(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401159)               //输出我们想输出的22:23:       std::cin.ignore(100, '\n');         //停止一会,看下结果00401B05   push      0Ah          //保存\n00401B07   push      64h         //保存10000401B09   mov         ecx,offset std::cin (00480150)       //把输入传递给ecx00401B0E   call      @ILT+540(std::basic_istream<char,std::char_traits<char> >::ignore) (00401221)//调用要我们输入24:       std::cin.get();00401B13   mov         ecx,offset std::cin (00480150)       //把输入的给ecx00401B18   call      @ILT+410(std::basic_istream<char,std::char_traits<char> >::get) (0040119f)       //检测看是否输入正确25:       return 0;00401B1D   xor         eax,eax            //清空eax26:   }00401B1F   pop         edi         //弹出edi, esi, ebx, 还原我们的开辟空间,还原我们的栈顶, 最后返回00401B20   pop         esi00401B21   pop         ebx00401B22   add         esp,50h00401B25   cmp         ebp,esp00401B27   call      __chkesp (0040b230)00401B2C   mov         esp,ebp00401B2E   pop         ebp00401B2F   ret在此,自己对debug版的稍微分析了下,自己水平有限,由于自己vc也用的不好,不会查看推栈和寄存器,没人教- - 。。。在来用OD看下debug的 代码是这样的。核对下vc的。差不多。。所以只能从发行版的,在来用od入手,把这段代码尽自己能力在多分析下了OD进入发行版由于自己研究的,如果有人看到我的手记愿意和我交流下怎么逆向,还有些工具使用方法啊,心得啊,那是最好的了。我找到代码的领空是这样的办法的限制字数!!!!!我发我的草稿文件把,完整版本的啊!!!..2012/04/02晚上

nichkhun 发表于 2012-4-2 23:31:40

自己的2楼,文件分析在下面!!!

沉醉.. 发表于 2012-4-3 09:15:29

代码中夹杂着表情 对于技术模块的帖子 建议小甲鱼要屏蔽此功能

nichkhun 发表于 2012-4-3 23:58:03

    才忙回来,1看,就1个回复,回复少了没什么啊,下我草稿的有5个,能留下足迹么,指点下唉,对于新人,起码有个鼓励也好,起码你们也不希望我会断唉~~~~~~

    对于毕业学生来说,各种压力和忙绿啊

炸鸡大侠 发表于 2012-4-4 23:04:28

求书名。盼楼主回复

┅☆伈随风飞 发表于 2012-4-5 13:48:30

厉害..向你学习..

冰尘。 发表于 2012-4-5 15:00:24

强烈鼓励-!!求去表情版本。。。。

nichkhun 发表于 2012-4-5 18:09:36

   天书夜读, 最近我U盘出了问题造成我系统崩溃了,资料全部都丢失了。没办法短时间内可以给大家做手记。 但是我会尽力赶快补习起来的。
   U盘资料全部没了,自己电脑也什么都没了。。
页: [1]
查看完整版本: 天书夜读逆向开始读书笔记02