逆向
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
技术
将可执行程序反汇编,通过分析反汇编代码来理解其代码功能,如各接口的数据结构等,然后用高级
语言重新描述这段代码,逆向分析原软件的思路。这个过程被称做“逆向工程(Reverse Engineering)”,或
者有时只是简单地称作“逆向(Reversing)”。这是一个很重要的技能,需要扎实的编程功底和汇编知识。
逆向分析的首选工具就是 IDA,其中它的一款插件 Hex-Rays Decompiler 能完成许多代码反编译的工作,
逆向时可以作为一款辅助工具参考。
逆向工程可以让人们了解程序的结构以及程序的逻辑,因此利用逆向工程可以深入洞察程序的运行过
程。一般所谓的“软件破解”只是逆向工程中非常初级的一部分。本节探讨的代码分析技术是基于 IA-32
处理器体系结构的。
„„略„„
4.7 数学运算符
高级语言中的运算符范围很广,这里只介绍整数的加、减、乘、除运算。编译器如果没优化,这些运
算符很好理解,可以参考相关的汇编书籍。本节主要认识一下经编译器优化过的运算符。
4.7.1 整数的加法和减法
一般情况下,整数的加法和减法编译成 add 和 sub 指令。编译优化时,比较喜欢用 lea 指令来代替 add
和 sub 指令。lea 指令允许用户在一个时钟内完成 c=a+b+78h 计算,其中 a、b 与 c 都是在寄存器的情况下
才有效,会编译成“lea c,[a+b+78]”指令。
加法实例:
int main(void)
{
int a,b;
printf("%d",a+b+0x78);
return 0;
}
用 Microsoft Visual C++ 6.0 编译,设置优化选项为 Maximize Speed。其反汇编代码如下:
:00401000 push ecx ;为局部变量分配内存
:00401001 mov eax, dword ptr[esp]
:00401005 mov ecx, dword ptr[esp]
:00401009 lea edx, dword ptr[ecx+eax+78] ;快速计算 ecx+eax+78之和
第4章
加密与解密(第三版)
72
:0040100D push edx
:0040100E push 00407030
:00401013 call 00401020 ;printf函数
:00401018 xor eax, eax
:0040101A add esp, 0000000C
:0040101D ret
在这句代码中,lea 指令只是一条纯算术指令,它的实际意义等价于“edx= ecx+eax+78”。
4.7.2 整数的乘法
乘法运算符一般编译成 mul、imul 指令。这些指令运行的速度比较慢,编译器会尽可能地提高代码的
效率,从而倾向于使用其他指令来完成同样的计算。如果一个数是 2 的幂,那么会用左移指令 shl 来实现
乘法。另外,加法对于提高 3,5,6,7,9 等数的乘法运算很有用,如:eax*5 可以写成“lea eax, [eax+4*eax]”。
(lea 指令可以实现寄存器乘以 2、4 或 8 的运算。)
int main(void)
{
int a;
printf("%d %d %d", a*11+4,a*9,a*2);
return 0;
}
用 Microsoft Visual C++ 6.0 编译,设置优化选项为 Maximize Speed。其反汇编代码如下:
:00401000 push ecx ;为局部变量 a分配内存
:00401001 mov eax, dword ptr [esp]
:00401005 lea ecx, dword ptr [eax+eax] ;即 a*2
:00401008 lea edx, dword ptr [eax+8*eax] ;edx=a+8*a=9*a
:0040100B push ecx
:0040100C lea ecx, dword ptr [eax+4*eax] ;ecx=a+4*a=5*a
:0040100F push edx
:00401010 lea edx, dword ptr [eax+2*ecx+4] ;edx=a+2*ecx+4=11*a+4
:00401014 push edx
:00401015 push 00407030
:0040101A call 00401030 ;printf函数
:0040101F xor eax, eax
:00401021 add esp, 00000014
:00401024 ret