原谅我一次提俩问题
①关于TSL回调 先参考一篇文章
http://bbs.pediy.com/showthread.php?t=108015
说在VC6.0下有bug,确实我试了好多次都不行
换2005,发现Debug版本可以,但Release版本就不行了 请问是为什么
有人说 那个obj文件的问题 说怎么怎么弄 最后还要属性也一样 obj文件咋查属性?
告诉为什么Release版本不行 然后告诉我怎么样才能使Release行就ok
②关于PE校验和
下面一段代码给出了3种实现 其中第一种是我翻译第三种得来的
#include "StdAfx.h"
#include "windows.h"
#include "imagehlp.h"
int main(int argc, char* argv[])
{
char buf[300];
ZeroMemory(buf, 300);
// printf("Hello World!\n");
// printf("Input your file path and name:\n");
// scanf("%s", &buf);
// printf("Your file name is: %s\n", buf);
HANDLE hFile = CreateFile("a.exe",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE){
printf("Open File Failed!\n");
return 0;
}
HANDLE hFileMapping = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0, 0, 0);
if(hFileMapping == NULL){
printf("Create Mapping File Failed!\n");
CloseHandle(hFile);
return 0;
}
LPVOID lpBase = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpBase == NULL){
printf("Failed to Map the File!\n");
CloseHandle(hFileMapping);
CloseHandle(hFile);
}
PIMAGE_DOS_HEADER dosH = (PIMAGE_DOS_HEADER)lpBase;
if(dosH->e_magic == 0x5a4d){
DWORD off = dosH->e_lfanew;
PIMAGE_NT_HEADERS ntH = (PIMAGE_NT_HEADERS)((PBYTE)dosH + off);
if(ntH->Signature == 0x4550){
printf("It's a PE File.\n");
DWORD checksum = ntH->OptionalHeader.CheckSum;
printf("CheckSum is : 0x%08X\n", checksum);
ntH->OptionalHeader.CheckSum = 0;
DWORD fileSize = GetFileSize(hFile, 0);
DWORD checksum2 = 0;
/**************************C语言的方式*******************************/
WORD *p = (WORD*)lpBase;
DWORD dwLength = fileSize;
__asm
{
clc
}
for (DWORD i=0; i<fileSize/2; i++)
{
checksum2 += *p++;
if ((checksum2 | 0x0000FFFF) != 0x0000FFFF)
{
checksum2++;
checksum2 &= 0x0000ffff;
}
dwLength -= 2;
}
if (dwLength == 1)
{
checksum2 += *(unsigned char*)p;
}
checksum2 += fileSize;
printf("*******1******** 0x%.8X\n", checksum2);
/**************************Windows API方式*******************************/
DWORD s1,s2;
::CheckSumMappedFile(lpBase, fileSize, &s1, &s2);
printf("*******2******** 0x%.8X\n", s2);
/**************************汇编方式*******************************/
checksum2 = 0;
__asm{
pushad
xor eax, eax
mov ebx, fileSize
mov ecx, ebx
push ecx
shr ecx, 1
mov esi, lpBase
clc
cal_checksum:
adc ax, word ptr [esi]
inc esi
inc esi
loop cal_checksum
adc ax, 0
pop ecx
test ecx, 1
jz __end
xor edi, edi
movzx di, byte ptr [esi]
clc
add ax, di
__end:
add eax, ebx ;
mov checksum2, eax
popad
}
printf("*******3******** 0x%08X\n", checksum2);
ntH->OptionalHeader.CheckSum = checksum;
}
}
UnmapViewOfFile(lpBase);
CloseHandle(hFileMapping);
CloseHandle(hFile);
return 0;
}
然后我的问题是:
假如exe的PE头里面的校验和为0x00000000(这很正常,很多的PE头里的CheckSum字段都是0),用LordPE查一下发现是0x00123456,然后我们保存(不要点确定,要点保存),然后我们比较保存后和保存前的俩exe files,结果就是PE头里的CheckSum子段由0x00000000变成了0x00123456,然后我们用上面那个程序去检查刚修改完的exe 发现了和修改前的校验和一样!!
但是明明这个字段改变了啊?为什么?很迷茫。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课