2
2
#include < idp.hpp>
3
3
#include < loader.hpp>
4
4
#include < kernwin.hpp>
5
+ #include < help.h>
5
6
#include < name.hpp>
6
7
#include " cvinfo.h"
7
8
#define WIN32_LEAN_AND_MEAN
8
9
#include < windows.h>
9
10
11
+ #define CHECK_SYMBOL_PTR
12
+
13
+ #ifdef CHECK_SYMBOL_PTR
14
+ bool is_bad_ptr (void * p)
15
+ {
16
+ MEMORY_BASIC_INFORMATION mbi = {0 };
17
+ if (::VirtualQuery (p, &mbi, sizeof (mbi))) {
18
+ DWORD mask = (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY);
19
+ bool b = !(mbi.Protect & mask);
20
+ // check if the page is not a guard page
21
+ if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) {
22
+ b = true ;
23
+ }
24
+ return b;
25
+ }
26
+ return true ;
27
+ }
28
+ #endif
29
+
10
30
unsigned long crc_table[256 ] = {
11
31
0x00000000 , 0x77073096 , 0xee0e612c , 0x990951ba , 0x076dc419 , 0x706af48f , 0xe963a535 , 0x9e6495a3 ,
12
32
0x0edb8832 , 0x79dcb8a4 , 0xe0d5e91e , 0x97d2d988 , 0x09b64c2b , 0x7eb17cbd , 0xe7b82d07 , 0x90bf1d91 ,
@@ -971,6 +991,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
971
991
{
972
992
insn_size = 4 ;
973
993
unsigned int * data = (unsigned int *)(CodeSymbols[j].Data + pos);
994
+ #ifdef CHECK_SYMBOL_PTR
995
+ if (is_bad_ptr (data)) {
996
+ msg (" unlinker --- 1 Invalid Address pos %x\n " , (int )pos);
997
+ continue ;
998
+ }
999
+ #endif
974
1000
if (IsSymbol (*data))
975
1001
{
976
1002
Symbol& fsym = FindSymbol (*data);
@@ -989,6 +1015,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
989
1015
for (ea_t k = CodeSymbols[j].Address ; k < CodeSymbols[j].Address + CodeSymbols[j].Size ; k += 4 )
990
1016
{
991
1017
unsigned int * data = (unsigned int *)(CodeSymbols[j].Data + k);
1018
+ #ifdef CHECK_SYMBOL_PTR
1019
+ if (is_bad_ptr (data)) {
1020
+ msg (" unlinker --- 2 Invalid k %x\n " , (int )k);
1021
+ continue ;
1022
+ }
1023
+ #endif
992
1024
if (IsSymbol (*data))
993
1025
{
994
1026
Symbol& fsym = FindSymbol (*data);
@@ -1016,6 +1048,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
1016
1048
for (ssize_t k = 0 ; k < RDataSymbols[j].Size ; k += 4 )
1017
1049
{
1018
1050
unsigned int * data = (unsigned int *)(RDataSymbols[j].Data + k);
1051
+ #ifdef CHECK_SYMBOL_PTR
1052
+ if (is_bad_ptr (data)) {
1053
+ msg (" unlinker --- 3 Invalid Address k %x\n " , (int )k);
1054
+ continue ;
1055
+ }
1056
+ #endif
1019
1057
if (IsSymbol (*data))
1020
1058
{
1021
1059
Symbol& fsym = FindSymbol (*data);
@@ -1036,6 +1074,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
1036
1074
for (ssize_t k = 0 ; k < DataSymbols[j].Size ; k += 4 )
1037
1075
{
1038
1076
unsigned int * data = (unsigned int *)(DataSymbols[j].Data + k);
1077
+ #ifdef CHECK_SYMBOL_PTR
1078
+ if (is_bad_ptr (data)) {
1079
+ msg (" unlinker --- 4 Invalid Address k %x\n " , (int )k);
1080
+ continue ;
1081
+ }
1082
+ #endif
1039
1083
if (IsSymbol (*data))
1040
1084
{
1041
1085
Symbol& fsym = FindSymbol (*data);
0 commit comments