vc++6 -- 逆向代码分析
逆向代码
先看一下test_class 类的析构函数的汇编代码:
67: test_class(void) {
00401140 push ebp
00401141 mov ebp,esp
00401143 sub esp,44h
00401146 push ebx
00401147 push esi
00401148 push edi
00401149 push ecx
0040114A lea edi,[ebp-44h]
0040114D mov ecx,11h
00401152 mov eax,0CCCCCCCCh
00401157 rep stos dword ptr [edi]
00401159 pop ecx
0040115A mov dword ptr [ebp-4],ecx
68: data_number=100;
0040115D mov eax,dword ptr [ebp-4]
00401160 mov dword ptr [eax],64h
; 由此可以知道私有变量是存在于类的堆栈中的指针来进行访问的..
; 其实上面这句代码是 this->data_number=100; 的简写..
; [ebp-4]<=>data_number
69: };
00401166 mov eax,dword ptr [ebp-4]
00401169 pop edi
0040116A pop esi
0040116B pop ebx
0040116C mov esp,ebp
0040116E pop ebp
0040116F ret
然后就是获取私有变量的汇编代码:
72: long get_data_number(void) const {
004011B0 push ebp
004011B1 mov ebp,esp
004011B3 sub esp,44h
004011B6 push ebx
004011B7 push esi
004011B8 push edi
004011B9 push ecx
004011BA lea edi,[ebp-44h]
004011BD mov ecx,11h
004011C2 mov eax,0CCCCCCCCh
004011C7 rep stos dword ptr [edi]
004011C9 pop ecx
004011CA mov dword ptr [ebp-4],ecx
73: return data_number;
004011CD mov eax,dword ptr [ebp-4]
004011D0 mov eax,dword ptr [eax]
74: };
004011D2 pop edi
004011D3 pop esi
004011D4 pop ebx
004011D5 mov esp,ebp
004011D7 pop ebp
004011D8 ret
设置私有变量的汇编代码:
75: void set_data_number(long in_data_number) {
004011F0 push ebp
004011F1 mov ebp,esp
004011F3 sub esp,44h
004011F6 push ebx
004011F7 push esi
004011F8 push edi
004011F9 push ecx
004011FA lea edi,[ebp-44h]
004011FD mov ecx,11h
00401202 mov eax,0CCCCCCCCh
00401207 rep stos dword ptr [edi]
00401209 pop ecx
0040120A mov dword ptr [ebp-4],ecx
76: data_number=in_data_number;
0040120D mov eax,dword ptr [ebp-4]
00401210 mov ecx,dword ptr [ebp+8] ; 参数in_data_number
00401213 mov dword ptr [eax],ecx
77: };
00401215 pop edi
00401216 pop esi
00401217 pop ebx
00401218 mov esp,ebp
0040121A pop ebp
0040121B ret 4
由上面可以知道,类的get/set 方法是根据this 指针来访问类的私有数据成员的.现在就根据下面的代码来进行研究:
#include#include "class.h" // class_test 的声名都在里面 void main(void) { test_class test; test.get_data_number(); test.set_data_number(1234); }
然后启动CE 分析,发现该私有变量的地址为:0x0018FF38,根据汇编代码:
0040115D mov eax,dword ptr [ebp-4]
00401160 mov dword ptr [eax],64h
反向推算得EBP=0x0018FF3B.
当然,这个类不是基址,它只是main() 函数里面的一个局部变量,如果当test 类为全局时,情况又会是怎么样呢?下面是要研究的代码:
#include#include "class.h" test_class test; void main(void) { test.get_data_number(); }
此时CE 的分析显示,私有变量是一个基址:0x00428D58 ,这就意味着可以通过这个不变的地址读/写私有数据成员.
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4151.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
