| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3042 人关注过本帖
标题:发布“动态调用API”MFC版本,界面精美……
只看楼主 加入收藏
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
收藏
得分:0 
楼主写这个程序的编程思想是什么呢? 其中规律是什么呢。

我用VC++6我怕谁?
2008-05-10 20:37
hjh10845
Rank: 1
来 自:火星
等 级:新手上路
帖 子:104
专家分:0
注 册:2008-3-31
收藏
得分:0 
请问LZ  你本身是什么职业的,写这个为什么呢?

<接受者>? or <创造者>?
2008-05-10 22:02
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
我本身什么职业?学生。(不要不相信,我没骗你)
这个程序是没事干,无聊的时候写的。
关于10#的朋友说的“当用户输入的参数个数与实际个数不符的时候,将会由于堆栈失衡而崩溃掉”这很正常。因为我也无法获知你输入的API到底有多少个参数,每个参数是不是指针。
像VB的调用API的思路应该就和我这个程序差不多:
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
'ByVal 传值(非指针)
'ByRef 传址(指针)
'String 类似于MFC的“CString”,也是指针的一种吧
'Alias "MessageBoxA" 为函数名取别名,这个后面的A或W是编码方式,看你是MBCS还是Unicode编码

因为VB不像VC一样有头文件和库,它纯粹是通过对字符串的解析来调用的,所以你是怎么定义的,哪怕是定义错了,多了一个参数,也照样正常编译。只是它会不会因为多了参数而崩溃掉,这我就不知到了。
(我看这个VB的API定义还不错,Aegisys你可以参考这种定义方式,像“user32.dll!MessageBoxA(0, "HelloWorld!", 0, 0);”总觉得太简陋了)

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-05-11 08:29
Aegisys
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-5-10
收藏
得分:0 
实际上你可以知道一个API需要多少参数.呵呵.
2008-05-11 09:34
Aegisys
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-5-10
收藏
得分:0 
实际上,在函数调用过程中,每一个参数都是固定的4个字节(32位系统).转什么参数是没有关系的,只要总数对就行
2008-05-11 09:35
Aegisys
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-5-10
收藏
得分:0 
在VB中,如果参数个数与实际不一样,也要崩溃的.

VB的定义太长,我仅仅提取了重要的参数.

[[it] 本帖最后由 Aegisys 于 2008-5-11 09:42 编辑 [/it]]
2008-05-11 09:37
Aegisys
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-5-10
收藏
得分:0 
让我们来看MessageBoxA的函数代码(WinXp sp2):
008F058A >    8BFF          MOV EDI,EDI
008F058C  /.  55            PUSH EBP
008F058D  |.  8BEC          MOV EBP,ESP
008F058F  |.  833D BC049100>CMP DWORD PTR DS:[9104BC],0
008F0596  |.  74 24         JE SHORT user32_1.008F05BC
008F0598  |.  64:A1 1800000>MOV EAX,DWORD PTR FS:[18]
008F059E  |.  6A 00         PUSH 0
008F05A0  |.  FF70 24       PUSH DWORD PTR DS:[EAX+24]
008F05A3  |.  68 240B9100   PUSH user32_1.00910B24
008F05A8  |.  FF15 C8128B00 CALL DWORD PTR DS:[<&KERNEL32.Interlocke>;  kernel32.InterlockedCompareExchange
008F05AE  |.  85C0          TEST EAX,EAX
008F05B0  |.  75 0A         JNZ SHORT user32_1.008F05BC
008F05B2  |.  C705 200B9100>MOV DWORD PTR DS:[910B20],1
008F05BC  |>  6A 00         PUSH 0                                   ; /LanguageID = 0 (LANG_NEUTRAL)
008F05BE  |.  FF75 14       PUSH DWORD PTR SS:[EBP+14]               ; |Style
008F05C1  |.  FF75 10       PUSH DWORD PTR SS:[EBP+10]               ; |Title
008F05C4  |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]                ; |Text
008F05C7  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
008F05CA  |.  E8 2D000000   CALL user32_1.MessageBoxExA              ; \MessageBoxExA
008F05CF  |.  5D            POP EBP
008F05D0  \.  C2 1000       RETN 10

通过最后的RETN 10H可以知道是四个参数.在程序中可以动态取得,KsSuperSword就用的这种方法.
2008-05-11 09:40
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
原来还有这种方法啊?你不说我还不知道。
你用的是什么反汇编工具呀?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-05-11 18:41
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
收藏
得分:0 
我也寫了一個可以調用 api 的類型庫,不過是針對腳本的,就是在腳本(VBScript/JScript) 中可以調用 api 函數, 而且可以讓 需要回調函數的 api 可以反調用 腳本裏自定義的函數. 或者需要接收或者傳送結構的函數. 這樣就可以在 Windows 下即使沒有安裝編程軟體,也可以打開個記事本來編寫一些有用的程式.
例如 EnumWindows, 在腳本裏可以按如下調用 (VBScript):

Dim hapi, ret
Dim pCallbackObj, lParam
Set hapi = CreateObject("Yeshirow.APIForScript")
Set pCallbackObj = New EnumWindowsProc
Set pCallbackObj.pCallback = GetRef("MyCallback")
ret = hapi.EnumWindows(pCallbackObj, lParam)

'下面是自定義回調 的 VBScript 函數
Public Function MyCallback(ByVal hWnd, ByRef lParam)
    ' 處理
    MyCallback = 1
End Function

' 其中 EnumWindowsProc 也是 VBScript 寫的一個類, 我已經將它寫好在 Callbacks.vbs 裏
' 可以複製來用, 內容是:
Class EnumWindowsProc
    Public hWnd, lParam ' lParam 是任意類型的數據,可以是 object 或者其他
    Public pCallback
End Class

' 下面是一個傳送結構的 GetWindowRect 的 VBScript
Dim hapi, hRect, ret
Set hapi = CreateObject("Yeshirow.APIForScript")
Set hRect = New RECT
ret = hapi.GetWindowRect(hapi.GetDesktopWindow(), hRect)
MsgBox "窗口邊界: (" & hRect.Left & ", " & hRect.Top & ")-(" & hRect.Right & ", " & hRect.Bottom & ")"


' 其中 RECT 也是一個 VBScript 寫的類,已經寫好在 APITypes.vbs 中, 可以複製過來用, 定義如下
Class RECT
    Public [Left], Top, [Right], Bottom
    Private Sub Class_Initialize()
        Me.Left = CLng(0)
        Me.Top = CLng(0)
        Me.Right =CLng(0)
        Me.Bottom = CLng(0)
    End Sub
End Class

原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2008-05-12 01:34
hjh10845
Rank: 1
来 自:火星
等 级:新手上路
帖 子:104
专家分:0
注 册:2008-3-31
收藏
得分:0 
请问这个程序是不获得文件入口地址?那用在外挂方面那不是很不错?

<接受者>? or <创造者>?
2008-05-12 23:47
快速回复:发布“动态调用API”MFC版本,界面精美……
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020381 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved