質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

3713閲覧

PythonとWindowsAPI

psycho

総合スコア7

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2017/12/14 13:00

編集2017/12/21 02:49

##Pythonに噛まれました

Windows APIを利用し,デバッガを作成しています.
言語はPython(2.7)です.

現在,手動で電卓を開き,プロセスIDを取得し,
電卓のプロセスを停止するプログラムを作成しています.
プログラムのコンパイルは無事に通るのですが,
アタッチに失敗します.
なぜなのかと解決策を質問したいです.

また以前,
PROCESS_ALL_ACCESSが定義されていないと
コンパイルが通らなかったことがあります.
定義を行って修正しましたが
問題がないかもお願いいたします.

###実行例
実行例(PID:1620):

Enter the PID of the process to attach to:1620
[*] Unable to attach to the process.
There was an error

##my_debugger_defines

from ctypes import * WORD = c_ushort DWORD = c_ulong LPBYTE = POINTER(c_ubyte) LPTSTR = POINTER(c_char) HANDLE = c_void_p DEBUG_PROCESS = 0x00000001 CREATE_NEW_CONSOLE = 0x00000010 class STARTUPINFO(Structure): _fields_ = [ ("cb", DWORD), ("lpReserved", LPTSTR), ("lpDesktop", LPTSTR), ("lpTitle", LPTSTR), ("dwX", DWORD), ("dwY", DWORD), ("dwXSize", DWORD), ("dwYSize", DWORD), ("dwXCountChars", DWORD), ("dwYCountChars", DWORD), ("dwFillAttribute", DWORD), ("dwFlags", DWORD), ("wShowWindow", WORD), ("cbReserved2", WORD), ("lpReserved2", LPBYTE), ("hStdInput", HANDLE), ("hStdOutput", HANDLE), ("hStdError", HANDLE), ] class PROCESS_INFORMATION(Structure): _fields_ = [ ("hProcess", HANDLE), ("hThread", HANDLE), ("dwProcessId", DWORD), ("dwThreadId", DWORD), ]

##my_debuggera

from ctypes import * from my_debugger_defines import * kernel32 = windll.kernel32 #PROCESS_ALL_ACCESS = 2035711 PROCESS_ALL_ACCESS = (0x000F0000L | 0x00100000L | 0xFFF) class debugger(): def __init__(self): self.h_process = None self.pid = None self.debugger_active = False def load(self,path_to_exe): creation_flags = DEBUG_PROCESS startupinfo = STARTUPINFO() process_information = PROCESS_INFORMATION() startupinfo.dwFlags = 0x1 startupinfo.wShowWindow = 0x0 startupinfo.cb = sizeof(startupinfo) if kernel32.CreateProcessA(path_to_exe, None, None, None, None, creation_flags, None, None, byref(startupinfo), byref(process_information)): print "[*] We have successfully lauched the process!" print "[*] PID: %d" % process_information.dwProcessId self.h_process = self.open_process(process_information.dwProcessId) else: print "Error: 0x%08x." % kernel32.GetLastError() def open_process(self,pid): h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS,False,pid) return h_process def attach(self,pid): self.h_process = self.open_process(pid) if kernel32.DebugActiveProcess(pid): self.debugger_active = True self.pid = int(pid) else: print "[*] Unable to attach to the process." def run(self): while self.debugger_active == True: self.get_debug_event() def get_debug_event(self): debug_event = DEBUG_EVENT() continue_status = DBG_CONTINUE if kernel32.WaitForDebugEvent(byref(debug_event),INFINITE): raw_input("Press a key to continue...") self.debugger_active = False kernel32.ContinueDebugEvent( debug_event.dwProcessId, debug_event.dwThreadId, continue_status ) def datach(self): if kernel32.DebugActiveProcessStop(self.pid): print "[*] Finished debugging. Exiting..." return True else: print "There was an error" return False

##実行ファイル

import my_debuggera debugger = my_debuggera.debugger() pid = raw_input("Enter the PID of the process to attach to:") debugger.attach(int(pid)) debugger.run() debugger.datach()

###再定義
PROCESS_ALL_ACCESS

###補足情報
Python2.7
Windows7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

(解決済になってるけど、新たに回答を追加することは可能だよね……)

Pythonが32bitでcalc.exeが64bitの場合はDebugActiveProcessが失敗するのではないかと思います。
Side Effects of Debugger から抜粋

DebugActiveProcess would fail if a 32bit debugger tried to attach to a 64bit target.

PROCESS_ALL_ACCESSの下4桁は、XP時代は0x0FFFだけどVista以降に特有の機能を使う場合は0xFFFFにするべきかもしれません。
Process Security and Access Rights
(PROCESS_ALL_ACCESSのところに書いてあるのは逆に、Vista以降向けの設定でコンパイルした物をXPで動かしたら失敗するよ、という内容ですが。)

投稿2017/12/15 12:04

okrt

総合スコア366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

psycho

2017/12/15 18:50

御回答ありがとうございます。 Pythonは確認したところ64bitでした。 グローバル変数に関しましては、その通りで、Windowsが32bitを想定したプログラムだったため動作を行わなかったようです。 Windows APIに関する、構造体や共用体、グローバル変数を再定義することによって改善できました。 お忙しい中ありがとうございました。
guest

0

ベストアンサー

この本で扱われている内容ですね。

https://www.google.co.jp/amp/s/www.oreilly.co.jp//books/9784873114484/mobile.html

多分アタッチ対象のプロセスへの権限が足りなくてアタッチできない状況だと推測しますが、なかなかややこしい箇所で本を全部そらんじるほどの理解もないので、「本を読んでみてください」とだけお伝えします。

追記

Python 3.6ですが、以下のコードで電卓のPIDへアタッチ/デタッチしてみましたが、特別なことをしなくてもエラーにならなかったので、やっぱり権限関連の問題だと思います。

python

1''' 2Created on 2017/12/15 3 4@author: sakurai 5''' 6 7from ctypes import windll 8from ctypes import WinError 9from ctypes import wintypes 10 11 12def assertTrue(result, _, args): 13 if not result: 14 raise WinError() 15 return args 16 17 18DebugActiveProcess = windll.kernel32.DebugActiveProcess 19DebugActiveProcess.restype = wintypes.BOOL 20DebugActiveProcess.argtypes = (wintypes.DWORD, ) 21DebugActiveProcess.errcheck = assertTrue 22 23DebugActiveProcessStop = windll.kernel32.DebugActiveProcessStop 24DebugActiveProcessStop.restype = wintypes.BOOL 25DebugActiveProcessStop.argtypes = (wintypes.DWORD, ) 26DebugActiveProcessStop.errcheck = assertTrue 27 28 29if __name__ == "__main__": 30 pid = int(input("PID: ")) 31 DebugActiveProcess(pid) 32 DebugActiveProcessStop(pid)

投稿2017/12/14 14:50

編集2017/12/15 09:40
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

psycho

2017/12/14 15:39

御回答ありがとうございます。 その通りです。 本を通してPythonとWindowsプログラミングを学習しております。 本に書いている内容だと関数の紹介のみで対処に困っている状況です。 プロセス権限に関して検討していきたいと考えております。 お忙しい中、回答ありがとうございました。
psycho

2017/12/15 18:55

Windowsの64bitが動作環境であったため、ctypesによりWin32を扱う場合、Windows APIの構造体や共用体、グローバル変数を再定義しなければならなかったようです。 sakurai様のソースコードで問題なく動作したため、気づくことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問