Search results for 'Code/C'

  1. 2012.08.25 -- ASLR&DEP viewer

ASLR&DEP viewer

2012. 8. 25. 11:41


Windows에서 특정 프로그램을 실행할 때 로딩되는 라이브러리 목록과 

각 라이브러리들의 ASLR과 DEP flag 설정 여부를 보여준다.


원래는 누군가가 만든 툴처럼 여기에 gadget finder를 추가해서 windows 환경에서 exploit 만들 때 쓸려고 했었다.


mfc는 분석만 해보고 만져본적이 없어서 api로 만들었는데,

기능을 더 추가하면 ui 배치를 어떻게 할지가 고민도 되고 해서 걍 팽개침.


마저 해볼까 라는 생각에 또 버려둘까 두려워 이렇게 올려둠.



#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
#include <Psapi.h>
#include <time.h>
#include "resource.h"
#include <commctrl.h>
#include <time.h>

#pragma comment(lib, "psapi.lib")

#define ID_LISTBOX 100

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
DWORD checkTarget(char *modName, int iNumber);

HINSTANCE g_hInst;                                     
HWND hList;
OPENFILENAME OFN;

const char* lpszClass="ASLR&DEP Viewer";

DWORD i;
LVCOLUMN COL;
LVITEM LI;

HMODULE hMod;
HMODULE hModules[1024] = {0};
HANDLE hProcess;
DWORD ProcArray[1024] = {0};
DWORD nBytes, NumProc, nPid, cbNeeded;

char szModName[MAX_PATH];

STARTUPINFO si;
PROCESS_INFORMATION pi;

char str[300];
char lpstrFile[MAX_PATH] = "";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst=hInstance;
 
	WndClass.cbClsExtra=0;
	WndClass.cbWndExtra=0;
	WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	WndClass.hInstance=hInstance;
	WndClass.lpfnWndProc=WndProc;
	WndClass.lpszClassName=lpszClass;
	WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
	WndClass.style=CS_HREDRAW | CS_VREDRAW;

	RegisterClass(&WndClass);
	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW|WS_VSCROLL,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
 
	while (GetMessage(&Message,NULL,0,0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}

	return (int)Message.wParam;
}

void SetListViewStyle(HWND hList, DWORD dwView)
{
	DWORD dwStyle;

	dwStyle=GetWindowLong(hList, GWL_STYLE);
	if ((dwStyle & LVS_TYPEMASK) != dwView) {
		SetWindowLong(hList, GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | dwView);
	}
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{

	switch (iMessage) {
		case WM_CREATE:
			hList=CreateWindow(WC_LISTVIEW,NULL,WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT,10,10,600,300,hWnd,NULL,g_hInst,NULL);

			COL.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
			COL.fmt = LVCFMT_LEFT;
			COL.cx=150;
			COL.pszText="Name";
			COL.iSubItem=0;
			ListView_InsertColumn(hList,0,&COL);

			COL.pszText="ASLR";
			COL.iSubItem=1;
			ListView_InsertColumn(hList,1,&COL);

			COL.pszText="DEP";
			COL.iSubItem=2;
			ListView_InsertColumn(hList,2,&COL);
			return 0;

		case WM_COMMAND:
			switch(LOWORD(wParam))
			{			
				case ID_FILE_OPEN1:
					memset(&OFN, 0, sizeof(OPENFILENAME));
					OFN.lStructSize = sizeof(OPENFILENAME);
					OFN.hwndOwner=hWnd;
					OFN.lpstrFilter="Exe file\0*.exe\0Dll file\0*.dll\0";
					OFN.lpstrFile=lpstrFile;
					OFN.nMaxFile=255;
					OFN.lpstrInitialDir="c:\\";
#if 1
					if (GetOpenFileName(&OFN)!=0) {
						//wsprintf(str,"You select %s .",OFN.lpstrFile);
						//MessageBox(hWnd,str,"Yeah",MB_OK);
					}
					else {
						MessageBox(hWnd, "You should select file.", "Error", MB_OK);
						return 0;
					}
#endif

					if( !CreateProcess( NULL,  
						lpstrFile,        
						NULL,           
						NULL,           
						FALSE,          
						//CREATE_NO_WINDOW|CREATE_SUSPENDED,              
						CREATE_NO_WINDOW,
						NULL,           
						NULL,           
						&si,            
						&pi )           
					) 
					{
						MessageBox(hWnd, "CreateProcess failed.", "Error", MB_OK);
					}

					hProcess = pi.hProcess;
					nPid = pi.dwProcessId;					
					
					Sleep(1000);

					if(EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded))
					{
						

						for (i=0; i < (signed)(cbNeeded / sizeof(HMODULE)); i++)
						{
							if (GetModuleFileNameEx(hProcess, hModules[i], szModName, sizeof(szModName)/sizeof(char))&&i!=0)
							{
								checkTarget(szModName, i);
							}
						}
					}
					else
					{
						MessageBox(hWnd, "EnumProcessModule failed.", "Error", MB_OK);
					}
					break;
				case ID_FILE_EXIT1:
					break;
			}
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
	}

	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

DWORD error(const char* message){
	MessageBox(NULL,message,"ERROR",MB_OK);
	return 1;
}

DWORD checkTarget(char *modName, int iNumber){
	HANDLE h = CreateFileA(modName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(h==INVALID_HANDLE_VALUE)
		return error("Cannot open file.");
	BYTE headers[1000];
	DWORD read;
	ReadFile(h,headers,1000,&read,NULL);

	IMAGE_DOS_HEADER* idh = (IMAGE_DOS_HEADER*)headers;
	if(read<sizeof(IMAGE_DOS_HEADER))
		return error("Invalid DOS header");
	IMAGE_NT_HEADERS* inh =(IMAGE_NT_HEADERS*)(headers+idh->e_lfanew);
	if(read < idh->e_lfanew + sizeof(IMAGE_NT_HEADERS))
		return error("Invalid NT header");
	if(inh->Signature!=0x00004550)
		return error("Invalid NT header");

	BOOL aslr = inh->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE;
	
	BOOL dep = inh->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_NX_COMPAT;

	DWORD listNum = ListView_GetItemCount(hList);

	LI.mask = LVIF_TEXT;
	LI.state = 0;
	LI.stateMask = 0;

	LI.iSubItem=0;
	LI.iItem=iNumber;	
	LI.pszText = modName;
	ListView_InsertItem(hList, &LI);

	if (aslr) {
		ListView_SetItemText(hList,listNum,1,"ASLR");
	}
	else {
		ListView_SetItemText(hList, listNum, 1, "No ASLR");
	}
	if (dep) {
		ListView_SetItemText(hList, listNum, 2, "DEP");
	}
	else {
		ListView_SetItemText(hList, listNum, 2, "No DEP");
	}

	return 0;
}


badcob Code/C