Skip to content

Reduce code duplication, log bad pointers #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 72 additions & 152 deletions dllmain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,31 @@
#include <idp.hpp>
#include <loader.hpp>
#include <kernwin.hpp>
#include <help.h>
#include <name.hpp>
#include "cvinfo.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#define CHECK_SYMBOL_PTR

#ifdef CHECK_SYMBOL_PTR
bool is_bad_ptr(void * p)
{
MEMORY_BASIC_INFORMATION mbi = {0};
if (::VirtualQuery(p, &mbi, sizeof(mbi))) {
DWORD mask = (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY);
bool b = !(mbi.Protect & mask);
// check if the page is not a guard page
if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) {
b = true;
}
return b;
}
return true;
}
#endif

unsigned long crc_table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
Expand Down Expand Up @@ -361,18 +381,19 @@ void add_entry(unlink_entry e)
}
}

struct ahandler_unlink_t : public action_handler_t
bool unlink_action(ea_t ea, int i)
{
virtual int idaapi activate(action_activation_ctx_t*) override
if (ea != BADADDR)
{
ea_t ea = get_screen_ea();
if (is_code(get_flags(ea)))
{
qstring func_name;
if (get_func_name(&func_name, ea) > 0)
{
iterate_func_chunks(get_func(ea), get_func_chunks, nullptr);
int i = get_module();
if (i == -1) {
i = get_module();
}
if (i != -1)
{
unlink_entry e;
Expand All @@ -383,7 +404,7 @@ struct ahandler_unlink_t : public action_handler_t
int func_size = func_end - func_start;
add_entry(e);
insn_t insn;
int insn_size;
int insn_size = 0;
for (ea_t k = func_start; k < func_start + func_size; k += insn_size)
{
flags_t _flags = get_flags(k);
Expand Down Expand Up @@ -520,7 +541,9 @@ struct ahandler_unlink_t : public action_handler_t
if (get_name(&data_name, ea) > 0)
{
ea_t data_start = get_item_head(ea);
int i = get_module();
if (i == -1) {
i = get_module();
}
if (i != -1)
{
unlink_entry e;
Expand All @@ -534,6 +557,17 @@ struct ahandler_unlink_t : public action_handler_t
}
return true;
}
return false;
}

struct ahandler_unlink_t : public action_handler_t
{
virtual int idaapi activate(action_activation_ctx_t*) override
{
ea_t ea = get_screen_ea();
unlink_action(ea, -1);
return true;
}

virtual action_state_t idaapi update(action_update_ctx_t*) override
{
Expand All @@ -553,147 +587,7 @@ struct ahandler_unlink_func_t : public action_handler_t
{
func_t* func = getn_func(ctx->chooser_selection[x]);
ea_t ea = func->start_ea;
qstring func_name;
if (get_func_name(&func_name, ea) > 0)
{
iterate_func_chunks(get_func(ea), get_func_chunks, nullptr);
unlink_entry e;
e.ea = func_start;
e.is_extern = false;
e.is_local = false;
e.module_index = i;
int func_size = func_end - func_start;
add_entry(e);
insn_t insn;
int insn_size;
for (ea_t k = func_start; k < func_start + func_size; k += insn_size)
{
flags_t _flags = get_flags(k);
if (is_code(_flags) || is_align(_flags))
{
insn_size = decode_insn(&insn, k);
for (int index = 0; index < 2; index++)
{
switch (insn.ops[index].type)
{
case o_mem:
case o_displ:
if (!is_numop(_flags, index))
{
if (is_code(get_flags(insn.ops[index].addr)))
{
qstring func_name2;
if (get_func_name(&func_name2, insn.ops[index].addr) > 0)
{
unlink_entry e2;
e2.ea = insn.ops[index].addr;
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
e2.module_index = i;
add_entry(e2);
}
}
else if (is_data(get_flags(insn.ops[index].addr)))
{
qstring data_name2;
if (get_name(&data_name2, insn.ops[index].addr) > 0)
{
ea_t data_start = get_item_head(insn.ops[index].addr);
unlink_entry e2;
e2.ea = data_start;
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
e2.module_index = i;
add_entry(e2);
}
}
}
break;
case o_imm:
if (!is_numop(_flags, index))
{
if (is_code(get_flags(insn.ops[index].value)))
{
qstring func_name2;
if (get_func_name(&func_name2, insn.ops[index].value) > 0)
{
unlink_entry e2;
e2.ea = insn.ops[index].value;
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
e2.module_index = i;
add_entry(e2);
}
}
else if (is_data(get_flags(insn.ops[index].value)))
{
qstring data_name2;
if (get_name(&data_name2, insn.ops[index].value) > 0)
{
ea_t data_start = get_item_head(insn.ops[index].value);
unlink_entry e2;
e2.ea = data_start;
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
e2.module_index = i;
add_entry(e2);
}
}
}
break;
case o_near:
if (insn.ops[index].dtype == dt_dword && (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size))
{
if (is_code(get_flags(insn.ops[index].addr)))
{
qstring func_name2;
if (get_func_name(&func_name2, insn.ops[index].addr) > 0)
{
unlink_entry e2;
e2.ea = insn.ops[index].addr;
e2.is_extern = true;
e2.is_local = false;
e2.module_index = i;
add_entry(e2);
}
}
else if (is_data(get_flags(insn.ops[index].addr)))
{
qstring data_name2;
if (get_name(&data_name2, insn.ops[index].addr) > 0)
{
ea_t data_start = get_item_head(insn.ops[index].addr);
unlink_entry e2;
e2.ea = data_start;
e2.is_extern = true;
e2.is_local = false;
e2.module_index = i;
add_entry(e2);
}
}
}
break;
}
}
}
else
{
uint32 address = get_dword(k);

if ((address > func_start && address < func_start + func_size))
{
unlink_entry e2;
e2.ea = address;
e2.is_extern = false;
e2.is_local = true;
e2.module_index = i;
add_entry(e2);
}

insn_size = 4;
}
}
}
unlink_action(ea, i);
}
}

Expand Down Expand Up @@ -769,7 +663,8 @@ bool IsSymbol(ea_t address)
{
for (size_t i = 0; i < CodeSymbols.size(); i++)
{
if (address >= CodeSymbols[CodeSymbols.size() - i - 1].Address && address < CodeSymbols[CodeSymbols.size() - i - 1].Address + CodeSymbols[CodeSymbols.size() - i - 1].Size)
size_t index = CodeSymbols.size() - i - 1;
if (address >= CodeSymbols[index].Address && address < CodeSymbols[index].Address + CodeSymbols[index].Size)
{
return true;
}
Expand Down Expand Up @@ -809,11 +704,12 @@ Symbol& FindSymbol(ea_t address, bool local = true)
{
for (size_t i = 0; i < CodeSymbols.size(); i++)
{
if (address >= CodeSymbols[CodeSymbols.size() - i - 1].Address && address < CodeSymbols[CodeSymbols.size() - i - 1].Address + CodeSymbols[CodeSymbols.size() - i - 1].Size)
size_t index = CodeSymbols.size() - i - 1;
if (address >= CodeSymbols[index].Address && address < CodeSymbols[index].Address + CodeSymbols[index].Size)
{
if (local || !CodeSymbols[CodeSymbols.size() - i - 1].IsLocal)
if (local || !CodeSymbols[index].IsLocal)
{
return CodeSymbols[CodeSymbols.size() - i - 1];
return CodeSymbols[index];
}
}
}
Expand Down Expand Up @@ -1022,7 +918,7 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
if (!CodeSymbols[j].IsData)
{
insn_t insn;
int insn_size;
int insn_size = 0;
for (ea_t k = CodeSymbols[j].Address; k < CodeSymbols[j].Address + CodeSymbols[j].Size; k += insn_size)
{
int pos = k - CodeSymbols[j].Address;
Expand Down Expand Up @@ -1091,6 +987,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
{
insn_size = 4;
unsigned int* data = (unsigned int*)(CodeSymbols[j].Data + pos);
#ifdef CHECK_SYMBOL_PTR
if (is_bad_ptr(data)) {
msg("unlinker --- 1 Invalid Address pos %x\n", (int)pos);
continue;
}
#endif
if (IsSymbol(*data))
{
Symbol& fsym = FindSymbol(*data);
Expand All @@ -1109,6 +1011,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
for (ea_t k = CodeSymbols[j].Address; k < CodeSymbols[j].Address + CodeSymbols[j].Size; k += 4)
{
unsigned int* data = (unsigned int*)(CodeSymbols[j].Data + k);
#ifdef CHECK_SYMBOL_PTR
if (is_bad_ptr(data)) {
msg("unlinker --- 2 Invalid k %x\n", (int)k);
continue;
}
#endif
if (IsSymbol(*data))
{
Symbol& fsym = FindSymbol(*data);
Expand Down Expand Up @@ -1136,6 +1044,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
for (ssize_t k = 0; k < RDataSymbols[j].Size; k += 4)
{
unsigned int* data = (unsigned int*)(RDataSymbols[j].Data + k);
#ifdef CHECK_SYMBOL_PTR
if (is_bad_ptr(data)) {
msg("unlinker --- 3 Invalid Address k %x\n", (int)k);
continue;
}
#endif
if (IsSymbol(*data))
{
Symbol& fsym = FindSymbol(*data);
Expand All @@ -1156,6 +1070,12 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
for (ssize_t k = 0; k < DataSymbols[j].Size; k += 4)
{
unsigned int* data = (unsigned int*)(DataSymbols[j].Data + k);
#ifdef CHECK_SYMBOL_PTR
if (is_bad_ptr(data)) {
msg("unlinker --- 4 Invalid Address k %x\n", (int)k);
continue;
}
#endif
if (IsSymbol(*data))
{
Symbol& fsym = FindSymbol(*data);
Expand Down