标 题: 【注意】逆向基础知识学习
作 者: kanxue
时 间: 2007-09-01,10:45
链 接: http://bbs.pediy.com/showthread.php?t=50879
声明:这份是看雪论坛学习交流小组内部交流的资料, 现在放出来
一直建议学习解密的朋友,一定要掌握好汇编和Win32编程(Charles Petzold著的《Windows程序设计》),磨刀不误砍柴功。
代码的逆向分析基础也没过多的技巧,掌握一些基本原理后,自己写些小程序,然后再看反汇编代码理解意思,进步会很快的。
有一些内容,在新兵论坛的置顶帖里己有,如:
【资料】解密基础知识入门 。
第1部分 函数
1.1 函数参数
传递参数有如下情况:
①利用堆栈传递参数;
②利用寄存器传递参数。
③通过全局变量进行隐含参数的传递
函数调用中需要解决几个问题:
1. 当参数个数多于一个时,按照什么顺序把参数压入堆栈。
2. 函数调用后,由谁来把堆栈恢复。
在高级语言中,通过调用约定来说明这两个问题。
常见的调用约定有:__cdecl调用约定,__PASCAL调用约定,__stdcall调用约定,thiscall调用约定。
假设调用函数是:test1(Par1,Par2, Par3):
1.1.1 __stdcall调用约定
按__stdcall约定调用函数test2(Par1, Par2)
push par2 ; 参数2
push par1 ; 参数1
call test2;
{
push ebp ; 保护现场原先的EBP指针
mov ebp, esp ; 设置新的EBP指针,指向栈顶
mov eax, [ebp+0C] ; 调用参数2
mov ebx, [ebp+08] ; 调用参数1
sub esp, 8 ; 创建局部变量,在堆栈中分配些空间
…
add esp, 8 ; 释放局部变量占用的堆栈
pop ebp ; 恢复现场的ebp指针
ret 8 ; 返回(相当于ret; add esp,8)
}
用OllyDBG打开实例
add.rar ,对照下图理解堆栈的参数是如何传递的。
1.1.2 this指针
在C++程序中,对象的每个函数隐含地接受this参数——指向对象实例的指针,函数调用是通过对象实例进行的。只要使用this指针,就能确定被调用的函数究竟属于哪个对象实例。由于虚函数的地址是在调用即将进行之前加以确定的,因此如果不存在this指针,重载函数之间的层次结构将不可能做到的。
一般情况下,每个编译器都有自己的特别之处。下面是不同编译器中传递this指针的简表:
1.2 函数返回值
函数的返回值通常是由return操作符返回的一个值。从汇编角度来看,主要有如下形式:
1)通过寄存器返回函数值;
2)通过参数按引用方式返回函数值;
3)通过全局变量返回函数值;
4)通过处理器标志返回函数值;
一般情况下,由retrun操作符返回的值放在EAX寄存器之中,如果结果超过这个寄存器的位容量,那么该结果的高32位会加载到EDX寄存器中。
如果返回一个含有几百个字节的结构或者一个近似大小的对象,编译器会在不告诉程序的情况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。
1.3 局部变量
在子程序内部说明的变量称为局部变量,局部变量的作用域是其所在的子程序。从汇编角度来看,局部变量就是一个临时堆栈缓存,用完释放。
例如这个实例:
附件:local.zip
其反汇编代码如下(红体字为局部变量):
00401000 >/$ 6A 04 push 4 ; /Arg2 = 00000004
00401002 |. 6A 03 push 3 ; |Arg1 = 00000003
00401004 |. E8 16000000 call 0040101F ; \Add.0040101F
00401009 |. 8BD8 mov ebx, eax
0040100B |. 6A 00 push 0 ; /ExitCode = 0
0040100D \. FF15 00204000 call [<&KERNEL32.ExitProcess>] ; \ExitProcess
0040101F /$ 55 push ebp ; 保护现场原先的EBP指针
00401020 |. 8BEC mov ebp, esp ; 设置新的EBP指针,指向栈顶
00401022 |. 83EC 04 sub esp, 4 ; 分配局部变量所有空间
00401025 |. 8B45 0C mov eax, [ebp+C] ; 调用参数2
00401028 |. 8B5D 08 mov ebx, [ebp+8] ; 调用参数1
0040102B |. 895D FC mov
[ebp-4] , ebx ; 参数1放局部变量里
0040102E |. 0345 FC add eax,
[ebp-4] ; 参数2与局部变量相加
00401031 |. 83C4 04 add esp, 4 ; 释放局部变量所有空间
00401034 |. 5D pop ebp ; 恢复现场的ebp指针
00401035 \. C2 0800 retn 8
安卓应用层抓包通杀脚本发布!《高研班》2021年3月班开始招生!