void CleanPE(PVOID PEStart) {
PIMAGE_DOS_HEADER pDosHeader
=
(PIMAGE_DOS_HEADER)(PEStart);
PIMAGE_NT_HEADERS pNtHeader
=
(PIMAGE_NT_HEADERS)((DWORD)PEStart
+
pDosHeader
-
>e_lfanew);
PIMAGE_FILE_HEADER pFileHeader
=
&pNtHeader
-
>FileHeader;
pFileHeader
-
>Machine
=
0
;
pFileHeader
-
>NumberOfSections
=
0
;
pFileHeader
-
>TimeDateStamp
=
0
;
PIMAGE_OPTIONAL_HEADER32 pOptionalHeader
=
&pNtHeader
-
>OptionalHeader;
pOptionalHeader
-
>AddressOfEntryPoint
=
0
;
pOptionalHeader
-
>SizeOfCode
=
0
;
pOptionalHeader
-
>SizeOfHeaders
=
0
;
pOptionalHeader
-
>SizeOfImage
=
0
;
pOptionalHeader
-
>ImageBase
=
0
;
pOptionalHeader
-
>BaseOfCode
=
0
;
pOptionalHeader
-
>BaseOfData
=
0
;
}
void CleanImageInfo(MonoImage
*
image) {
Print
(
"Destroying mono image info..."
);
/
/
清除PE头
PVOID PEStart
=
image
-
>raw_data;
Print
(
"PEAdd: %X"
,PEStart);
CleanPE(PEStart);
memset(PEStart,
0x66
,
0x200
);
image
-
>raw_data
=
NULL;
image
-
>raw_data_len
=
0
;
int
namelen
=
strlen(image
-
>name);
for
(
int
i
=
0
; i < namelen; i
+
+
) {
/
/
把原来的名字地址上的内容也清掉
image
-
>name[i]
=
'\0'
;
}
image
-
>name
=
NULL;
namelen
=
strlen(image
-
>assembly_name);
for
(
int
i
=
0
; i < namelen; i
+
+
) {
/
/
把原来的名字地址上的内容也清掉
((char
*
)image
-
>assembly_name)[i]
=
'\0'
;
}
namelen
=
strlen(image
-
>module_name);
for
(
int
i
=
0
; i < namelen; i
+
+
) {
/
/
把原来的名字地址上的内容也清掉
((char
*
)image
-
>module_name)[i]
=
'\0'
;
}
char
*
fakeVersion
=
new char[
20
];
strcpy(fakeVersion,
"0.0.0.0"
);
image
-
>version
=
fakeVersion;
image
-
>raw_metadata
=
NULL;
}
static void
image_Foreach_routine(gpointer key, gpointer val, gpointer user_data)
{
/
/
Print
(
"Foreach key = %X"
,key);
/
/
Print
(
"Foreach val = %X"
, val);
/
/
Print
(
"Foreach key->string = %s"
, key);
string test
=
(char
*
)key;
MonoImage
*
image
=
(MonoImage
*
)val;
if
(test.find(
"data-"
) !
=
string::npos) {
Print
(
"Foreach key->string = %s"
, key);
Print
(
"Find Cheat!"
);
Print
(
"Foreach key->string = %s"
, image
-
>assembly_name);
g_hash_table_remove(loaded_images_hash,image
-
>name);
g_hash_table_remove(loaded_images_hash, image
-
>assembly_name);
CleanImageInfo(image);
Print
(
"Remove finished!"
);
}
}
static void
assemblies_Foreach_routine(gpointer data, gpointer user_data) {
MonoAssembly
*
ass
=
(MonoAssembly
*
) data;
string assName
=
ass
-
>aname.name;
if
(assName.find(
"BobHSSJJ"
) !
=
string::npos) {
g_list_remove(loaded_assemblies, data);
}
/
/
Print
(
"AssName = %s"
, ass
-
>aname.name);
/
/
Print
(
"BaseDir = %s"
, ass
-
>basedir);
/
/
Print
(
"gac = %02X"
, ass
-
>in_gac);
/
/
Print
(
"corlib_internal = %02X"
, ass
-
>corlib_internal);
/
/
Print
(
"--------------"
);
}