【问题标题】:Win32 Kernel32.CreateThread from assembler来自汇编程序的 Win32 Kernel32.CreateThread
【发布时间】:2011-10-12 10:25:24
【问题描述】:
Hi to all....

////////////////////////////////////////////

PUSH 214D84DD // thread id address out
PUSH 0  
PUSH 0
PUSH 214D84CD // my function address to run in the thread
PUSH 0
PUSH 0
CALL DWORD PTR DS:[4EBD1204]  // KERNEL32.CreateThread


waiting_label:
NOP
JMP waiting_label

////////////////////////////////////////////

我在我的函数 (214D84CD) 上放置了一个断点,但是在 CreateThread 之后,在“等待循环”中我的函数没有被调用。 否则,如果我在 CreateThread 之后使用许多其他线程调用我的应用程序(而不是等待循环),则会调用我的函数。

为什么?有一些“DoEvents”api 强制在我的循环中调用我的线程函数?

线程 id (214D84DD) 和返回值 EAX 不为空。 我在调试器(OllyDbg)中运行我的应用程序。而且我没有使用任何编译器。

非常感谢, 里卡多

【问题讨论】:

  • 您以错误的顺序排列参数。使用编译器。
  • 我认为顺序是正确的,因为在调试器中我看到:|pSecurity = NULL |StackSize = 0 |ThreadFunction = 214D84CD |pThreadParm = NULL |CreationFlags = 0 \pThreadId = 214D84DD

标签: multithreading x86 assembly disassembly kernel32


【解决方案1】:
HANDLE WINAPI CreateThread(
  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in       SIZE_T dwStackSize,
  __in       LPTHREAD_START_ROUTINE lpStartAddress,
  __in_opt   LPVOID lpParameter,
  __in       DWORD dwCreationFlags,
  __out_opt  LPDWORD lpThreadId
);

你传错了。由于在 stdcall 中,您必须以相反的顺序推送参数,因此应首先推送 lpThreadId。因此 214D84CD 和 214D84DD 应该翻转。

【讨论】:

  • 很抱歉...我在帖子中剪切和粘贴代码是错误的,我的订单就像您说的那样,我确认这不起作用...谢谢...
  • 调用函数的返回值是多少?如果为空,LastErr 的值是多少(在 Registers 屏幕中)
  • EAX=00000184 LastErr=ERROR_SUCCESS (00000000) 214D84DD=00000840(它会改变)
  • 你是说214D84CD的断点没有被触发?
  • 只有当我在 CreateThread 之后执行我的应用程序的其他线程时才会触发它,而不是在我的“等待循环”中(见帖子)。非常感谢。
【解决方案2】:

您必须通过“线程”窗口手动切换到新创建的线程。

【讨论】:

  • 我在线程窗口中看到了我的新线程,但是如果我双击它,调试器会显示 ntdll 模块而不是我的模块。我能做些什么?谢谢
【解决方案3】:

是因为 CreateThread 在 DLL 的初始化例程中.... :(

“在进程启动和 DLL 初始化例程期间,可以创建新线程,但在进程的 DLL 初始化完成之前它们不会开始执行。”

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

【讨论】:

  • 提问时请尽量详细。
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2018-05-29
相关资源
最近更新 更多