Skip to content

Commit 4898a83

Browse files
committed
Option to log bad pointers
1 parent 7295a08 commit 4898a83

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

dllmain.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,31 @@
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+
1030
unsigned 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

Comments
 (0)