国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體

這篇具有很好參考價(jià)值的文章主要介紹了【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄修整

目前的系列目錄(后面會(huì)根據(jù)實(shí)際情況變動(dòng)):

  1. 在windows11上編譯python
  2. 將python注入到其他進(jìn)程并運(yùn)行
  3. 注入Python并使用ctypes主動(dòng)調(diào)用進(jìn)程內(nèi)的函數(shù)和讀取內(nèi)存結(jié)構(gòu)體
  4. 使用匯編引擎調(diào)用進(jìn)程內(nèi)的任意函數(shù)
  5. 利用beaengine反匯編引擎的c接口寫(xiě)一個(gè)pyd庫(kù),用于實(shí)現(xiàn)inline hook
  6. 利用beaengine反匯編引擎的python接口寫(xiě)一個(gè)py庫(kù),用于實(shí)現(xiàn)inline hook
  7. 注入python到微信實(shí)現(xiàn)簡(jiǎn)單的收發(fā)消息
  8. Bug修復(fù)和細(xì)節(jié)優(yōu)化,允許Python加載運(yùn)行py腳本并且支持熱加載
  9. 讀取微信內(nèi)存中的好友聯(lián)系人列表的信息結(jié)構(gòu)體數(shù)據(jù)
  10. 做一個(gè)僵尸粉檢測(cè)工具
ctypes的主要功能

ctypes是Python與c寫(xiě)的文件做交互的庫(kù),能和Python直接交互的也就是動(dòng)態(tài)庫(kù)了。所以在Windows上主要是調(diào)用dll,Linux上則是調(diào)用so。

不過(guò),在這個(gè)系列文章里,它的作用稍微有些不同。因?yàn)镻ython已經(jīng)被注入到其他進(jìn)程,可以用ctypes隨意操作其他進(jìn)程的數(shù)據(jù)和調(diào)用其他進(jìn)程里的函數(shù),相對(duì)于用c寫(xiě)的dll注入后,只需要把c的接口改成Python的。這樣就能動(dòng)態(tài)操作,不需要頻繁改動(dòng)dll代碼,注入卸載了

同時(shí)它還能調(diào)用其他進(jìn)程里的任意函數(shù),不過(guò)默認(rèn)只能調(diào)用stdcallcdecl兩種調(diào)用約定的函數(shù)。如果不是這兩種調(diào)用約定,則需要使用內(nèi)聯(lián)匯編來(lái)調(diào)用。當(dāng)然Python無(wú)法直接內(nèi)聯(lián)匯編,但可以通過(guò)匯編引擎將匯編指令翻譯成機(jī)器能識(shí)別的機(jī)器碼寫(xiě)入到內(nèi)存,達(dá)到內(nèi)聯(lián)匯編的效果。也可以不用匯編引擎,直接寫(xiě)機(jī)器碼到內(nèi)存,只要你能記得匯編指令代表的機(jī)器碼(人肉匯編引擎)。

與進(jìn)程交互

對(duì)于調(diào)用dll相關(guān)的功能,我這里就不多贅述了,之前寫(xiě)的一篇文章里有:Python基礎(chǔ)庫(kù)-ctypes

這里我主要說(shuō)下ctypes與進(jìn)程交互方面,比如讀取內(nèi)存結(jié)構(gòu)體,調(diào)用內(nèi)存中的函數(shù)等

寫(xiě)一個(gè)測(cè)試程序

先自己寫(xiě)一個(gè)測(cè)試程序,然后在自己的程序測(cè)試,這樣可以避免很多錯(cuò)誤,也方便調(diào)試。簡(jiǎn)單寫(xiě)了幾個(gè)函數(shù)和結(jié)構(gòu)體測(cè)試,代碼如下:

typedef int(*cdecl_add_pointer)(int, int);
typedef int(__stdcall *stdcall_add_pointer)(int, int);

struct CString
{
    wchar_t* s = nullptr;
    size_t len = 0;
    CString(wchar_t* ss) {
        s = ss;
        len = wcslen(ss);
    }
};

CString ccs((wchar_t*)L"aaaaaa這是個(gè)全局變量結(jié)構(gòu)體");

int cdecl_add(int a, int b) {
    std::wcout << L"cdecl調(diào)用約定\n";
    return a + b;
}

int __stdcall stdcall_add(int a, int b) {
    std::wcout << L"stdcall調(diào)用約定\n";
    return a + b;
}

int add_callback(stdcall_add_pointer add, int a, int b) {
    std::wcout << L"add_callback \n";
    return add(a, b);
}

int console_print(CString* cs) {
    std::wcout << L"print CString: ";
    std::wcout << cs->s;
    std::wcout << L"\n";
    return cs->len;
}
調(diào)用進(jìn)程內(nèi)的函數(shù)

這里就用上一篇的pyexe.dll來(lái)將Python注入到目標(biāo)進(jìn)程。

現(xiàn)在開(kāi)始調(diào)用cdecl_add和stdcall_add這兩個(gè)函數(shù),首先需要找到他們的地址偏移,上面的函數(shù)里都有一個(gè)字符串,這也是我為了方便定位刻意寫(xiě)的。

在x32dbg里搜索字符串,就能定位這兩個(gè)函數(shù),比如cdecl_add: 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

得出cdecl_add函數(shù)的偏移就是00AF4190-00AE0000, 00AE0000是exe的基址。同理可以知道stdcall_add的基址為0x00AF43B0 - 0x00AE0000

先定義一個(gè)GetModuleHandleW函數(shù)用于獲取exe的基址

import ctypes

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
GetModuleHandleW = kernel32.GetModuleHandleW
GetModuleHandleW.argtypes = (ctypes.c_wchar_p, )
GetModuleHandleW.restype = ctypes.c_int
base = GetModuleHandleW("CtypesTest.exe")

以下幾行代碼就是調(diào)用cdecl_add的全部代碼,看注釋一行一行解釋?zhuān)?/p>

# 定義函數(shù)指針類(lèi)型,第一個(gè)參數(shù)是返回值類(lèi)型,后面的都是參數(shù)類(lèi)型
cdecl_add_pfunc = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int)
# 函數(shù)的偏移
cdecl_add_offset = 0x00AF4190 - 0x00AE0000
# 通過(guò)基址和偏移得到當(dāng)前函數(shù)所在內(nèi)存地址,然后傳給cdecl_add_pfunc就能得到這個(gè)函數(shù)
cdecl_add = cdecl_add_pfunc(base + cdecl_add_offset)
# 傳入相應(yīng)的參數(shù)就能調(diào)用成功
print("cdecl_add: ", cdecl_add(111, 222))

【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

可以看到結(jié)果成功輸出,也沒(méi)有報(bào)錯(cuò)。沒(méi)有打印cdecl調(diào)用約定是因?yàn)槲覀冊(cè)谧⑷隤ython是重定向了stdout,如果想要打印目標(biāo)進(jìn)程的輸出則需要使用上一篇文章提到的CPython接口重定向stdout。

而調(diào)用stdcall_add和它基本一樣,將 ctypes.CFUNCTYPE改成ctypes.WINFUNCTYPE即可 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

構(gòu)建結(jié)構(gòu)體并調(diào)用函數(shù)

接著我們開(kāi)始調(diào)用console_print,它的參數(shù)類(lèi)型是一個(gè)結(jié)構(gòu)體指針,所以要先在Python構(gòu)建出結(jié)構(gòu)體

ctypes定義結(jié)構(gòu)體代碼如下:

class CString(ctypes.Structure):
    _fields_ = [
        ('s', ctypes.c_wchar_p),
        ('len', ctypes.c_uint)
    ]

定義console_print函數(shù):

console_print_pfunc = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.POINTER(CString))
console_print_offset = 0x00AF2F10 - 0x00AE0000
console_print = console_print_pfunc(base + console_print_offset)

創(chuàng)建結(jié)構(gòu)體并賦值

cs = CString()
s = "Python結(jié)構(gòu)體字符串"
cs.s = ctypes.c_wchar_p(s)
cs.len = len(s)

為了確保創(chuàng)建的結(jié)構(gòu)體和目標(biāo)進(jìn)程里的一樣,可以先在Python控制臺(tái)創(chuàng)建,然后在x32dbg里查看。

這里我為了避免一直要輸入代碼,使用import sys;sys.path.append(r"T:\Code\PyRobot\part3\py_code")來(lái)將目錄添加到sys.path,然后導(dǎo)入我寫(xiě)的代碼import testa

如果要重新導(dǎo)入:import importlib;importlib.reload(testa),查看Python構(gòu)建的結(jié)構(gòu)體內(nèi)存地址有三種方法:

print("ctypes.byref: ", ctypes.byref(cs))
print("ctypes.addressof: ", hex(ctypes.addressof(cs)))
print("ctypes.cast: ", hex(ctypes.cast(ctypes.pointer(cs), ctypes.c_void_p).value))

效果如下: 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

可以看到cs的內(nèi)存地址是0x1570d40,然后在x32dbg里查看這個(gè)內(nèi)存地址。

在命令里輸入dump 0x1570d40或者打開(kāi)幫助->計(jì)算器,輸入這個(gè)地址,然后在內(nèi)存窗口打開(kāi): 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

這個(gè)地址的內(nèi)容就是Python構(gòu)建出的結(jié)構(gòu)體,如果不清楚結(jié)構(gòu)體在內(nèi)存中長(zhǎng)啥樣,可以把c代碼創(chuàng)建的結(jié)構(gòu)體也打印出來(lái),然后在x32dbg中查看

最后調(diào)用這個(gè)函數(shù),ctypes.byref的作用是傳遞指針的引用,ctypes.pointer也可以,它是構(gòu)造一個(gè)新的指針:

result = console_print(ctypes.byref(cs))
print("console_print result: ", result)

調(diào)用成功,說(shuō)明結(jié)構(gòu)體構(gòu)造的沒(méi)問(wèn)題: 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

讀取內(nèi)存中的全局結(jié)構(gòu)體

一樣是先計(jì)算偏移

# 全局變量的內(nèi)存地址一般偏移是固定的,如果是函數(shù)內(nèi)的局部變量就不能這么計(jì)算了
ccs_offset = 0x00AFE2D0 - 0x00AE0000 
css_addr = base + ccs_offset

然后從地址中讀取出結(jié)構(gòu)體里的字符串和整數(shù)

s = ctypes.c_wchar_p.from_address(css_addr)
l = ctypes.c_uint.from_address(css_addr + 0x4)
print("單獨(dú)讀取內(nèi)存結(jié)構(gòu)體: ", s.value, l)

更簡(jiǎn)單的方法就是直接轉(zhuǎn)為結(jié)構(gòu)體

css = CString.from_address(css_addr)
print("讀取整個(gè)結(jié)構(gòu)體: ", css.s, css.len)

執(zhí)行結(jié)果如下圖: 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

調(diào)用回調(diào)函數(shù)

先定義一個(gè)Python回調(diào)函數(shù)

def python_stdcall_add(a:int, b:int):
    print("python_stdcall_add: ", a, b)
    return a-b

定義add_callback函數(shù)

add_callback_pfunc = ctypes.CFUNCTYPE(ctypes.c_int, stdcall_add_pfunc, ctypes.c_int, ctypes.c_int) 
add_callback_offset = 0x00AF40D0 - 0x00AE0000
add_callback = add_callback_pfunc(base + add_callback_offset)

因?yàn)榛卣{(diào)函數(shù)的類(lèi)型stdcall_add之前已經(jīng)定義了,這里就直接用了

result = add_callback(stdcall_add_pfunc(python_stdcall_add), 5, 2)
print("add_callback: ", result)

執(zhí)行結(jié)果: 【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體,

本篇就到此結(jié)束了,其他更復(fù)雜的數(shù)據(jù)類(lèi)型在后面的實(shí)戰(zhàn)中再說(shuō)。

本篇文章用到的文件和代碼

https://github.com/kanadeblisst00/PyRobot-part3文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-736666.html

到了這里,關(guān)于【Python微信機(jī)器人】第三篇:使用ctypes調(diào)用進(jìn)程函數(shù)和讀取內(nèi)存結(jié)構(gòu)體的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python微信機(jī)器人制作教程+源碼

    python微信機(jī)器人制作教程+源碼

    大多數(shù)人無(wú)法登錄網(wǎng)頁(yè)版,所以饒過(guò)它模擬電腦登錄,這個(gè)模塊一定記得安裝: python微信機(jī)器人 b站:川川菜鳥(niǎo) 前面qq機(jī)器人教程也在b站有,關(guān)注一下博主吧。 比如給文件傳輸助手發(fā)送消息,并實(shí)時(shí)監(jiān)控,代碼: 效果如下: 比如要自動(dòng)給張三發(fā)送消息,代碼如下: 效果:

    2024年02月13日
    瀏覽(26)
  • Python基于PC版微信實(shí)現(xiàn)機(jī)器人

    Python基于PC版微信實(shí)現(xiàn)機(jī)器人

    在 github 中有基于 web 版的微信實(shí)現(xiàn)的實(shí)時(shí)收發(fā)消息 api , python 調(diào)用起來(lái)非常簡(jiǎn)單。但是目前來(lái)說(shuō),大部分的用戶(hù)沒(méi)法登錄 web 版的微信,因此也就沒(méi)法使用。 今天我們介紹基于 windows 版的微信,實(shí)現(xiàn)實(shí)時(shí)收發(fā)信息。本文站在巨人的肩膀上,基于第三方提供的庫(kù),實(shí)現(xiàn)自動(dòng)聊

    2023年04月17日
    瀏覽(20)
  • 微信機(jī)器人的構(gòu)建與使用

    微信機(jī)器人的構(gòu)建與使用

    一個(gè)不知名大學(xué)生,江湖人稱(chēng)菜狗 original author: jacky Li Email : 3435673055@qq.com Time of completion:2022.12.15 Last edited: 2022.12.17 目錄 《微信機(jī)器人》程序使用說(shuō)明 微信機(jī)器人使用說(shuō)明 1.項(xiàng)目說(shuō)明 2.? 系統(tǒng)環(huán)境 3.準(zhǔn)備條件 4.操作步驟 部分代碼: 首先啟動(dòng) Flask項(xiàng)目 ,然后啟動(dòng) 小米球內(nèi)

    2024年02月09日
    瀏覽(89)
  • 運(yùn)用python實(shí)現(xiàn)企業(yè)微信群機(jī)器人消息推送

    使用場(chǎng)景 :將BI報(bào)表精準(zhǔn)推送入(群),精準(zhǔn)觸達(dá)用戶(hù) 目的 :提高管理層對(duì)數(shù)據(jù)的感知度 工具:python+企業(yè)微信 步驟: 1、創(chuàng)建企業(yè)微信群機(jī)器人,提取Webhook地址(群機(jī)器人地址) 2、編寫(xiě)代碼填充推送內(nèi)容信息實(shí)現(xiàn)推送 3、其他需求自定義代碼編寫(xiě) 實(shí)現(xiàn)方法1–優(yōu)化后 實(shí)現(xiàn)

    2024年02月16日
    瀏覽(19)
  • python連接自己的機(jī)器人接口在微信聊天

    機(jī)器人有連接到數(shù)據(jù)庫(kù),所以可以長(zhǎng)記憶對(duì)話(huà),多線(xiàn)程可以使得機(jī)器人同時(shí)和幾個(gè)好友聊天。將消息發(fā)送到遠(yuǎn)程API進(jìn)行處理,并回復(fù)處理后的消息。腳本還允許為每個(gè)好友分配一個(gè)唯一的隨機(jī) ID,以便跟不同的好友聊天并維護(hù)聊天記憶。

    2024年02月09日
    瀏覽(18)
  • 【Python微信機(jī)器人】第一篇:在windows11上編譯python

    【Python微信機(jī)器人】第一篇:在windows11上編譯python

    我打算寫(xiě)一個(gè)系列,內(nèi)容是將python注入到其他進(jìn)程實(shí)現(xiàn)inline hook和主動(dòng)調(diào)用。本篇文章是這個(gè)系列的第一篇,后面用到的案例是 注入python到PC微信實(shí)現(xiàn)基本的收發(fā)消息 。文章著重于python方面的內(nèi)容,所以對(duì)于微信找收發(fā)消息的call不會(huì)去講過(guò)程,有興趣的可以直接百度搜 PC微信

    2024年02月08日
    瀏覽(20)
  • 企業(yè)微信機(jī)器人WorkTool使用文檔

    先附一下官方介紹 源碼友情鏈接 根據(jù)產(chǎn)品需求的 落地場(chǎng)景 我這里最看重的是他的自動(dòng)創(chuàng)建外部群拉入客戶(hù)和銷(xiāo)售,并能用接口查詢(xún)?nèi)毫挠涗洠B企業(yè)微信會(huì)話(huà)存檔的費(fèi)用都省了,把機(jī)器人拉群里,@機(jī)器人問(wèn)問(wèn)題可以預(yù)先設(shè)置簡(jiǎn)單的問(wèn)答庫(kù)。另一個(gè)我看重的功能是自動(dòng)通過(guò)

    2024年02月02日
    瀏覽(39)
  • JavaDemo——使用機(jī)器人發(fā)送微信消息

    JavaDemo——使用機(jī)器人發(fā)送微信消息

    原理很簡(jiǎn)單,使用機(jī)器人模擬按鍵,使用剪貼板把內(nèi)容copy進(jìn)去發(fā)送; 需要先在pc登錄微信客戶(hù)端,然后用機(jī)器人按鍵,使用ctrl+alt+w快捷鍵打開(kāi)微信,使用ctrl+f打開(kāi)搜索,黏貼好友名稱(chēng)進(jìn)行搜索,然后黏貼要發(fā)送的消息發(fā)送即可; 此外還需要注意耗時(shí)操作,需要等待操作完成

    2024年02月13日
    瀏覽(24)
  • Python實(shí)現(xiàn)企業(yè)微信群機(jī)器人自動(dòng)化推送

    Python實(shí)現(xiàn)企業(yè)微信群機(jī)器人自動(dòng)化推送

    人工智能(Artificial Intelligence),英文縮寫(xiě)為AI。它是研究、開(kāi)發(fā)用于模擬、延伸和擴(kuò)展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門(mén)新的技術(shù)科學(xué)。 ——《百度百科》 實(shí)際工作中,有類(lèi)似這樣的場(chǎng)景, 需要將某些通知信息定期發(fā)送到企業(yè)微信群,需要將公司某些指標(biāo)的異

    2024年02月09日
    瀏覽(26)
  • python上的免費(fèi)免登錄微信智能聊天機(jī)器人

    目錄 ?一、準(zhǔn)備 ?二、開(kāi)始 三、全部代碼 四、總結(jié) ?一、準(zhǔn)備 需要bs4庫(kù)、requests庫(kù)、time庫(kù)(python自帶)、wxauto庫(kù)。 如果沒(méi)有的話(huà)請(qǐng)用pip安裝。 在本示例中,使用的是wxauto,所以只能識(shí)別桌面上顯示的微信窗口,一旦微信窗口最小化,便無(wú)法使用。解決辦法:可以在GitHub上

    2023年04月08日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包