注册 登录
编程论坛 C++教室

发布“动态调用API”MFC版本,界面精美……

flyue 发布于 2008-05-02 18:26, 3045 次点击
最近赶制出来的,可以调用任意API函数,功能强大,界面美观。
1.0版本下载:
只有本站会员才能查看附件,请 登录

2.1版本下载:
只有本站会员才能查看附件,请 登录

相关文档:
https://bbs.bccn.net/thread-211992-1-1.html(控制台版本)
https://bbs.bccn.net/thread-211941-1-1.html(有代码)

[[it] 本帖最后由 flyue 于 2008-5-4 17:54 编辑 [/it]]
20 回复
#2
flyue2008-05-02 18:31
嘿嘿,怎么样?界面可是XP样式的哦
怎么用我就不说了,想必聪明的大家一看就知道用了。
这个东东随USB带到网吧里,想要什么功能都有了,要知道不是我们控制电脑,而是程序控制电脑!!有了这个,整个电脑的功能都暴露在你眼前啦
代码也有(https://bbs.bccn.net/thread-211941-1-1.html),如果看得懂那最好,你自己也来做一个,来看看谁做的更好
#3
野比2008-05-02 23:19
很不错,研究下,试试移植到 .NET。。。嘿嘿
但是网吧都不能用 U 口的,我去的都是这种
#4
flyue2008-05-03 20:35
目前的这个版本还不够完善,我又写了更实用的!
近期发布!!!
#5
flyue2008-05-04 17:56
发布了最新的v2.1版本,敬请下载!
#6
Aegisys2008-05-10 14:21
晕,偶写的一堆破代码起了作用了.不过偶现在已经能够拦截任意函数调用了..呵呵
#7
Aegisys2008-05-10 14:23
偶写的InitFunctionCall是根据C语言格式的调用规则,直接输入:
user32.dll!MessageBoxA(0, "HelloWorld!", 0, 0);
就可以调用,不需要再设计界面,呵呵.
#8
Aegisys2008-05-10 14:25
不过你说"没有脱离编译器"倒是让我不明白.我这个东西运行不需要编译器支持的.InitFunctionCall的作用就是像编译器一样解释字符串
#9
flyue2008-05-10 16:33
这几天中病毒了(windows.ext,MSDOS.bat),我用HexEditor看到了是一个叫做“WYCao (无忧草)”的垃圾程序员写的病毒,导致了我家所有的EXE文件都被合并,且修改了程序入口点、映像大小、资源其始。
不过谅他再厉害终究是这么回事,我写了个程序两下子就全部清除了。
嘿嘿,电脑的问题还得用程序来做!万物借规律,只要找到了它的规律还不是手到擒来?
写这些病毒的人要么是会编程但没有大专文凭,要么是吃饱了没事干,要么就是脑子有问题。总之这些人都是一些垃圾,没有真本事的人才会写病毒。我说的没错吧
#10
Aegisys2008-05-10 20:11
你的程序中好像有BUG.
当用户输入的参数个数与实际个数不符的时候,将会由于堆栈失衡而崩溃掉.

像这样就不崩溃了...

只有本站会员才能查看附件,请 登录


[[it] 本帖最后由 Aegisys 于 2008-5-10 20:16 编辑 [/it]]
#11
VanHorn2008-05-10 20:37
楼主写这个程序的编程思想是什么呢? 其中规律是什么呢。
#12
hjh108452008-05-10 22:02
请问LZ  你本身是什么职业的,写这个为什么呢?
#13
flyue2008-05-11 08:29
我本身什么职业?学生。(不要不相信,我没骗你)
这个程序是没事干,无聊的时候写的。
关于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);”总觉得太简陋了)
#14
Aegisys2008-05-11 09:34
实际上你可以知道一个API需要多少参数.呵呵.
#15
Aegisys2008-05-11 09:35
实际上,在函数调用过程中,每一个参数都是固定的4个字节(32位系统).转什么参数是没有关系的,只要总数对就行
#16
Aegisys2008-05-11 09:37
在VB中,如果参数个数与实际不一样,也要崩溃的.

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

[[it] 本帖最后由 Aegisys 于 2008-5-11 09:42 编辑 [/it]]
#17
Aegisys2008-05-11 09:40
让我们来看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就用的这种方法.
#18
flyue2008-05-11 18:41
原来还有这种方法啊?你不说我还不知道。
你用的是什么反汇编工具呀?
#19
yeshirow2008-05-12 01:34
我也寫了一個可以調用 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
#20
hjh108452008-05-12 23:47
请问这个程序是不获得文件入口地址?那用在外挂方面那不是很不错?
#21
flyue2008-05-13 17:34
好久没有写VB代码了,有快两年了吧,好怀念。
现在想想VB写程序不怎么好,写脚本倒是不错的。
看了你们的帖子,倒是让我长见识了啊。对了,为什么脚本语言里没有cs(C Script)脚本?弄个java script倒是长得跟C很象。
1