Skip to content

Commit 77cf062

Browse files
committed
Fix bug electron#50: Update the PE checksum after committing changes
(And fixes duplicate bug electron#101: Triggers false positive for windows defender golang)
1 parent b807b34 commit 77cf062

File tree

4 files changed

+63
-16
lines changed

4 files changed

+63
-16
lines changed

rcedit.gyp

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
'src/rcedit.rc',
1111
'src/version.h',
1212
],
13+
'libraries': [
14+
'imagehlp.lib',
15+
],
1316
'msvs_settings': {
1417
'VCLinkerTool': {
1518
'SubSystem': 1, # console executable

rcedit.vcxproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@
3939
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Default|Win32'">
4040
<ClCompile>
4141
<CompileAsWinRT>false</CompileAsWinRT>
42-
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
43-
<Optimization>Full</Optimization>
42+
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
43+
<Optimization>MinSpace</Optimization>
4444
<PrecompiledHeader>NotUsing</PrecompiledHeader>
4545
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
4646
</ClCompile>
4747
<Link>
48-
<AdditionalDependencies></AdditionalDependencies>
48+
<AdditionalDependencies>imagehlp.lib</AdditionalDependencies>
4949
<OutputFile>$(OutDir)$(ProjectName)$(TargetExt)</OutputFile>
5050
<SubSystem>Console</SubSystem>
5151
</Link>

src/rescle.cc

+54-12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <assert.h>
1111
#include <atlstr.h>
12+
#include <imagehlp.h>
1213
#include <sstream> // wstringstream
1314
#include <iomanip> // setw, setfill
1415
#include <fstream>
@@ -93,8 +94,8 @@ std::wstring ReadFileToString(const wchar_t* filename) {
9394

9495
class ScopedFile {
9596
public:
96-
ScopedFile(const WCHAR* path)
97-
: file_(CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) {}
97+
ScopedFile(const WCHAR* path, DWORD access = GENERIC_READ)
98+
: file_(CreateFileW(path, access, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) {}
9899
~ScopedFile() { CloseHandle(file_); }
99100

100101
operator HANDLE() { return file_; }
@@ -568,8 +569,8 @@ bool ResourceUpdater::ChangeRcData(UINT id, const WCHAR* pathToResource) {
568569

569570
wchar_t abspath[MAX_PATH] = { 0 };
570571
const auto filePath = _wfullpath(abspath, pathToResource, MAX_PATH) ? abspath : pathToResource;
571-
ScopedFile newRcDataFile(filePath);
572-
if (newRcDataFile == INVALID_HANDLE_VALUE) {
572+
ScopedFile newRcDataFile(filePath);
573+
if (newRcDataFile == INVALID_HANDLE_VALUE) {
573574
fprintf(stderr, "Cannot open new data file '%ws'\n", filePath);
574575
return false;
575576
}
@@ -581,13 +582,13 @@ bool ResourceUpdater::ChangeRcData(UINT id, const WCHAR* pathToResource) {
581582
}
582583

583584
auto& rcData = rcDataLngPairIt->second[id];
584-
rcData.clear();
585+
rcData.clear();
585586
rcData.resize(dwFileSize);
586-
587-
DWORD dwBytesRead{ 0 };
587+
588+
DWORD dwBytesRead{ 0 };
588589
if (!ReadFile(newRcDataFile, rcData.data(), dwFileSize, &dwBytesRead, NULL)) {
589590
fprintf(stderr, "Cannot read file '%ws'\n", filePath);
590-
return false;
591+
return false;
591592
}
592593

593594
return true;
@@ -701,7 +702,7 @@ bool ResourceUpdater::Commit() {
701702
FreeLibrary(module_);
702703
module_ = NULL;
703704

704-
ScopedResourceUpdater ru(filename_.c_str(), false);
705+
ScopedResourceUpdater ru(filename_, false);
705706
if (ru.Get() == NULL) {
706707
return false;
707708
}
@@ -979,8 +980,8 @@ BOOL CALLBACK ResourceUpdater::OnEnumResourceManifest(HMODULE hModule, LPCTSTR l
979980
return TRUE; // Keep going
980981
}
981982

982-
ScopedResourceUpdater::ScopedResourceUpdater(const WCHAR* filename, bool deleteOld)
983-
: handle_(BeginUpdateResourceW(filename, deleteOld)) {
983+
ScopedResourceUpdater::ScopedResourceUpdater(std::wstring filename, bool deleteOld)
984+
: filename_(filename), handle_(BeginUpdateResourceW(filename.c_str(), deleteOld)) {
984985
}
985986

986987
ScopedResourceUpdater::~ScopedResourceUpdater() {
@@ -995,7 +996,7 @@ HANDLE ScopedResourceUpdater::Get() const {
995996

996997
bool ScopedResourceUpdater::Commit() {
997998
commited_ = true;
998-
return EndUpdate(true);
999+
return EndUpdate(true) && UpdateChecksum();
9991000
}
10001001

10011002
bool ScopedResourceUpdater::EndUpdate(bool doesCommit) {
@@ -1005,4 +1006,45 @@ bool ScopedResourceUpdater::EndUpdate(bool doesCommit) {
10051006
return bResult ? true : false;
10061007
}
10071008

1009+
bool ScopedResourceUpdater::UpdateChecksum() {
1010+
const WCHAR* path = filename_.c_str();
1011+
ScopedFile binFile(path, GENERIC_READ|GENERIC_WRITE);
1012+
if (binFile == INVALID_HANDLE_VALUE) {
1013+
fprintf(stderr, "Cannot open '%ws'\n", path);
1014+
return false;
1015+
}
1016+
DWORD fileSize = GetFileSize(binFile, NULL);
1017+
if (fileSize == INVALID_FILE_SIZE) {
1018+
fprintf(stderr, "Cannot get file size for '%ws'\n", path);
1019+
return false;
1020+
}
1021+
1022+
HANDLE hFilemap = CreateFileMapping(binFile, NULL, PAGE_READWRITE, 0, 0, NULL);
1023+
if (!hFilemap) {
1024+
fprintf(stderr, "CreateFileMapping(%ws) failed\n", path);
1025+
return false;
1026+
}
1027+
1028+
void* view = MapViewOfFile(hFilemap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
1029+
if (!view) {
1030+
fprintf(stderr, "Cannot map '%ws' into memory\n", path);
1031+
CloseHandle(hFilemap);
1032+
return false;
1033+
}
1034+
1035+
bool ret = false;
1036+
DWORD originalSum, checkSum;
1037+
IMAGE_NT_HEADERS *ntHeader = CheckSumMappedFile(view, fileSize, &originalSum, &checkSum);
1038+
if (!ntHeader) {
1039+
fprintf(stderr, "CheckSumMappedFile failed\n");
1040+
} else {
1041+
ntHeader->OptionalHeader.CheckSum = checkSum;
1042+
ret = true;
1043+
}
1044+
1045+
UnmapViewOfFile(view);
1046+
CloseHandle(hFilemap);
1047+
return ret;
1048+
}
1049+
10081050
} // namespace rescle

src/rescle.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,17 @@ class ResourceUpdater {
167167

168168
class ScopedResourceUpdater {
169169
public:
170-
ScopedResourceUpdater(const WCHAR* filename, bool deleteOld);
170+
ScopedResourceUpdater(std::wstring filename, bool deleteOld);
171171
~ScopedResourceUpdater();
172172

173173
HANDLE Get() const;
174174
bool Commit();
175175

176176
private:
177177
bool EndUpdate(bool doesCommit);
178+
bool UpdateChecksum();
178179

180+
std::wstring filename_;
179181
HANDLE handle_;
180182
bool commited_ = false;
181183
};

0 commit comments

Comments
 (0)