作者在 2014-03-18 08:18:00 发布以下内容
今天无聊写了这个DLL函数的查看器代码,也许有人用得上,顺便也复习下PE结构!
VFP CODE:
***本代码由行者SCX2PRG自动转换***
PUBLIC LaodForm
LaodForm=CreateObject("MyForm")
LaodForm.Show
RETURN
*-------------------------------------------------------------*
*-VFP应用程式算法群:12787940 行者孙:310727570-*
*-------------------------------------------------------------*
DEFINE CLASS MyForm AS form
Visible=.T.
Top = 63
Left = 274
Height = 324
Width = 385
DoCreate = .T.
Picture =" "
Caption = "DLL函数查看器-行者示例"
Name = "Form1"
PROCEDURE Init
This.AddObject("Dataenvironment","ClassName1")
This.AddObject("Command5","ClassName2")
This.AddObject("List","ClassName3")
This.AddObject("Text1","ClassName4")
ThisForm.List.View=3
ThisForm.List.fullRowSelect= .T.
ThisForm.List.appearance=0
ThisForm.List.ColumnHeaders.Add(1,"C1","序号",40,0)
ThisForm.List.ColumnHeaders.Add(2,"C2","函数名称",200,0)
ThisForm.List.ColumnHeaders.Add(3,"C3","函数地址",120,0)
ENDPROC
ENDDEFINE
DEFINE CLASS ClassName1 AS dataenvironment
Visible=.T.
Top = 0
Left = 0
Width = 0
Height = 0
DataSource = .NULL.
Name = "Dataenvironment"
ENDDEFINE
DEFINE CLASS ClassName2 AS commandbutton
Visible=.T.
Top = 12
Left = 12
Height = 25
Width = 60
Caption = "开打文件"
Name = "Command5"
PROCEDURE Click
DECLARE Long ImageDirectoryEntryToData IN imagehlp Long, long, long, Long@
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE INTEGER LoadLibrary IN kernel32;
STRING lpLibFileName
DECLARE INTEGER FreeLibrary IN kernel32;
INTEGER hLibModule
DECLARE Long ImageDirectoryEntryToData IN imagehlp long HANDLE,long,long,Long @
DECLARE integer GetProcAddress IN WIN32API integer hModule, string procname
GENERIC_READ=0x80000000
FILE_SHARE_READ = 1
FILE_SHARE_WRITE=2
OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL = 0x80
IMAGE_DIRECTORY_ENTRY_EXPORT =0
DllFile=GETFILE('dll')
IF FILE(DllFile)
thisform.text1.Value=DllFile
hLibModule=LoadLibrary(DllFile)
IF hLibModule>0
ulSize=0
AdrEXPORT=ImageDirectoryEntryToData(hLibModule,1,IMAGE_DIRECTORY_ENTRY_EXPORT,@ulSize)
IF AdrEXPORT>0
EXPORT_DIRECTORY=SYS(2600,AdrEXPORT,ulSize)
NumberOfFunctions=CTOBIN(SYS(2600,AdrEXPORT+24,4),'4rs')&&函数数量
FunctionsAdress=AdrEXPORT+44&&函数虚拟偏移地址开始地址
dPtr=4*NumberOfFunctions*2+NumberOfFunctions*2-4&&计算从函数虚拟地址到函数名列表地址的字节数
NamePtr=FunctionsAdress+dPtr&&得到函数名称列表编译地址
NameStr=SYS(2600,NamePtr,ulSize-dPtr-44)
NameStr=0h00+namestr
ThisForm.List.ListItems.Clear
FOR i=2 TO NumberOfFunctions+1&&往LISTVIEW中添加记录
DllName=STREXTRACT(namestr,0h00,0h00,i)
DllEnty=transform(GetProcAddress(hLibModule,DllName)-hLibModule,'@0')
sd=ThisForm.List.ListItems.Add(i-1,"Co"+ALLTRIM(STR(i)),ALLTRIM(STR(i-1)))
sd.SubItems(1)=STRCONV(DllName,11)&&注意:这里DllName是UTF8编码,所以要转换,不然出现乱码,SQL有时出现乱码也是因此。
sd.SubItems(2)=ALLTRIM(DllEnty)
ENDF
ENDI
FreeLibrary(hLibModule)
ENDIF
ENDI
ENDPROC
ENDDEFINE
DEFINE CLASS ClassName3 AS olecontrol
OleClass="MSComctlLib.ListViewCtrl.2"
Visible=.T.
Top = 48
Left = 12
Height = 264
Width = 360
Name = "List"
ENDDEFINE
DEFINE CLASS ClassName4 AS textbox
Visible=.T.
FontSize = 10
Height = 24
Left = 72
Top = 12
Width = 300
Name = "Text1"
ENDDEFINE
Image:
VFP CODE:
***本代码由行者SCX2PRG自动转换***
PUBLIC LaodForm
LaodForm=CreateObject("MyForm")
LaodForm.Show
RETURN
*-------------------------------------------------------------*
*-VFP应用程式算法群:12787940 行者孙:310727570-*
*-------------------------------------------------------------*
DEFINE CLASS MyForm AS form
Visible=.T.
Top = 63
Left = 274
Height = 324
Width = 385
DoCreate = .T.
Picture =" "
Caption = "DLL函数查看器-行者示例"
Name = "Form1"
PROCEDURE Init
This.AddObject("Dataenvironment","ClassName1")
This.AddObject("Command5","ClassName2")
This.AddObject("List","ClassName3")
This.AddObject("Text1","ClassName4")
ThisForm.List.View=3
ThisForm.List.fullRowSelect= .T.
ThisForm.List.appearance=0
ThisForm.List.ColumnHeaders.Add(1,"C1","序号",40,0)
ThisForm.List.ColumnHeaders.Add(2,"C2","函数名称",200,0)
ThisForm.List.ColumnHeaders.Add(3,"C3","函数地址",120,0)
ENDPROC
ENDDEFINE
DEFINE CLASS ClassName1 AS dataenvironment
Visible=.T.
Top = 0
Left = 0
Width = 0
Height = 0
DataSource = .NULL.
Name = "Dataenvironment"
ENDDEFINE
DEFINE CLASS ClassName2 AS commandbutton
Visible=.T.
Top = 12
Left = 12
Height = 25
Width = 60
Caption = "开打文件"
Name = "Command5"
PROCEDURE Click
DECLARE Long ImageDirectoryEntryToData IN imagehlp Long, long, long, Long@
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE INTEGER LoadLibrary IN kernel32;
STRING lpLibFileName
DECLARE INTEGER FreeLibrary IN kernel32;
INTEGER hLibModule
DECLARE Long ImageDirectoryEntryToData IN imagehlp long HANDLE,long,long,Long @
DECLARE integer GetProcAddress IN WIN32API integer hModule, string procname
GENERIC_READ=0x80000000
FILE_SHARE_READ = 1
FILE_SHARE_WRITE=2
OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL = 0x80
IMAGE_DIRECTORY_ENTRY_EXPORT =0
DllFile=GETFILE('dll')
IF FILE(DllFile)
thisform.text1.Value=DllFile
hLibModule=LoadLibrary(DllFile)
IF hLibModule>0
ulSize=0
AdrEXPORT=ImageDirectoryEntryToData(hLibModule,1,IMAGE_DIRECTORY_ENTRY_EXPORT,@ulSize)
IF AdrEXPORT>0
EXPORT_DIRECTORY=SYS(2600,AdrEXPORT,ulSize)
NumberOfFunctions=CTOBIN(SYS(2600,AdrEXPORT+24,4),'4rs')&&函数数量
FunctionsAdress=AdrEXPORT+44&&函数虚拟偏移地址开始地址
dPtr=4*NumberOfFunctions*2+NumberOfFunctions*2-4&&计算从函数虚拟地址到函数名列表地址的字节数
NamePtr=FunctionsAdress+dPtr&&得到函数名称列表编译地址
NameStr=SYS(2600,NamePtr,ulSize-dPtr-44)
NameStr=0h00+namestr
ThisForm.List.ListItems.Clear
FOR i=2 TO NumberOfFunctions+1&&往LISTVIEW中添加记录
DllName=STREXTRACT(namestr,0h00,0h00,i)
DllEnty=transform(GetProcAddress(hLibModule,DllName)-hLibModule,'@0')
sd=ThisForm.List.ListItems.Add(i-1,"Co"+ALLTRIM(STR(i)),ALLTRIM(STR(i-1)))
sd.SubItems(1)=STRCONV(DllName,11)&&注意:这里DllName是UTF8编码,所以要转换,不然出现乱码,SQL有时出现乱码也是因此。
sd.SubItems(2)=ALLTRIM(DllEnty)
ENDF
ENDI
FreeLibrary(hLibModule)
ENDIF
ENDI
ENDPROC
ENDDEFINE
DEFINE CLASS ClassName3 AS olecontrol
OleClass="MSComctlLib.ListViewCtrl.2"
Visible=.T.
Top = 48
Left = 12
Height = 264
Width = 360
Name = "List"
ENDDEFINE
DEFINE CLASS ClassName4 AS textbox
Visible=.T.
FontSize = 10
Height = 24
Left = 72
Top = 12
Width = 300
Name = "Text1"
ENDDEFINE
Image: