22#include < idp.hpp>
33#include < loader.hpp>
44#include < kernwin.hpp>
5+ #include < help.h>
56#include < name.hpp>
67#include " cvinfo.h"
78#define WIN32_LEAN_AND_MEAN
89#include < windows.h>
910
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+
1030unsigned long crc_table[256 ] = {
1131 0x00000000 , 0x77073096 , 0xee0e612c , 0x990951ba , 0x076dc419 , 0x706af48f , 0xe963a535 , 0x9e6495a3 ,
1232 0x0edb8832 , 0x79dcb8a4 , 0xe0d5e91e , 0x97d2d988 , 0x09b64c2b , 0x7eb17cbd , 0xe7b82d07 , 0x90bf1d91 ,
@@ -971,6 +991,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
971991 {
972992 insn_size = 4 ;
973993 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
9741000 if (IsSymbol (*data))
9751001 {
9761002 Symbol& fsym = FindSymbol (*data);
@@ -989,6 +1015,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
9891015 for (ea_t k = CodeSymbols[j].Address ; k < CodeSymbols[j].Address + CodeSymbols[j].Size ; k += 4 )
9901016 {
9911017 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
9921024 if (IsSymbol (*data))
9931025 {
9941026 Symbol& fsym = FindSymbol (*data);
@@ -1016,6 +1048,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
10161048 for (ssize_t k = 0 ; k < RDataSymbols[j].Size ; k += 4 )
10171049 {
10181050 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
10191057 if (IsSymbol (*data))
10201058 {
10211059 Symbol& fsym = FindSymbol (*data);
@@ -1036,6 +1074,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
10361074 for (ssize_t k = 0 ; k < DataSymbols[j].Size ; k += 4 )
10371075 {
10381076 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
10391083 if (IsSymbol (*data))
10401084 {
10411085 Symbol& fsym = FindSymbol (*data);
0 commit comments