来自汇编程序的 Win32 Kernel32.CreateThread

发布于 2024-12-09 16:41:07 字数 622 浏览 1 评论 0原文

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)中运行我的应用程序。而且我没有使用任何编译器。

非常感谢, 里卡多

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

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

I have put a breakpoint on my function (214D84CD), but after the CreateThread, in the "waiting loop" my function is not invoked.
Otherwise, if I call after CreateThread my application (and not the waiting loop) with many others threads, my function is invoked.

Why? There is some "DoEvents" api to force in my loop to call my thread function?

The thread id (214D84DD) and the return value EAX are not null.
I'm run my application in a debugger (OllyDbg). And I'm not using any compiler.

Many thanks,
Riccardo

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北恋 2024-12-16 16:41:07
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 应该翻转。

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
);

you are passing them wrong. Since in stdcall, you have to push the argument in a reverse order, lpThreadId should be pushed first. Thus 214D84CD and 214D84DD should be flipped.

滥情稳全场 2024-12-16 16:41:07

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

You have to manually switch to the newly created thread via the 'threads' window.

旧时浪漫 2024-12-16 16:41:07

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

"在进程启动和 DLL 初始化例程期间,可以创建新线程,但直到为进程完成 DLL 初始化后,它们才会开始执行。"

< a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

Is because the CreateThread is in the initialization routine of a DLL.... :(

"During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process."

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文