绘图基础,PE结构分析
RVA是相对虚拟地址(Relative Virtual Address)的缩写。RVA是当PE 文件被装载到内存中后,某个数据位置相对于文件头的偏移量。
一、安装远程服务器管理工具:
例如:导入表的位置和大小可以从PE文件头中IMAGE_OPTIONAL_HEADER32结构的数据目录字段中获取,对应的项目是DataDirectory字段的第2个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTORY结构的VirtualAddress字段得到的是导入表的RVA值,如果在内存中查找导入表,那么将RVA值加上PE文件装入的基址就是实际的地址;如果在PE文件中查找导入表,需要将RVA转换成File Offset(也就是数据在文件中的位置)。
线上箭头表示画线的方向。WINDING模式和ALTERNATE模式都会填充三个封闭的L型区域,号码从1到3。两个更小的内部区域,号码为4和5,在ALTERNATE模式下不被填充。但是在WINDING模式下,号码5的区域会被填充,这是因为区域的内部到达图形的外部必须穿过两条相同方向的线。号码为4的区域不会被填充,因为射线必须穿越两条边框线,但是这两条边框线的绘制方向相反。
下载地址:
RVA转换到文件偏移地址的方法如下:
步骤一:循环扫描区块表得出每个区块在内存中的起始
RVA(根据IMAGE_SECTION_HEADER 中的VirtualAddress
字段),并根据区块的大小(根据IMAGE_SECTION_HEADER 中的SizeOfRawData
字段)算出区块的结束 RVA(两者相加即可),最后判断目标 RVA
是否落在该区块内。
步骤二:通过步骤一定位了目标 RVA 处于具体的某个区块中后,那么用目标 RVA
减去该区块的起始 RVA ,这样就能得到目标 RVA 相对于起始地址的偏移量
RVA2.
步骤三:在区块表中获取该区块在文件中所处的偏移地址(根据IMAGE_SECTION_HEADER
中的PointerToRawData 字段), 将这个偏移值加上步骤二得到的 RVA2
值,就得到了真正的文件偏移地址。
1 /*-------------------------------------------
2 ALTWIND.C -- Alternate and Winding Fill Modes
3 (c) Charles Petzold, 1998
4 -------------------------------------------*/
5
6 #include <Windows.h>
7
8 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
9
10 int WINAPI WinMain( __in HINSTANCE hInstance
11 , __in_opt HINSTANCE hPrevInstance
12 , __in LPSTR lpCmdLine
13 , __in int nShowCmd )
14 {
15 static TCHAR szAppName[] = TEXT("AltWind");
16 HWND hwnd;
17 MSG msg;
18 WNDCLASS wndclass;
19
20 wndclass.style = CS_HREDRAW | CS_VREDRAW;
21 wndclass.lpfnWndProc = WndProc;
22 wndclass.cbClsExtra = 0;
23 wndclass.cbWndExtra = 0;
24 wndclass.hInstance = hInstance;
25 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
26 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
27 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
28 wndclass.lpszMenuName = NULL;
29 wndclass.lpszClassName = szAppName;
30
31 if (!RegisterClass(&wndclass))
32 {
33 MessageBox(NULL, TEXT("Program requires Windows NT!")
34 , szAppName, MB_ICONERROR);
35 return 0;
36 }
37
38 hwnd= CreateWindow(szAppName, TEXT("Alternate and Winding Fill Modes")
39 , WS_OVERLAPPEDWINDOW
40 , CW_USEDEFAULT, CW_USEDEFAULT
41 , CW_USEDEFAULT, CW_USEDEFAULT
42 , NULL, NULL, hInstance, NULL);
43
44 ShowWindow(hwnd, nShowCmd);
45 UpdateWindow(hwnd);
46
47 while (GetMessage(&msg, NULL, 0, 0))
48 {
49 TranslateMessage(&msg);
50 DispatchMessage(&msg);
51 }
52
53 return msg.wParam;
54 }
55
56 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
57 {
58 static POINT aptFigure[10] = {10, 70
59 , 50, 70
60 , 50, 10
61 , 90, 10
62 , 90, 50
63 , 30, 50
64 , 30, 90
65 , 70, 90
66 , 70, 30
67 , 10, 30};
68 static int cxClient, cyClient;
69 HDC hdc;
70 int i;
71 PAINTSTRUCT ps;
72 POINT apt[10];
73
74 switch (message)
75 {
76 case WM_SIZE:
77 cxClient = LOWORD(lParam);
78 cyClient = HIWORD(lParam);
79 return 0;
80
81 case WM_PAINT:
82 hdc = BeginPaint(hwnd, &ps);
83 SelectObject(hdc, GetStockObject(GRAY_BRUSH));
84
85 for (i = 0; i !=10; i)
86 {
87 apt[i].x = cxClient * aptFigure[i].x / 200;
88 apt[i].y = cyClient * aptFigure[i].y / 100;
89 }
90 SetPolyFillMode(hdc, ALTERNATE);
91 Polygon(hdc, apt, 10);
92
93 for (i = 0; i != 10; i)
94 {
95 apt[i].x = cxClient / 2;
96 }
97 SetPolyFillMode(hdc, WINDING);
98 Polygon(hdc, apt, 10);
99
100 EndPaint(hwnd, &ps);
101 return 0;
102
103 case WM_DESTROY:
104 PostQuitMessage(0);
105 return 0;
106 }
107
108 return DefWindowProc(hwnd, message, wParam, lParam);
109 }
二、关闭远程服务器管理工具:
既,已知某虚拟地址(如va)和某区块的虚拟地址(text_va),虚拟地址在区块中,同时还知道此区块在文件中的位置(text_file_offset),解出此虚拟地址在文件中的具体位置。解:根据他们的偏移量相同(都是text_va
ALTWIND.C
1 在桌面上右击“开始”,进入“程序和功能”
- va)可知,答案为 text_file_offset (text_va - va)。
图形的坐标(按一个100*100单位的区域设定)存储在aptFigure数组中。这些坐标会根据客户去的宽度和高度按比例缩放。程序显示两个图形,一个使用ALTERNATE填充模式,另一个使用WINDING填充模式。结果如图:
2 单击程序,然后在程序和功能中单击“启用或关闭 Windows 功能”。
本文由千赢娱乐手机登录发布于千赢娱乐手机登录,转载请注明出处:绘图基础,PE结构分析
关键词:
下一篇:没有了