博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
逆向反汇编代码推算C++的局部变量
阅读量:6291 次
发布时间:2019-06-22

本文共 2446 字,大约阅读时间需要 8 分钟。

上文说明了C++反汇编后的EBP,ESP寄存器都是做什么用的,相信大家已经有所了解,如果有没看过的请参考下文:

本文不会对其再做过多的讲解,如果还有问题,欢迎大家留言讨论。

首先明确本文要解决的问题:在没有源代码的情况下如何看明白我们的汇编代码中哪些是局部变量。

为了便于说明我将C++代码和汇编代码在一起,完整代码如下:

int InternalFunctionA(
int nSizeA1, 
int nSizeA2)
{
00401000  push        ebp  
00401001  mov         ebp,esp 
00401003  sub         esp,0Ch 
    
int localnSizeA1 = nSizeA1;
00401006  mov         eax,dword ptr [nSizeA1] 
00401009  mov         dword ptr [localnSizeA1],eax 
    
int localnSizeA2 = nSizeA2;
0040100C  mov         ecx,dword ptr [nSizeA2] 
0040100F  mov         dword ptr [localnSizeA2],ecx 
    
int nFunctionA = localnSizeA1 + localnSizeA2;
00401012  mov         edx,dword ptr [localnSizeA1] 
00401015  add         edx,dword ptr [localnSizeA2] 
00401018  mov         dword ptr [nFunctionA],edx 
    
return nFunctionA;
0040101B  mov         eax,dword ptr [nFunctionA] 
}
0040101E  mov         esp,ebp 
00401020  pop         ebp  
00401021  ret              
int InternalFunctionB(
int nSizeB1, 
int nSizeB2)
{
00401030  push        ebp  
00401031  mov         ebp,esp 
00401033  push        ecx  
    
int nFunctionA = InternalFunctionA(nSizeB1, nSizeB2);
00401034  mov         eax,dword ptr [nSizeB2] 
00401037  push        eax  
00401038  mov         ecx,dword ptr [nSizeB1] 
0040103B  push        ecx  
0040103C  call        InternalFunctionA (401000h) 
00401041  add         esp,
8 
00401044  mov         dword ptr [nFunctionA],eax 
    
return 
0;
00401047  xor         eax,eax 
}
00401049  mov         esp,ebp 
0040104B  pop         ebp  
0040104C  ret              
int _tmain(
int argc, _TCHAR* argv[])
{
00401050  push        ebp  
00401051  mov         ebp,esp 
00401053  push        ecx  
    
    
int nFunctionVal = InternalFunctionB(
36
64);
00401054  push        40h  
00401056  push        24h  
00401058  call        InternalFunctionB (401030h) 
0040105D  add         esp,
8 
00401060  mov         dword ptr [nFunctionVal],eax 
    cout<<
"
Hello SolidMango!
"<<endl;
00401063  mov         eax,dword ptr [__imp_std::endl (402048h)] 
00401068  push        eax  
00401069  push        offset ___xi_z+3Ch (402154h) 
0040106E  mov         ecx,dword ptr [__imp_std::cout (402078h)] 
00401074  push        ecx  
00401075  call        std::
operator<<<std::char_traits<
char> > (401280h) 
0040107A  add         esp,
8 
0040107D  mov         ecx,eax 
0040107F  call        dword ptr [__imp_std::basic_ostream<
char,std::char_traits<
char> >::
operator<< (40205Ch)] 
    
return 
0;
00401085  xor         eax,eax 
}
00401087  mov         esp,ebp 
00401089  pop         ebp  
0040108A  ret              

调用过程如下图所示,下面请大家和我一起看代码,InternalFunctionA()中,一共3个整型的变量,localnSizeA1 ,localnSizeA2,nFunctionA ,

00401003  sub         esp,0Ch 

这条指令的意思是说在栈上面给这3个局部变量留空间,执行完这条指令,栈顶已经移到ebp- 0ch的位置了,说到这里相信大家已经明白了,从ebp开始,局部变量一定在比这个地址低的位置,也就是ebp-nValue,也就是找到了局部变量。

 

 

总结:

也许有人会问我写这几篇关于C++反汇编文章的意义在那里,我先简单说明一下:

1. 有些情况下调试的时候由于C++还是相对高级的语言,在做某些问题分析比如dump file 分析的时候,C++的粒度还是显的有些大,看不到位。

2. 有时候我们根本就没有C++代码,我们只有一些dll和exe, 系统跑出问题同样需要分析解决。

3. 反病毒方面相信不必多言。

 

 

转载地址:http://tscta.baihongyu.com/

你可能感兴趣的文章
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>