2023-01-19 389
以下java程序在C中调用本机方法,如果用户按键,该方法应打印消息you pressed a key !.但是当我按键时,我看不到消息.我还检查函数SetWindowsHookEx是否返回null,但不,它不会返回null.
java代码:
package keylogger;
public class TestKeys {
private native void setWinHook();
public static void main(String args[]) {
TestKeys o = new TestKeys();
try {
o.setWinHook();
Thread.sleep(10000);
} catch(Exception exc) {
exc.printStackTrace();
}
}
static {
System.loadLibrary("MyHook");
}
}
C代码:
#include <stdio.h>
#include <windows.h>
#include <w32api.h>
#include "keylogger_TestKeys.h"
static HHOOK handleKeyboardHook = NULL;
HINSTANCE hInst = NULL;
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
printf("You pressed a key !\n");
return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}
void Java_keylogger_TestKeys_setWinHook
(JNIEnv *env, jobject obj) {
hInst = GetModuleHandle(NULL); // include or exclude,i don't see the result
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,NULL, 0);
if(handleKeyboardHook==NULL) {
printf("Is Null");
} else {
printf("Is not Null");
}
printf("Inside fucntion setWinHook !");
}
/*int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
printf("Hello World !");
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
if(handleKeyboardHook==NULL) {
printf("Is Null");
} else {
printf("Is not Null");
}
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}*/
我看到的唯一输出是不是nullinside fucntion setWinhook!
问题在哪里?
我应该做什么,以便当我按键时,该程序会返回我的消息.
我看到的唯一输出是:Inside function setWinHook !
注意:
如果以上程序在某人的机器上运行,请提及.
输出图片:
我在键敲击上看不到任何消息.
肯定有一种更好的方法来实现此目标.在这里DllMain创建线程后,多次被称为多次,这对我来说似乎并不正确.我不确定这是否合法! C代码启动了一个新线程以实现键盘.
C代码:
#include <stdio.h>
#include <windows.h>
#include <w32api.h>
#include "keylogger_TestKeys.h"
static HHOOK handleKeyboardHook = NULL;
HINSTANCE hInst = NULL;
static DWORD hookThreadId = 0;
static HANDLE hookThreadHandle = NULL;
BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved);
static int i = 0;
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
printf("You pressed the key !");
return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
if(hookThreadHandle==NULL) {
printf("hookThreadHandle is NULL\n");
LPTHREAD_START_ROUTINE lpStartAddress = &installHook;
hookThreadHandle = CreateThread(NULL, 0, lpStartAddress, NULL, 0, &hookThreadId);
}
}
BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) {
// printf("From installHook : %u",fwdReason);
printf("count : %d\n",i++);
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstDLL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void Java_keylogger_TestKeys_unregisterWinHook
(JNIEnv *env, jobject obj) {
// should have stopped the thread before unhooking
if(handleKeyboardHook != NULL) {
UnhookWindowsHookEx(handleKeyboardHook);
}
}
void Java_keylogger_TestKeys_stopNativeThread // stop the native thread
(JNIEnv *env, jobject obj) {
PostThreadMessage(hookThreadId, WM_QUIT, (WPARAM) NULL, (LPARAM) NULL);
WaitForSingleObject(hookThreadHandle, 5000);
}
java代码:
package keylogger;
public class TestKeys {
private static int i = 0;
private native void setWinHook();
private native void unregisterWinHook();
private native void createWinThread();
private native void stopNativeThread();
public static void main(String args[]) {
TestKeys o = new TestKeys();
try {
Thread.sleep(5000);
}catch(Exception exc) {
exc.printStackTrace();
}
o.stopNativeThread();
o.unregisterWinHook();
System.out.println("Native thread stopped and Hook unregistered !");
try {
Thread.sleep(3000); // Now you won't see the message : you pressed the key
}catch(Exception exc) {
exc.printStackTrace();
}
}
static {
System.loadLibrary("MyHook");
}
}
i启动Java程序,DLLMain被称为.
您不能简单地从蓝色中声明本地hinstance变量,然后将其传递给函数. hinstance是您应用程序实例的处理方法,换句话说,必须指向有效位置的指针.您需要使用自己的应用程序.
我的Windows API有点生锈,但我相信您可以通过getModulehandle()来做到这一点.
所以:
void Java_keylogger_TestKeys_setWinHook
(JNIEnv *env, jobject obj) {
HINSTANCE hInst;
hInst = GetModuleHandle(null);
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInst, 0);
printf("Inside function setWinHook !");
}
您的Java Goo很可能在某个地方隐藏了一个hinstance.
查看 java global(低级)键盘/鼠标钩
我试图自己写一个,但是对我来说似乎有太多未知细节(JNI,钩子,线程问题等)
)
以上所述是小编给大家介绍的当用户按下按键时,无法看到信息,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25793.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态