#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) {
}
else
{
MessageBox(hWnd,
"You should select file."
,
"Error"
, MB_OK);
return
0;
}
#endif
if
( !CreateProcess( NULL,
lpstrFile,
NULL,
NULL,
FALSE,
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;
}