【文章标题】: 菜鸟学逆向——简单的反汇编阅读与逆向(2)
【文章作者】: Silence(cu629944,等试用期通过,我会修改ID为Silecne)
【作者邮箱】: mohen_ng@sina.cn
【下载地址】: 自己搜索下载
【使用工具】: IDA VC++6.0
【操作平台】: WIN7
【作者声明】: 本系列文定位为和我一样菜鸟的人们看的,老鸟和高手飞过。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
请将菜鸟学逆向——简单的反汇编阅读与逆向(1)看完,再来看第二篇,地址是:http://www.52pojie.cn/thread-141165-1-1.html
讲解几个常见的函数调用约定;
VC6中的函数调用约定;
调用约定 堆栈清除 参数传递
__cdecl 调用者 从右到左,通过堆栈传递
__stdcall 函数体 从右到左,通过堆栈传递
__fastcall 函数体 从右到左,优先使用寄存器(ECX,EDX),然后使用堆栈
看下面程序:
int Silence(int a,int b)
{
int c=a+b;
for(int i=0;i<10;i++)
{
c=c+i;
}
return c;
}
void main()
{
Silence(1,2);
}
变动的只是Silence()里面加了一个for循环,我们就从for循环那里看就行了
4: for(int i=0;i<10;i++)
00401041 mov dword ptr [ebp-8],0 ;上一个我们提到[ebp-4]处为第一个局部变量(这里是c)
;那么这里的[ebp-8]就是第二个局部变量i
;对i赋值i=0
00401048 jmp Silence + 33h (00401053) ;赋值后跳到00401053
;上面2句的模板是这样的:
;
;mov <循环变量>,<初值>
;jmp 检查循环条件
;上面3句只是简单的实现i++,然后让下面的比较语句去比较00401053 cmp dword ptr [ebp-8],0Ah ;来到这里,i的值与0Ah比较,也就是10比较
00401057 jge Silence + 44h (00401064) ;i大于或等于0Ah就跳转,就是说小于10时执行循环
;上面2句的模板是这样的:
;cmp <循环变量>,<限制条件>
;jge 跳出循环
;(循环体)
5: {
6: c=c+i;
00401059 mov edx,dword ptr [ebp-4] ;把第一个局部变量c给edx
0040105C add edx,dword ptr [ebp-8] ;把第二个局部变量i加edx
0040105F mov dword ptr [ebp-4],edx ;把相加的结果给c,就是c=c+i
;上面3句是循环体了,非常的简单,只要弄懂[ebp-N]就行了
7: }
00401062 jmp Silence + 2Ah (0040104a) ;跳会修改循环变量继续循环,这里是跳回i++那里
;这句也是模板
;
;jmp 修改循环变量 8: return c;
00401064 mov eax,dword ptr [ebp-4] ;把c的值给eax作为函数返回的结果
;所有的函数默认都是用eax作返回值。这个定理在爆破的时候非常的有用。
------------------------------------------------------------------------------
总结一个for循环的反汇编结构如下:
mov <循环变量>,<初值>
jmp 检查循环条件B
A: (修改循环变量)
...
...
B: cmp <循环变量>,<限制条件>
jge 跳出循环
(循环体)
...
...
jmp 修改循环变量A
以后看到这样的模板的时候,我们就可以知道这是一个FOR语句的循环体。
--------------------------------------------------------------------------------
这个是Realse版本的For语句循环:
00401000 /$ 8B4424 08 mov eax, dword ptr [esp+8] ; 第一个局部参数c
00401004 |. 8B4C24 04 mov ecx, dword ptr [esp+4] ; 第二个局部参数i
00401008 |. 03C1 add eax, ecx ; c=c+i
0040100A |. 33C9 xor ecx, ecx ; ecx清零,就是i为0开始循环
0040100C |> 03C1 /add eax, ecx ; c=c+i
0040100E |. 41 |inc ecx ; i++
0040100F |. 83F9 0A |cmp ecx, 0A ; ecx作为计数器,比较是否小于10,如果小于10,就继续跳回去执行
00401012 |.^ 7C F8 \jl short 0040100C
00401014 \. C3 retn
好了,FOR语句循环就写到这里,给大家留一个作业,就是今天其他的循环体比如do,while循环,大家根据这个写出反汇编代码,然后跟帖回复!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于吾爱破解技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2012年04月09日 14:20:11
|