📄 importdlg.asm
字号:
;初始化显示输入表列表控件
_Initlist1 proc hWnd
local @stlvColumn:LVCOLUMN,@hList:DWORD
invoke RtlZeroMemory,addr @stlvColumn,sizeof @stlvColumn
invoke GetDlgItem,hWnd,IDC_LIST1_IMPORT
mov @hList,eax
invoke SendMessage,@hList,LVM_SETEXTENDEDLISTVIEWSTYLE,NULL,LVS_EX_FULLROWSELECT
mov @stlvColumn.imask,LVCF_FMT or LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM
mov @stlvColumn.fmt,LVCFMT_LEFT
mov @stlvColumn.iSubItem,0
mov @stlvColumn.lx,90
mov @stlvColumn.pszText,OFFSET szDllName
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTCOLUMN,0,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.fmt,LVCFMT_LEFT
mov @stlvColumn.lx,120
mov @stlvColumn.pszText,OFFSET szOriginal
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTCOLUMN,1,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.lx,120
mov @stlvColumn.pszText,OFFSET szTime
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTCOLUMN,2,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.lx,120
mov @stlvColumn.pszText,OFFSET szForward
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTCOLUMN,3,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.lx,60
mov @stlvColumn.pszText,OFFSET szname
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTCOLUMN,4,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.lx,85
mov @stlvColumn.pszText,OFFSET szFirst
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTCOLUMN,5,addr @stlvColumn
ret
_Initlist1 endp
_Initlist2 proc hWnd
local @stlvColumn:LVCOLUMN,@hList:DWORD
invoke RtlZeroMemory,addr @stlvColumn,sizeof @stlvColumn
invoke GetDlgItem,hWnd,IDC_LIST2_IMPORTFUN
mov @hList,eax
invoke SendMessage,@hList,LVM_SETEXTENDEDLISTVIEWSTYLE,NULL,LVS_EX_FULLROWSELECT
mov @stlvColumn.imask,LVCF_FMT or LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM
mov @stlvColumn.fmt,LVCFMT_LEFT
mov @stlvColumn.iSubItem,0
mov @stlvColumn.lx,100
mov @stlvColumn.pszText,OFFSET szThunkRVA
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_INSERTCOLUMN,0,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.fmt,LVCFMT_LEFT
mov @stlvColumn.lx,100
mov @stlvColumn.pszText,OFFSET szThunkValue
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_INSERTCOLUMN,1,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.lx,100
mov @stlvColumn.pszText,OFFSET szHint
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_INSERTCOLUMN,2,addr @stlvColumn
inc @stlvColumn.iSubItem
mov @stlvColumn.lx,200
mov @stlvColumn.pszText,OFFSET szAPIName
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_INSERTCOLUMN,3,addr @stlvColumn
ret
_Initlist2 endp
;显示输入表
_ShowImport proc hWnd,_lpFile,_lpPEHeader
local @stlvItem:LVITEM
local @szbuffer[1024]:byte
pushad
mov esi,_lpPEHeader
assume esi:ptr IMAGE_NT_HEADERS
mov eax,[esi].OptionalHeader.DataDirectory[8].VirtualAddress
.if !eax
invoke MessageBox,hWnd,addr szErrNoImport,NULL,MB_OK
jmp _ret
.endif
invoke _RVAToOffset,_lpPEHeader,eax
add eax,_lpFile
mov esi,eax
assume esi:ptr IMAGE_IMPORT_DESCRIPTOR
.while [esi].OriginalFirstThunk || [esi].TimeDateStamp || \
[esi].ForwarderChain || [esi].Name1 || [esi].FirstThunk
invoke _RVAToOffset,_lpPEHeader,[esi].Name1
add eax,_lpFile
mov ebx,eax
invoke RtlZeroMemory,addr @stlvItem,sizeof @stlvItem
mov @stlvItem.imask,LVIF_TEXT
mov @stlvItem.iItem,0
mov @stlvItem.pszText,ebx
mov @stlvItem.iSubItem,0
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_INSERTITEM,0,addr @stlvItem
invoke wsprintf,addr @szbuffer, offset szFmtHex,[esi].OriginalFirstThunk
lea ebx,@szbuffer
mov @stlvItem.pszText,ebx
mov @stlvItem.iSubItem,1
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_SETITEM,0,addr @stlvItem
invoke wsprintf,addr @szbuffer, offset szFmtHex,[esi].TimeDateStamp
lea ebx,@szbuffer
mov @stlvItem.pszText,ebx
mov @stlvItem.iSubItem,2
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_SETITEM,0,addr @stlvItem
invoke wsprintf,addr @szbuffer, offset szFmtHex,[esi].ForwarderChain
lea ebx,@szbuffer
mov @stlvItem.pszText,ebx
mov @stlvItem.iSubItem,3
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_SETITEM,0,addr @stlvItem
invoke wsprintf,addr @szbuffer, offset szFmtHex,[esi].Name1
lea ebx,@szbuffer
mov @stlvItem.pszText,ebx
mov @stlvItem.iSubItem,4
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_SETITEM,0,addr @stlvItem
invoke wsprintf,addr @szbuffer, offset szFmtHex,[esi].FirstThunk
lea ebx,@szbuffer
mov @stlvItem.pszText,ebx
mov @stlvItem.iSubItem,5
invoke SendDlgItemMessage,hWnd,IDC_LIST1_IMPORT,LVM_SETITEM,0,addr @stlvItem
inc @stlvItem.iItem
add esi,sizeof IMAGE_IMPORT_DESCRIPTOR
.endw
dec @stlvItem.iItem
mov eax,@stlvItem.iItem
_ret:
assume esi:nothing
popad
ret
_ShowImport endp
_ShowFunction proc hWnd,_lpFile,_lpPEHeader,index
local @stlvItem:LVITEM
local @szbuffer[64]:byte,@szbuffer1[64]:byte,@lpThunkRVA:dword,@hList,@lpThunkVal
local @dwHint:dword
pushad
mov esi,_lpPEHeader
assume esi:ptr IMAGE_NT_HEADERS
mov eax,[esi].OptionalHeader.DataDirectory[8].VirtualAddress
.if !eax
invoke MessageBox,hWnd,addr szErrNoImport,NULL,MB_OK
jmp _ret
.endif
invoke _RVAToOffset,_lpPEHeader,eax
add eax,_lpFile
mov esi,eax
mov eax,sizeof IMAGE_IMPORT_DESCRIPTOR
mul index
add esi,eax
assume esi:ptr IMAGE_IMPORT_DESCRIPTOR
.if [esi].OriginalFirstThunk
mov eax,[esi].OriginalFirstThunk
.else
mov eax,[esi].FirstThunk
.endif
mov @lpThunkRVA,eax
invoke _RVAToOffset,_lpPEHeader,eax
add eax,_lpFile
xor ebx,ebx
mov ebx,eax
invoke RtlZeroMemory,addr @stlvItem,sizeof @stlvItem
invoke GetDlgItem,hWnd,IDC_LIST2_IMPORTFUN
mov @hList,eax
invoke SendMessage,@hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT
invoke SendMessage,@hList,LVM_DELETEALLITEMS ,0,0
.while dword ptr [ebx]
push ebx
push edx
mov @stlvItem.imask,LVIF_TEXT
mov @stlvItem.iItem,0
invoke wsprintf,addr @szbuffer, offset szFmtHex,@lpThunkRVA
lea edx,@szbuffer
mov @stlvItem.pszText,edx
mov @stlvItem.iSubItem,0
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_INSERTITEM,0,addr @stlvItem
invoke wsprintf,addr @szbuffer, offset szFmtHex,dword ptr [ebx]
lea edx,@szbuffer
mov @stlvItem.pszText,edx
mov @stlvItem.iSubItem,1
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_SETITEM,0,addr @stlvItem
.if dword ptr [ebx] & IMAGE_ORDINAL_FLAG32 ;判断最高位为1,函数是按序号导入
mov eax,dword ptr [ebx]
and eax,0FFFFh
invoke wsprintf,addr @szbuffer, offset szFmtHex,eax
invoke wsprintf,addr @szbuffer1,offset szFmtchar,addr szHint1
.else
invoke _RVAToOffset,_lpPEHeader,dword ptr [ebx]
add eax,_lpFile
assume eax:ptr IMAGE_IMPORT_BY_NAME
mov edx,dword ptr [eax]
and edx,0ffffh
mov @dwHint,edx
invoke wsprintf,addr @szbuffer, offset szFmtchar,addr [eax].Name1
invoke wsprintf,addr @szbuffer1,offset szFmtHex1,@dwHint
.endif
lea edx,@szbuffer1
mov @stlvItem.pszText,edx
mov @stlvItem.iSubItem,2
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_SETITEM,0,addr @stlvItem
lea edx,@szbuffer
mov @stlvItem.pszText,edx
mov @stlvItem.iSubItem,3
invoke SendDlgItemMessage,hWnd,IDC_LIST2_IMPORTFUN,LVM_SETITEM,0,addr @stlvItem
pop edx
pop ebx
inc @stlvItem.iItem
add ebx,4
.endw
_ret:
assume eax:nothing
assume esi:nothing
popad
ret
_ShowFunction endp
;Import?
_ProcDlgImport proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke InitCommonControls
invoke _Initlist1,hWnd
invoke _Initlist2,hWnd
invoke _UnLoadFile,offset stMapFile
invoke _LoadIsPEFile,offset szFileName,offset stMapFile,hWnd
invoke _ShowImport,hWnd,stMapFile.ImageBase,stMapFile.lpPEHeader
ret
.elseif eax == WM_NOTIFY
pushad
mov eax,wParam
mov ebx,lParam
.if ax == IDC_LIST1_IMPORT
assume ebx:ptr NMHDR
.if [ebx].code == LVN_ITEMCHANGED
assume ebx:ptr NM_LISTVIEW
.if [ebx].uNewState
invoke _ShowFunction,hWnd,stMapFile.ImageBase,stMapFile.lpPEHeader,[ebx].iItem
.endif
.endif
.endif
assume ebx:nothing
popad
ret
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgImport endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -