gzh888666 发表于 2023-12-10 00:01:09

如何使用python转换CE脚本


alloc(g_Thread,10)
createthread(g_Thread)

g_Thread:
pushad

mov ecx,
mov ecx,
push -1
push 2
mov eax,1
push 1
push ecx
call 0040FA10

popad
retn

这段CE脚本可以实现自动种植樱桃炸弹到指定的行列,
请教一下如何使用python完成相同的功能
目前我的代码无法实现自动种植,必须要用鼠标点击一下才行,
python不知道如何实现内存线程的处理,请大佬们指点迷津。{:5_111:}
my_ctypes.py
def WriteProcess_CE(
      handle, offset, data
):#例子my_ctypes.WriteProcess(process_handle,0X00729670,"83 46 40 FC")
    list_data = data.split(' ')
    z = ctypes.c_int()
    for i in range(len(list_data)):
      z.value = eval('0x' + list_data)
      ctypes.windll.kernel32.WriteProcessMemory(handle, offset + i,
                                                ctypes.byref(z), 1, None)


def CE_10to16(num):#整数47 返回字符串'2F'
    return str(hex(num))[-2:]


main.py
my_ctypes.WriteProcess_CE(process_handle, 0x00413452,
                               "E9 B5 A4 2B 00 ....")
      my_ctypes.WriteProcess_CE(process_handle, 0x006CD90C,
                               "B8 " + my_ctypes.CE_10to16(ID) +
                               " 00 00 00 52 50 E9 3F 5B D4 FF ......")

FishC 发表于 2023-12-10 00:01:46

要使用Python实现相同的功能,你需要使用一些库来访问和修改进程内存,并创建线程。下面是一个可能的解决方案:

1. 首先,你需要安装pywin32库和ctypes库。你可以使用以下命令在命令行中安装它们:
pip install pywin32
pip install ctypes

2. 在你的`my_ctypes.py`文件中,为了能够正确导入ctypes库,你需要添加以下行:
import ctypes

3. 创建一个新的Python文件,比如`main.py`。在最上面,添加以下导入语句:
import ctypes
import win32api
import win32con
import time

4. 在`main.py`中,创建一个函数`seed_bomb`来实现自动种植樱桃炸弹:
def seed_bomb(process_handle, row, column):
    # 分配内存并创建线程
    g_thread_addr = ctypes.c_int()
    ctypes.windll.kernel32.VirtualAllocEx(
      process_handle, None, 1000,
      win32con.MEM_COMMIT | win32con.MEM_RESERVE, win32con.PAGE_EXECUTE_READWRITE)
    ctypes.windll.kernel32.CreateRemoteThread(
      process_handle, None, 0, g_thread_addr, 0, 0, 0)

    # 将指令写入内存中
    instructions = [
      "pushad",
      "mov ecx, " + str(row),
      "mov ecx, " + str(column),
      "push -1",
      "push 2",
      "mov eax, 1",
      "push 1",
      "push ecx",
      "call 0040FA10",
      "popad",
      "retn"
    ]
    offset = g_thread_addr.value
    for instruction in instructions:
      my_ctypes.WriteProcess_CE(process_handle, offset, instruction)
      offset += len(instruction) + 1

# 使用示例
process_handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, process_id)
seed_bomb(process_handle, 5, 3)

请注意,这只是一个示例代码,我无法确切知道你的程序的内存地址和其他细节。你需要根据你的具体情况进行调整和修改。还要确保你已经正确获取了进程的句柄。你可以使用`win32api`来打开进程并获得句柄。

希望这能帮助到你!请记得测试和调试你的代码,并随时向我咨询如果有任何问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

gzh888666 发表于 2023-12-10 11:51:16

# 将指令写入内存中
    instructions = [
      "pushad",
      "mov ecx, " + str(row),
      "mov ecx, " + str(column),
      "push -1",
      "push 2",
      "mov eax, 1",
      "push 1",
      "push ecx",
      "call 0040FA10",
      "popad",
      "retn"
    ] 汇编代码如何嵌入python代码中运行

FishC 发表于 2023-12-10 11:51:43

gzh888666 发表于 2023-12-10 11:51
# 将指令写入内存中
    instructions =汇编代码如 ...

要在Python代码中嵌入汇编代码并执行,你可以使用ctypes库的`create_string_buffer`函数来创建一个缓冲区,并将汇编指令作为字符串赋值给缓冲区。然后,你可以使用ctypes库的`cdll`方法加载kernel32.dll,并调用其中的`CreateThread`函数来创建一个新线程并执行汇编指令。

下面是一个示例代码:

import ctypes

# 定义汇编指令
instructions = "mov eax, 10\n" \
            "add eax, 20\n" \
            "sub eax, 5\n" \
            "ret\n"

# 创建缓冲区并将汇编指令写入缓冲区
buffer = ctypes.create_string_buffer(instructions.encode())

# 加载kernel32.dll
kernel32 = ctypes.cdll.kernel32

# 定义函数类型
ThreadProc = ctypes.CFUNCTYPE(ctypes.c_int)

# 定义线程函数
@ThreadProc
def thread_func():
    asm_code = buffer.raw# 获取缓冲区的原始二进制数据
    code_size = len(asm_code)
    thread_handle = kernel32.GetCurrentThread()
    kernel32.VirtualProtect(thread_handle, ctypes.byref(buffer), code_size, 0x40)
    function = ctypes.cast(asm_code, ctypes.POINTER(ThreadProc)).contents
    return function()

# 创建新线程
thread_id = ctypes.c_ulong()
thread_handle = kernel32.CreateThread(None, 0, thread_func, None, 0, ctypes.byref(thread_id))

# 等待线程结束
kernel32.WaitForSingleObject(thread_handle, -1)

# 关闭线程句柄
kernel32.CloseHandle(thread_handle)

请注意,你需要将要执行的汇编指令以字符串形式定义在`instructions`变量中,并根据实际情况进行调整。在上面的示例中,我使用了一些简单的指令来演示。

这只是一个示例代码,具体实现需要根据你的需求进行调整和修改。同时要注意,在使用汇编指令时,需要对内存进行正确的保护和权限设置,以避免潜在的错误。

希望这可以帮助到你!如果你有任何问题,请随时向我咨询。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

gzh888666 发表于 2023-12-10 12:25:00

本帖最后由 gzh888666 于 2023-12-10 12:29 编辑

import ctypes
import sys
import win32con
import time

window_handle = ctypes.windll.user32.FindWindowW(
            None, "Plants vs. Zombies")
      #ctypes.windll.user32.SetForegroundWindow(window_handle) #窗体置顶
PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)
process_id = ctypes.c_ulong()
ctypes.windll.user32.GetWindowThreadProcessId(window_handle,
                                                      ctypes.byref(process_id))
process_handle = ctypes.windll.kernel32.OpenProcess(
            PROCESS_ALL_ACCESS, False, process_id)
# 定义汇编指令
instructions = "pushad\n"
instructions = "mov ecx,\n"
instructions += "mov ecx,\n"
instructions += "push -1\n"
instructions += "push 2\n"
instructions += "mov eax,1\n"
instructions += "push 1\n"
instructions += "push ecx\n"
instructions += "call 0040FA10\n"
instructions += "popad\n"
instructions += "retn"

# 创建缓冲区并将汇编指令写入缓冲区
buffer = ctypes.create_string_buffer(instructions.encode())
# 加载kernel32.dll
kernel32 = ctypes.cdll.kernel32
# 定义函数类型
ThreadProc = ctypes.CFUNCTYPE(ctypes.c_int)
# 定义线程函数
@ThreadProc
def thread_func():
    asm_code = buffer.raw# 获取缓冲区的原始二进制数据
    code_size = len(asm_code)
    thread_handle = kernel32.GetCurrentThread()
    kernel32.VirtualProtect(thread_handle, ctypes.byref(buffer), code_size, 0x40)
    function = ctypes.cast(asm_code, ctypes.POINTER(ThreadProc)).contents
    return function()
# 创建新线程
thread_id = ctypes.c_ulong()
thread_handle = kernel32.CreateThread(process_handle, 0, thread_func, None, 0, ctypes.byref(thread_id))
# 等待线程结束
kernel32.WaitForSingleObject(thread_handle, -1)
# 关闭线程句柄
kernel32.CloseHandle(thread_handle) 执行后没有任何效果,请看看哪里有错误

FishC 发表于 2023-12-10 12:30:24

gzh888666 发表于 2023-12-10 12:25
import ctypes
import sys
import win32con
import ...

在你提供的代码中,发现有几个错误和问题需要解决:

1. 在定义汇编指令时,你需要传递正确的参数给`mov`指令。根据你提供的CE脚本,可能是两个寄存器之间的移动操作,类似于`mov ecx, eax`。请确保正确设置这两个寄存器。

2. 在创建缓冲区的代码中,你的`instructions`字符串中加了一个多余的`\n`。需要将这行去掉。

3. 在创建新线程时,你传递了错误的参数给`kernel32.CreateThread`函数。第一个参数应该是NULL或0,第三个参数应该是远程线程的起始地址,而不是进程句柄。你可以尝试修改为以下代码:
thread_handle = kernel32.CreateThread(None, 0, thread_func, None, 0, ctypes.byref(thread_id))

4. 最后,你没有关闭进程句柄。请添加以下代码以关闭进程句柄:
kernel32.CloseHandle(process_handle)

请注意,这只是对你提供的代码进行的一些修正,我无法确切知道你的程序的内存地址和其他细节。你需要根据你的具体情况进行调整和修改。希望这次能够帮助到你!如果还有其他问题,请随时向我咨询。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 如何使用python转换CE脚本