96SEO 2026-02-19 21:50 9
.baidu.com/s/1_87QNHaZYlfY_5uwIRePUQ?pwd6gds

当程序执行完了要把dll从4GB空间被卸载也会调用一次DllMain
很淦各种问题频出这回做了整整六个小时六个小时啊有木有总结就是太自大了没认真听课直接上手吃瘪了。
首先说说创建dll文件吧我选择的是用.def导出这样我就可以用Depend查看里边的具体函数名和导出序号。
很淦的是当学到动态链接库的时候尝试过自己用def导出dll文件当时啥问题都没有一路畅通但是很淦的是昨天却死活导不出只有dll没有lib文件导致把dll放到Depend什么东东都没看见。
各大资料博客哥们都要翻烂了还是没能解决最后.......家人们好无语啊原来我添加def的时候是通过手动改后缀为.def然后死活不行机缘巧合我删了原来的def采用下图这样添加.def文件然后导出涅马成功导出dll和lib了。
耗费一小时
DLL_PROCESS_ATTACH:Init();break;case
DLL_PROCESS_DETACH:Destroy();break;}return
谈谈我的理解当exe想要调用dll里的函数的时候首先去导入表找对应的函数名或者导出序号如果IAT有现成的已经绑定好的地址那么就直接调用如果没有则需要通过INT
IAT表存着的函数名或者导出序号然后调用GetProcAddress()
函数去导出表找对应的函数真实地址填在IAT然后调用函数。
精简的回答
首先我们要明白为什么要移动导入表为什么不能在EXE程序最后一个导入表后面追加一个导入表呢
就拿我这个程序来说黑色部分就是导入表了可以看到导入表的后门就是一大堆我也不知道啥数据但是肯定动了就寄了因此根本没空间让我们新添加东西所以我们只能扩大节或者新增节去挪动我们的导入表这里我选择的是新增节
改PE头关于节的属性改exe程序的大小,记住新增节的属性是0XC0000060反正权限都给就对了然后讲节表里的导入表的偏移地址修改成挪动后的地址
就是构造IAT,INT的时候要注意结束符要留够一个DWORD大小的0不然在PEtool甚至不能分析新增dll的和里面的函数。
淦太淦了还有导入表的OriginalFirstThunk和FirstThunk要先指向一个IMAGE_THUNK_DATA的结构这个结构是一个联合体
AddressOfData;//指向IMAGE_IMPORT_BY_NAME}
而不是让导入表的OriginalFirstThunk和FirstThunk直接指向IMAGE_IMPORT_BY_NAME结构。
PE::Import_Table_Injection(Data
sizeof(IMAGE_IMPORT_DESCRIPTOR);DWORD
my_data.my_optional-SizeOfImagedll_size;Data
char[new_data_size];memset(new_data.Stretch_Data,
_msize(new_data.Stretch_Data);memcpy_s(new_data.Stretch_Data,
my_data.my_optional-SizeOfImage);//修改节的属性Analyze_PE(new_data,
2);new_data.my_file-NumberOfSections
2);//必须再分析一次否则Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
1]会报错new_data.my_optional-SizeOfImage
new_data_size;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-Characteristics;new_data.my_section[new_data.my_file-NumberOfSections
real_dll_size;memcpy_s(new_data.my_section[new_data.my_file-NumberOfSections
7);new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfLinenumbers;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfRelocations;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-PointerToLinenumbers;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-PointerToRelocations;new_data.my_section[new_data.my_file-NumberOfSections
size_of_rawdata;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
Section_Align(my_data.my_section[my_data.my_file-NumberOfSections
my_data);cou***xRva_To_Foa(0x10eac,
sizeof(IMAGE_IMPORT_DESCRIPTOR);DWORD*
(DWORD*)my_data.my_Import_Directory[0];DWORD*
(DWORD*)((DWORD)new_data.Stretch_Data
(DWORD)new_data.my_section[new_data.my_file-NumberOfSections
(DWORD)new_data.Stretch_Data;memcpy_s(new_data_ptr,
import_table_size);//修改导入表的入口地址和大小new_data.my_Data_Directory[1]-VirtualAddress
(DWORD)new_data_ptr-(DWORD)new_data.Stretch_Data;new_data.my_Data_Directory[1]-Size0x3c;//新增导入表PIMAGE_IMPORT_DESCRIPTOR
new_import_ptr2(PIMAGE_IMPORT_DESCRIPTOR)((DWORD)new_data_ptr
import_table_size);new_import_ptr2-FirstThunk
(DWORD)nullptr;new_import_ptr2-TimeDateStamp
0;new_import_ptr2-OriginalFirstThunk
(DWORD)nullptr;new_import_ptr2-ForwarderChain
0;//让FirstThunk指向自己伪造的IAT表让OriginalFirstThunk指向伪造的INT表PIMAGE_IMPORT_BY_NAME
(PIMAGE_IMPORT_BY_NAME)((DWORD)new_data_ptr3*0X140X10
);//指向新的空间PIMAGE_IMPORT_BY_NAME
new_data_import_by_name;new_data_import_by_name-Hint
0;strcpy_s(new_data_import_by_name-Name,
(PIMAGE_IMPORT_BY_NAME)((DWORD)new_data_import_by_name
0x7);strcpy_s((PCHAR)((DWORD)new_data_import_by_name),
(DWORD)new_data_import_by_name-(DWORD)new_data.Stretch_Data;new_data_import_by_name
(PIMAGE_IMPORT_BY_NAME)((DWORD)new_data_import_by_name
(IMAGE_THUNK_DATA32*)((DWORD)new_data_ptr
0x14);thunk_ptr-u1.AddressOfData
(DWORD)new_data.Stretch_Data;new_import_ptr2-FirstThunk
(DWORD)new_data.Stretch_Data;thunk_ptr
(IMAGE_THUNK_DATA32*)((DWORD)thunk_ptr
0X8);thunk_ptr-u1.AddressOfData
(DWORD)new_data.Stretch_Data;new_import_ptr2-OriginalFirstThunk
(DWORD)new_data.Stretch_Data;//缩小保存FILE*
my_dll;Shrink_PE(new_data);Analyze_PE(new_data,
_msize(new_data.Shrink_Data);if
0){fwrite(new_data.Shrink_Data,
my_dos;//dos头结构PIMAGE_FILE_HEADER
my_file;//file结构PIMAGE_OPTIONAL_HEADER32
my_optional;//可选PE头结构PIMAGE_SECTION_HEADER*
my_section;//节表结构PIMAGE_DATA_DIRECTORY*
my_Data_Directory;//数据目录结构//0.导出表
my_Export_Name[50][30];//导出表的名字PIMAGE_EXPORT_DIRECTORY
//指向导出表中函数的地址PIMAGE_BASE_RELOCATION
//指向重定位表的数组PIMAGE_IMPORT_DESCRIPTOR*
nullptr;//节表结构my_Data_Directory
//指向缩小PE结构的内容Import_Directory_num
nullptr){free(Before_Stretch_Data);Before_Stretch_Data
nullptr){free(Stretch_Data);Stretch_Data
nullptr){free(Shrink_Data);Shrink_Data
Data::Copy_Before_Strectch_Data(Data
_msize(my_data.Before_Stretch_Data);memcpy_s(this-Before_Stretch_Data,
my_data);//新增节非扩大节并写入新的exe文件中VOID
Print_IMAGE_DATA_DIRECTORY(Data
PE::Import_Table_Injection(Data
sizeof(IMAGE_IMPORT_DESCRIPTOR);DWORD
my_data.my_optional-SizeOfImagedll_size;Data
char[new_data_size];memset(new_data.Stretch_Data,
_msize(new_data.Stretch_Data);memcpy_s(new_data.Stretch_Data,
my_data.my_optional-SizeOfImage);//修改节的属性Analyze_PE(new_data,
2);new_data.my_file-NumberOfSections
2);//必须再分析一次否则Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
1]会报错new_data.my_optional-SizeOfImage
new_data_size;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-Characteristics;new_data.my_section[new_data.my_file-NumberOfSections
real_dll_size;memcpy_s(new_data.my_section[new_data.my_file-NumberOfSections
7);new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfLinenumbers;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfRelocations;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-PointerToLinenumbers;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[0]-PointerToRelocations;new_data.my_section[new_data.my_file-NumberOfSections
size_of_rawdata;new_data.my_section[new_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
Section_Align(my_data.my_section[my_data.my_file-NumberOfSections
my_data);cou***xRva_To_Foa(0x10eac,
sizeof(IMAGE_IMPORT_DESCRIPTOR);DWORD*
(DWORD*)my_data.my_Import_Directory[0];DWORD*
(DWORD*)((DWORD)new_data.Stretch_Data
(DWORD)new_data.my_section[new_data.my_file-NumberOfSections
(DWORD)new_data.Stretch_Data;memcpy_s(new_data_ptr,
import_table_size);//修改导入表的入口地址和大小new_data.my_Data_Directory[1]-VirtualAddress
(DWORD)new_data_ptr-(DWORD)new_data.Stretch_Data;new_data.my_Data_Directory[1]-Size0x3c;//新增导入表PIMAGE_IMPORT_DESCRIPTOR
new_import_ptr2(PIMAGE_IMPORT_DESCRIPTOR)((DWORD)new_data_ptr
import_table_size);new_import_ptr2-FirstThunk
(DWORD)nullptr;new_import_ptr2-TimeDateStamp
0;new_import_ptr2-OriginalFirstThunk
(DWORD)nullptr;new_import_ptr2-ForwarderChain
0;//让FirstThunk指向自己伪造的IAT表让OriginalFirstThunk指向伪造的INT表PIMAGE_IMPORT_BY_NAME
(PIMAGE_IMPORT_BY_NAME)((DWORD)new_data_ptr3*0X140X10
);//指向新的空间PIMAGE_IMPORT_BY_NAME
new_data_import_by_name;new_data_import_by_name-Hint
0;strcpy_s(new_data_import_by_name-Name,
(PIMAGE_IMPORT_BY_NAME)((DWORD)new_data_import_by_name
0x7);strcpy_s((PCHAR)((DWORD)new_data_import_by_name),
(DWORD)new_data_import_by_name-(DWORD)new_data.Stretch_Data;new_data_import_by_name
(PIMAGE_IMPORT_BY_NAME)((DWORD)new_data_import_by_name
(IMAGE_THUNK_DATA32*)((DWORD)new_data_ptr
0x14);thunk_ptr-u1.AddressOfData
(DWORD)new_data.Stretch_Data;new_import_ptr2-FirstThunk
(DWORD)new_data.Stretch_Data;thunk_ptr
(IMAGE_THUNK_DATA32*)((DWORD)thunk_ptr
0X8);thunk_ptr-u1.AddressOfData
(DWORD)new_data.Stretch_Data;new_import_ptr2-OriginalFirstThunk
(DWORD)new_data.Stretch_Data;//缩小保存FILE*
my_dll;Shrink_PE(new_data);Analyze_PE(new_data,
_msize(new_data.Shrink_Data);if
0){fwrite(new_data.Shrink_Data,
my_data.my_Import_Directory[i];if
-----------------------------------------------------------------------------
(PCHAR)(temp_import_ptr-Name(DWORD)my_data.Stretch_Data)
-----------------------------------------------------------------------------
endl;}}PIMAGE_BOUND_IMPORT_DESCRIPTOR
(my_data.my_Data_Directory[11]-VirtualAddress
(PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)my_data.my_Data_Directory[11]-VirtualAddress
(DWORD)my_data.Stretch_Data);}else{cout
(*(DWORD*)temp_bound_import_ptr
(temp_bound_import_ptr-TimeDateStamp
my_data.my_file-TimeDateStamp){cout
DLL:(PCHAR)(temp_bound_import_ptr-OffsetModuleNametemp_bound_import_ptr)PE头的时间戳和绑定导出表的时间戳不一致需要进行IAT重定位
(DWORD*)((DWORD)my_data.Stretch_Data
(DWORD)temp_bound_import_ptr-OffsetModuleName);cout
temp_bound_import_ptr-NumberOfModuleForwarderRefs
temp_bound_import_ptr-NumberOfModuleForwarderRefs;
(PIMAGE_BOUND_FORWARDER_REF)((DWORD)temp_bound_import_ptr
(PCHAR)((DWORD)my_data.Stretch_Data
(DWORD)temp_ref_ptr-OffsetModuleName)
(PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)temp_bound_import_ptr
0x8(DWORD)temp_bound_import_ptr-NumberOfModuleForwarderRefs
(PCHAR)((DWORD)my_data.my_Import_Directory[i]-Name
(DWORD*)((DWORD)my_data.my_Import_Directory[i]-OriginalFirstThunk
(DWORD)my_data.Stretch_Data);int
(PCHAR)((DWORD)my_data.my_Import_Directory[i]-Name
(DWORD*)((DWORD)my_data.my_Import_Directory[i]-FirstThunk
(DWORD)my_data.Stretch_Data);int
(PCHAR)(my_data.my_Import_Directory[i]-Name(DWORD)my_data.Stretch_Data)
(PIMAGE_THUNK_DATA32)((my_data.my_Import_Directory[0]-OriginalFirstThunk
(DWORD)my_data.Stretch_Data));for
((DWORD)pimage_thunk_data32-u1.AddressOfData
(pimage_thunk_data32-u1.AddressOfData
((DWORD)pimage_thunk_data32-u1.AddressOfData
(PCHAR)(pimage_thunk_data32-u1.AddressOfData
((DWORD)pimage_thunk_data32-u1.AddressOfData
0){break;}pimage_thunk_data32;}}
(PIMAGE_IMPORT_DESCRIPTOR)my_data.my_Data_Directory[1];my_data.my_Import_Directory
PIMAGE_IMPORT_DESCRIPTOR[100];Temp_Ptr
(PIMAGE_IMPORT_DESCRIPTOR)(*(DWORD*)Temp_Ptr
(DWORD)my_data.Stretch_Data);int
0){break;}my_data.my_Import_Directory[i]
(PIMAGE_IMPORT_DESCRIPTOR)((DWORD)Temp_Ptr
sizeof(DWORD));}my_data.Import_Directory_num
(LPVOID)((DWORD)my_data.my_Data_Directory[5]-VirtualAddress
(DWORD)my_data.Stretch_Data);PIMAGE_BASE_RELOCATION
(PIMAGE_BASE_RELOCATION)Temp_Ptr;while
relocation_ptr-SizeOfBlock;relocation_ptr
(PIMAGE_BASE_RELOCATION)((DWORD)relocation_ptr(DWORD)relocation_ptr-SizeOfBlock);}DWORD
File_Align(Relocation_Data_Size,
Section_Align(Relocation_Data_Size,
my_data);Remove_Relocation_Data.Stretch_Data
my_data.my_optional-SizeOfImage];if
(Remove_Relocation_Data.Stretch_Data
Remove_Relocation_Data.Stretch_Data分配空间失败
endl;return;}memcpy_s(Remove_Relocation_Data.Stretch_Data,
my_data.my_optional-SizeOfImage,
my_data.my_optional-SizeOfImage);//现在要将新的节设置好//
被坑了好久记得在对应节填上数据否则会因为数据为空而不能运行Temp_Ptr
(LPVOID)((DWORD)Remove_Relocation_Data.Stretch_Data
(DWORD)my_data.my_optional-SizeOfImage);memset(Temp_Ptr,
Relocation_Data_Size);Analyze_PE(Remove_Relocation_Data,
2);Remove_Relocation_Data.my_file-NumberOfSections
1;Analyze_PE(Remove_Relocation_Data,
2);//必须再分析一次否则Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
1]会报错Remove_Relocation_Data.my_optional-SizeOfImage
Relocation_Data_Size;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[0]-Characteristics;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
Relocation_Data_Size;memcpy_s(Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
7);Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfLinenumbers;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfRelocations;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[0]-PointerToLinenumbers;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[0]-PointerToRelocations;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
SizeOfRawData;Remove_Relocation_Data.my_section[Remove_Relocation_Data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
Section_Align(my_data.my_section[my_data.my_file-NumberOfSections
(LPVOID)((DWORD)my_data.my_Data_Directory[5]-VirtualAddress
Real_Size);Remove_Relocation_Data.my_Data_Directory[5]-VirtualAddress
(DWORD)my_data.my_optional-SizeOfImage;FILE*
my_file;Shrink_PE(Remove_Relocation_Data);Analyze_PE(Remove_Relocation_Data,
_msize(Remove_Relocation_Data.Shrink_Data);if
0){fwrite(Remove_Relocation_Data.Shrink_Data,
my_data.my_Export_Directory-NumberOfFunctions
my_data.my_Export_Directory-NumberOfNames
my_data.my_Export_Directory-NumberOfNames
my_data.my_Export_Directory-NumberOfNames;
strlen(my_data.my_Export_Name[i]);}Export_Size
my_data.my_optional-SizeOfImage;Data
Remove_Export_Data;Remove_Export_Data.Stretch_Data
(Remove_Export_Data.Stretch_Data
endl;}memcpy_s(Remove_Export_Data.Stretch_Data,
my_data.my_optional-SizeOfImage);LPVOID
(LPVOID)((DWORD)Remove_Export_Data.Stretch_Data
my_data.my_optional-SizeOfImage);//这里是指向新的节//现在要将新的节设置好//
被坑了好久记得在对应节填上数据否则会因为数据为空而不能运行memset(Temp_Ptr,
Export_Size);Analyze_PE(Remove_Export_Data,
2);Remove_Export_Data.my_file-NumberOfSections;Remove_Export_Data.my_optional-SizeOfImage
Export_Size;Analyze_PE(Remove_Export_Data,
//可以分析到新的节表//开始修改节的属性Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[0]-Characteristics;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
Export_Size;memcpy_s(Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
remove,7);Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfLinenumbers;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[0]-NumberOfRelocations;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[0]-PointerToLinenumbers;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections-1]-PointerToRawData
my_data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[0]-PointerToRelocations;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
Export_Size;Remove_Export_Data.my_section[Remove_Export_Data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
Section_Align(my_data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData,my_data);Print_ExportTable(Remove_Export_Data);//开始移动导出表的信息memcpy_s(Temp_Ptr,
my_data.my_Export_Directory-NumberOfFunctions,
(LPVOID)(my_data.my_Export_Directory-AddressOfFunctions(DWORD)my_data.Stretch_Data),
my_data.my_Export_Directory-NumberOfFunctions);Remove_Export_Data.my_Export_Directory-AddressOfFunctions
(DWORD)Temp_Ptr-(DWORD)Remove_Export_Data.Stretch_Data;Temp_Ptr
my_data.my_Export_Directory-NumberOfFunctions);memcpy_s(Temp_Ptr,
my_data.my_Export_Directory-NumberOfNames,
(LPVOID)(my_data.my_Export_Directory-AddressOfNameOrdinals
my_data.my_Export_Directory-NumberOfNames);Remove_Export_Data.my_Export_Directory-AddressOfNameOrdinals
(DWORD)Remove_Export_Data.Stretch_Data;Temp_Ptr
my_data.my_Export_Directory-NumberOfNames);memcpy_s(Temp_Ptr,
my_data.my_Export_Directory-AddressOfNames,
(LPVOID)(my_data.my_Export_Directory-AddressOfNames
my_data.my_Export_Directory-NumberOfNames);Remove_Export_Data.my_Export_Directory-AddressOfNames
(DWORD)Remove_Export_Data.Stretch_Data;Temp_Ptr
my_data.my_Export_Directory-AddressOfNames);FILE*
my_file;Shrink_PE(Remove_Export_Data);DWORD
_msize(Remove_Export_Data.Shrink_Data);if
0){fwrite(Remove_Export_Data.Shrink_Data,
(DWORD)my_data.my_Data_Directory[5]-VirtualAddress(DWORD)my_data.Stretch_Data;int
-----------------------------------------------------
endl;my_data.Relocation_Table[i]
(PIMAGE_BASE_RELOCATION)Temp_ptr;my_data.Relocation_Table[i]-VirtualAddress
*(DWORD*)Temp_ptr;my_data.Relocation_Table[i]-SizeOfBlock
(my_data.Relocation_Table[i]-SizeOfBlock
my_data.Relocation_Table[i]-VirtualAddress
my_data.Relocation_Table[i]-SizeOfBlock-0x8;if
*(DWORD*)(Temp_ptr1)0){break;}}}VOID
PE::GetFunctionAddrByOrdinal(Data
(DWORD)((DWORD)my_data.my_Export_Directory-AddressOfNameOrdinals
(DWORD)my_data.Stretch_Data);for
my_data.my_Export_Directory-NumberOfNames;
my_data.my_Export_Directory-Base
my_data.Export_AddressOfFunction[i]
endl;return;}AddressOfNames_ptr
(DWORD)((char*)AddressOfNames_ptr
my_data.my_Export_Directory-NumberOfNames;
my_data.my_Export_Name[i])){cout
my_data.my_Export_Directory-NumberOfNames
my_data.Export_AddressOfFunction[i]
(PIMAGE_EXPORT_DIRECTORY)((DWORD)my_data.my_Data_Directory[0]-VirtualAddress
(DWORD)my_data.Stretch_Data);my_data.my_Export_Directory
(DWORD)((DWORD)my_export_directory_ptr-AddressOfFunctions
(DWORD)my_data.Stretch_Data);DWORD
(DWORD)((DWORD)my_export_directory_ptr-AddressOfNames
(DWORD)my_data.Stretch_Data);DWORD
(DWORD)((DWORD)my_export_directory_ptr-AddressOfNameOrdinals
(DWORD)my_data.Stretch_Data);cout
---------------AddressOfFunctions------------------
my_export_directory_ptr-NumberOfFunctions;for
*((DWORD*)AddressOfFunctions_ptr)
endl;my_data.Export_AddressOfFunction[i]
*((DWORD*)AddressOfFunctions_ptr);AddressOfFunctions_ptr
(*((DWORD*)AddressOfFunctions_ptr)
---------------------Names------------------
my_export_directory_ptr-NumberOfNames;for
i){strcpy_s(my_data.my_Export_Name[i],
(PCHAR)(*(DWORD*)AddressOfNames_ptr
(DWORD)my_data.Stretch_Data));cout
(PCHAR)(*(DWORD*)AddressOfNames_ptr
----------------------NameOrdinals---------------
my_data.my_optional-SizeOfHeaders){return
my_data.my_section[index]-VirtualAddress){if
my_data.my_file-NumberOfSections
my_data.my_section[index]-VirtualAddress;return
my_data.my_section[index]-PointerToRawData
PE::Analyze_Data_Directory(Data
nullptr;my_data.my_Data_Directory
(PIMAGE_DATA_DIRECTORY*)malloc(16
sizeof(PIMAGE_DATA_DIRECTORY));void*
my_data.my_optional-DataDirectory;for
i){my_data.my_Data_Directory[i]
(PIMAGE_DATA_DIRECTORY)Temp_ptr;Temp_ptr
PE::Print_IMAGE_DATA_DIRECTORY(Data
{IMAGE_DIRECTORY_ENTRY_EXPORT,IMAGE_DIRECTORY_ENTRY_IMPORT,IMAGE_DIRECTORY_ENTRY_RESOURCE,IMAGE_DIRECTORY_ENTRY_EXCEPTION,IMAGE_DIRECTORY_ENTRY_SECURITY,IMAGE_DIRECTORY_ENTRY_BASERELOC,IMAGE_DIRECTORY_ENTRY_DEBUG,IMAGE_DIRECTORY_ENTRY_COPYRIGHT,IMAGE_DIRECTORY_ENTRY_GLOBALPTR,IMAGE_DIRECTORY_ENTRY_TLS,IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,IMAGE_DIRECTORY_ENTRY_IAT,IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR,RESERVED};for
my_data.my_Data_Directory[i]-Size
my_data.my_Data_Directory[i]-VirtualAddress
------------------------------------------------------------------------
MAX(my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
Section_Align(my_data.my_optional-SizeOfHeaders,
MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize);Data
(void*)malloc(temp_size);memset(Comebine_Data.Stretch_Data,
_msize(my_data.Stretch_Data);memcpy_s(Comebine_Data.Stretch_Data,
temp_size);Analyze_PE(Comebine_Data,
(char*)Comebine_Data.Stretch_Data
my_data.my_section[my_data.my_file-NumberOfSections
1]-VirtualAddress;memcpy_s(temp_ptr,
MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
my_data.my_section[0]-VirtualAddress
MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize));Comebine_Data.my_optional-SizeOfImage
Section_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
my_data);Comebine_Data.my_section[my_data.my_file-NumberOfSections
File_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
my_data);Comebine_Data.my_section[my_data.my_file-NumberOfSections
Section_Align(Comebine_Data.my_section[my_data.my_file-NumberOfSections
Section_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
endl;return;}Shrink_PE(Comebine_Data);Analyze_PE(Comebine_Data,
3);fwrite(Comebine_Data.Shrink_Data,
_msize(Comebine_Data.Shrink_Data),
{this-Stretch_PE(my_data);unsigned
Section_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
Expand_Data;Expand_Data.Stretch_Data
(void*)malloc(Size);memset(Expand_Data.Stretch_Data,
Size);memcpy_s(Expand_Data.Stretch_Data,
_msize(my_data.Stretch_Data));Analyze_PE(Expand_Data,
2);Expand_Data.my_section[my_data.my_file-NumberOfSections
Section_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
Section_Align(MAX(my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
my_data);Expand_Data.my_section[my_data.my_file-NumberOfSections
Expand_Data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData;Expand_Data.my_optional-SizeOfImage
Section_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
(char*)Expand_Data.Stretch_Data
Expand_Data.my_section[Expand_Data.my_file-NumberOfSections
Section_Align(MAX(my_data.my_section[Expand_Data.my_file-NumberOfSections
my_data.my_section[Expand_Data.my_file-NumberOfSections
Section_Align(MAX(my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-Misc.VirtualSize),
my_data.my_section[0]-VirtualAddress;memcpy_s(Temp_Ptr,
temp_size);Shrink_PE(Expand_Data);FILE*
_msize(Expand_Data.Shrink_Data);fwrite(Expand_Data.Shrink_Data,
my_data.my_optional-SectionAlignment){i;}return
my_data.my_optional-SectionAlignment;}DWORD
my_data.my_optional-FileAlignment){i;}return
my_data.my_optional-FileAlignment;
//Size是新文件的大小是原来的文件大小加上.VirtualSize和SizeOfRawData较大的那个Size
my_data.my_optional-SizeOfHeaders;for
my_data.my_file-NumberOfSections;
my_data.my_section[i]-SizeOfRawData;}Size
my_data.my_section[0]-SizeOfRawData;//这是最终新的文件的大小Data
New_Data;New_Data.Before_Stretch_Data
1);memset(New_Data.Before_Stretch_Data,
Size);memcpy_s(New_Data.Before_Stretch_Data,
my_data.my_section[0]-SizeOfRawData);//将原来的文件复制过来Analyze_PE(New_Data,
1);//让New_Data的dos,file,optional,section有数据//复制新的节表void*
(char*)my_data.Before_Stretch_Data
my_data.my_file-SizeOfOptionalHeader;void*
(char*)New_Data.Before_Stretch_Data
my_data.my_file-SizeOfOptionalHeader
my_data.my_file-NumberOfSections
(char*)my_data.Before_Stretch_Data
my_data.my_optional-SizeOfHeaders;//指向.text段Temp_ptr2
(char*)New_Data.Before_Stretch_Data
my_data.my_section[0]-SizeOfRawData;memcpy_s(Temp_ptr2,
my_data.my_section[0]-SizeOfRawData,
my_data.my_section[0]-SizeOfRawData);//复制完.text段作为新增节//接下来要改Header的各项数据New_Data.my_file-NumberOfSections;New_Data.my_optional-SizeOfImage
my_data.my_section[0]-SizeOfRawData;Analyze_PE(New_Data,
1);New_Data.my_section[New_Data.my_file-NumberOfSections
New_Data.my_section[New_Data.my_file-NumberOfSections
New_Data.my_section[New_Data.my_file-NumberOfSections
(New_Data.my_section[New_Data.my_file-NumberOfSections
New_Data.my_section[New_Data.my_file-NumberOfSections
New_Data.my_section[New_Data.my_file-NumberOfSections
New_Data.my_section[New_Data.my_file-NumberOfSections
my_data.my_optional-SectionAlignment
my_data.my_optional-SectionAlignment;New_Data.my_section[New_Data.my_file-NumberOfSections
New_Data.my_section[New_Data.my_file-NumberOfSections
0){fwrite(New_Data.Before_Stretch_Data,
endl;return;}else{//获取文件的大小cout
ftell(datafile);fseek(datafile,
endl;return;}//申请内存空间把文件内容保存下来my_data.Before_Stretch_Data
(fread_s(my_data.Before_Stretch_Data,
(DWORD*)data.Before_Stretch_Data;data.my_dos
(PIMAGE_DOS_HEADER)Temp_ptr;Temp_ptr
(DWORD*)((char*)data.Before_Stretch_Data
data.my_dos-e_lfanew);Temp_ptr;data.my_file
(PIMAGE_FILE_HEADER)Temp_ptr;Temp_ptr
(PIMAGE_OPTIONAL_HEADER)Temp_ptr;Temp_ptr
(DWORD*)((char*)data.my_optional
data.my_file-SizeOfOptionalHeader);data.my_section
(PIMAGE_SECTION_HEADER*)malloc(sizeof(PIMAGE_SECTION_HEADER)
data.my_file-NumberOfSections);memset(data.my_section,
data.my_file-NumberOfSections);for
(PIMAGE_SECTION_HEADER)Temp_ptr;Temp_ptr
0x28);}Analyze_Data_Directory(data);return;}cout
(DWORD*)data.Stretch_Data;data.my_dos
(PIMAGE_DOS_HEADER)Temp_ptr;Temp_ptr
(DWORD*)((char*)data.Stretch_Data
data.my_dos-e_lfanew);Temp_ptr;data.my_file
(PIMAGE_FILE_HEADER)Temp_ptr;Temp_ptr
(PIMAGE_OPTIONAL_HEADER)Temp_ptr;Temp_ptr
(DWORD*)((char*)data.my_optional
data.my_file-SizeOfOptionalHeader);data.my_section
(PIMAGE_SECTION_HEADER*)malloc(sizeof(PIMAGE_SECTION_HEADER)
data.my_file-NumberOfSections);for
(PIMAGE_SECTION_HEADER)Temp_ptr;Temp_ptr
0x28);}Analyze_Data_Directory(data);PIMAGE_EXPORT_DIRECTORY
(PIMAGE_EXPORT_DIRECTORY)((DWORD)data.my_Data_Directory[0]-VirtualAddress
(DWORD)data.Stretch_Data);data.my_Export_Directory
(DWORD)((DWORD)my_export_directory_ptr-AddressOfFunctions
(DWORD)data.Stretch_Data);DWORD
(DWORD)((DWORD)my_export_directory_ptr-AddressOfNames
(DWORD)data.Stretch_Data);DWORD
(DWORD)((DWORD)my_export_directory_ptr-AddressOfNameOrdinals
(DWORD)data.Stretch_Data);Analyze_Import_Table(data);return;}cout
(DWORD*)data.Shrink_Data;data.my_dos
(PIMAGE_DOS_HEADER)Temp_ptr;Temp_ptr
(DWORD*)((char*)data.Shrink_Data
data.my_dos-e_lfanew);Temp_ptr;data.my_file
(PIMAGE_FILE_HEADER)Temp_ptr;Temp_ptr
(PIMAGE_OPTIONAL_HEADER)Temp_ptr;Temp_ptr
(DWORD*)((char*)data.my_optional
data.my_file-SizeOfOptionalHeader);data.my_section
(PIMAGE_SECTION_HEADER*)malloc(sizeof(PIMAGE_SECTION_HEADER)
data.my_file-NumberOfSections);for
(PIMAGE_SECTION_HEADER)Temp_ptr;Temp_ptr
0x28);}Analyze_Data_Directory(data);return;}cout
注意看PIMAGE_XXX_HEADER的定义它们本就是指向结构体的指针
my_data.my_optional-SizeOfImage;my_data.Stretch_Data
Memory_Size);memset(my_data.Stretch_Data,
my_data.Before_Stretch_Data;int
my_data.my_file-SizeOfOptionalHeader;unsigned
my_data.my_optional-SizeOfHeaders;//还未对齐memcpy_s(my_data.Stretch_Data,
my_data.Stretch_Data;//现在计算head头对齐后的大小int
my_data.my_optional-SectionAlignment;Size_Of_Header
my_data.my_optional-SectionAlignment
my_data.my_file-NumberOfSections;
(void*)((char*)my_data.Stretch_Data
my_data.my_section[i]-VirtualAddress);temp_before_stretch_data_ptr
(void*)((char*)my_data.Before_Stretch_Data
my_data.my_section[i]-PointerToRawData);memcpy_s(temp_stretch_data,
my_data.my_section[i]-SizeOfRawData,
my_data.my_section[i]-SizeOfRawData);}cout
my_data.my_section[my_data.my_file-NumberOfSections
my_data.my_section[my_data.my_file-NumberOfSections
1]-SizeOfRawData;my_data.Shrink_Data
(void*)malloc(Size);memset(my_data.Shrink_Data,
Size);//从Stretch_Data缩小//复制Headsmemcpy_s(my_data.Shrink_Data,
my_data.my_optional-SizeOfHeaders,
my_data.my_optional-SizeOfHeaders);//复制节void*
my_data.my_file-NumberOfSections;
(void*)((char*)my_data.Shrink_Data
my_data.my_section[i]-PointerToRawData);temp_stretch_data_ptr
(void*)((char*)my_data.Stretch_Data
my_data.my_section[i]-VirtualAddress);memcpy_s(temp_shrink_data_ptr,
my_data.my_section[i]-SizeOfRawData,
my_data.my_section[i]-SizeOfRawData);}cout
my_data;my_pe.Readfile(filename,
my_data);my_pe.Analyze_PE(my_data,
sectionmy_pe.Stretch_PE(my_data);my_pe.Analyze_PE(my_data,
2);my_pe.Shrink_PE(my_data);my_pe.Analyze_Data_Directory(my_data);//my_pe.Print_IMAGE_DATA_DIRECTORY(my_data);//my_pe.Print_ExportTable(my_data);//cout
endl;((void(*)())addr)();//调用//HMODULE
GetModuleHandleA(Dll1.dll);//my_pe.GetFunctionAddrByName(my_data,
(char*)Print);//my_pe.GetFunctionAddrByOrdinal(my_data,
14);//my_pe.Print_ExportTable(my_data);//cout
endl;//my_pe.Print_Relocation(my_data);//cout
endl;my_pe.Remove_Export_Table(my_data);//my_pe.Remove_Relocation(my_data);//my_pe.Analyze_Import_Table(my_data);//my_pe.Print_Import_Table(my_data);my_pe.Print_INT(my_data);my_pe.Print_IAT(my_data);my_pe.Print_BOUND_IMPORT(my_data);my_pe.Import_Table_Injection(my_data);return
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback