|
|
[讨论][下载]有一段解密代码,一个加密字节进去,一个解密字节出来。大家看看是怎么解密的?
把你的内联汇报的代码贴出来看看,这两个函数移植应该很简单。 |
|
|
[求助]DLL拦截 ws2_32.dll, 出现的疑惑, 请大神解惑
增加log输出,确定下问题在哪儿,确定下程序执行到的位置。 静态分析哪有动态运作直观。。 |
|
|
[求助]C++ 混合托管程序
C++ 的表达式识别规则: 右左法则。 右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。 |
|
|
[应聘]不知青岛有没有招逆向工程的或者软件开发的?
青岛基本没啥成规模的IT公司,搞逆向的基本都是小公司。 |
|
|
求助!RSA加解密菜鸟问题。
513K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8G2N6$3&6D9L8$3q4V1i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8X3c8W2N6r3q4A6L8q4)9J5c8X3N6#2M7$3S2S2L8Y4y4S2L8Y4u0W2L8W2)9J5c8U0t1I4z5o6t1$3y4o6y4Q4x3V1x3`. CSDN的资源,包括DES、AES、RSA等算法,每个算法可以独立复制出来。 |
|
|
动态加载方式加载的DLL,是否存在于导入表中?
导入表是PE结构的一部分,只有静态加载的动态库才会在这个表中,动态加载的动态库,通过GetProcAddr函数动态获取函数地址,所以不需要加入到导入表中。 |
|
|
[求助]驱动模拟键鼠,有触控板的电脑找不到KbdServiceCallback函数
NTSTATUS SearchServiceFromExt(PDRIVER_OBJECT KbdDriverObject,PDEVICE_OBJECT pPortDev) { PDEVICE_OBJECT pTargetDeviceObject = NULL; UCHAR *DeviceExt; int i=0; NTSTATUS status; PVOID KbdDriverStart; ULONG KbdDriverSize = 0; PDEVICE_OBJECT pTmpDev; UNICODE_STRING kbdDriName; KbdDriverStart = KbdDriverObject->DriverStart; KbdDriverSize = KbdDriverObject->DriverSize; status = STATUS_UNSUCCESSFUL; RtlInitUnicodeString(&kbdDriName,KBD_DRIVER_NAME); pTmpDev = pPortDev; while(pTmpDev->AttachedDevice != NULL) { KdPrint(("Att: 0x%x",pTmpDev->AttachedDevice)); KdPrint(("Dri Name : %wZ",&pTmpDev->AttachedDevice->DriverObject->DriverName)); if(RtlCompareUnicodeString(&pTmpDev->AttachedDevice->DriverObject->DriverName, &kbdDriName,TRUE) == 0) { break; } pTmpDev = pTmpDev->AttachedDevice; } if(pTmpDev->AttachedDevice == NULL) { return status; } KdPrint(("pTmpDev : 0x%x",pTmpDev)); KdPrint(("pTmpDev->AttachedDevice: 0x%x",pTmpDev->AttachedDevice)); pTargetDeviceObject = KbdDriverObject->DeviceObject; while(pTargetDeviceObject) { KdPrint(("pTargetDeviceObject : 0x%x", pTargetDeviceObject)); //查找kbdclass的父设备 if(pTmpDev->AttachedDevice != pTargetDeviceObject) { pTargetDeviceObject = pTargetDeviceObject->NextDevice; continue; } DeviceExt = (UCHAR *)pTmpDev->DeviceExtension; g_KbdCallBack.classDeviceObject = NULL; //遍历我们先找到的端口驱动的设备扩展的每一个指针 for (i=0;i<4096;i++, DeviceExt++) { PVOID tmp; if (!MmIsAddressValid(DeviceExt)) { break; } //找到后会填写到这个全局变量中,这里检查是否已经填好了 //如果已经填好了就不用继续找了,可以直接退出 if (g_KbdCallBack.classDeviceObject && g_KbdCallBack.serviceCallBack) { status = STATUS_SUCCESS; break; } //在端口驱动的设备扩展里,找到了类驱动设备对象,填好类驱动设备对象后继续 tmp = *(PVOID*)DeviceExt; if (tmp == pTargetDeviceObject) { g_KbdCallBack.classDeviceObject = (PDEVICE_OBJECT)tmp; continue; } //如果在设备扩展中找到一个地址位于KbdClass这个驱动中,就可以认为,这就是我们要找的回调函数 if ((tmp > KbdDriverStart) && (tmp < (UCHAR*)KbdDriverStart+KbdDriverSize) && (MmIsAddressValid(tmp))) { //将这个回调函数记录下来 g_KbdCallBack.serviceCallBack = (KEYBOARDCLASSSERVICECALLBACK)tmp; g_KbdCallBack.AddServerCallBack = (PVOID*)DeviceExt; } } if(status == STATUS_SUCCESS) { break; } //换成下一个设备,继续遍历 pTargetDeviceObject = pTargetDeviceObject->NextDevice; } return status; } NTSTATUS SearchServiceCallBack(IN PDRIVER_OBJECT DriverObject) { //定义用到的一组全局变量,这些变量大多数是顾名思义的 NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING uniNtNameString; PDEVICE_OBJECT pTargetDeviceObject = NULL; PDRIVER_OBJECT KbdDriverObject = NULL; PDRIVER_OBJECT KbdhidDriverObject = NULL; PDRIVER_OBJECT Kbd8042DriverObject = NULL; PDRIVER_OBJECT UsingDriverObject = NULL; PDEVICE_OBJECT UsingDeviceObject = NULL; PVOID UsingDeviceExt = NULL; //这里的代码用来打开USB键盘端口驱动的驱动对象 RtlInitUnicodeString(&uniNtNameString,USBKBD_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE,NULL,0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&KbdhidDriverObject); if (!NT_SUCCESS(status)) { KdPrint(("Couldn't get the USB driver Object\n")); }else { ObDereferenceObject(KbdhidDriverObject); KdPrint(("get the USB driver Object\n")); } //打开PS/2键盘的驱动对象 RtlInitUnicodeString(&uniNtNameString,PS2KBD_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&Kbd8042DriverObject); if (!NT_SUCCESS(status)) { KdPrint(("Couldn't get the PS/2 driver Object %08x\n",status)); }else { ObDereferenceObject(Kbd8042DriverObject); KdPrint(("get the PS/2 driver Object\n")); } //这段代码考虑有一个键盘起作用的情况。如果USB键盘和PS/2键盘同时存在,直接返回失败即可 if (Kbd8042DriverObject && KbdhidDriverObject) { return STATUS_UNSUCCESSFUL; } //如果两个设备都没有找到 if (!Kbd8042DriverObject && !KbdhidDriverObject) { return STATUS_SUCCESS; } //找到合适的驱动对象,不管是USB还是PS/2,反正一定要找到一个 UsingDriverObject = Kbd8042DriverObject? Kbd8042DriverObject:KbdhidDriverObject; RtlInitUnicodeString(&uniNtNameString,KBD_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE,NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&KbdDriverObject); if (!NT_SUCCESS(status)) { //如果没有成功,直接返回即可 KdPrint(("MyAttach: Coundn't get the kbd driver Object\n")); return STATUS_UNSUCCESSFUL; }else { ObDereferenceObject(KbdDriverObject); } //遍历KbdDriverObject下的设备对象 UsingDeviceObject = UsingDriverObject->DeviceObject; while(UsingDeviceObject) { status = SearchServiceFromExt(KbdDriverObject,UsingDeviceObject); if(status == STATUS_SUCCESS) { break; } UsingDeviceObject = UsingDeviceObject->NextDevice; } //如果成功找到了,就把这个函数替换成我们自己的回调函数 if (g_KbdCallBack.classDeviceObject && g_KbdCallBack.AddServerCallBack && g_KbdCallBack.serviceCallBack) { KdPrint(("Hook keyboradClassServiceCallback\n")); *(KEYBOARDCLASSSERVICECALLBACK *)g_KbdCallBack.AddServerCallBack = MyKeyboardClassServiceCallback; InitGlobalKey(g_KbdCallBack.classDeviceObject); } return status; } 当年写的,不知道能不能用。 |
|
|
[下载] WIN7 64 SP1 下实现自定义系统函数
ri....,动作这么快。。。 |
|
|
[求助]java 代码 如何 翻译成C++
1. Byte[] 变成2个参数,一个数组地址,一个数组长度。 2. 自己找找C++的MD5、DES、BASE64的算法。(调用OPENSSL的crypto或windows的CSP应该也可以)。 3. 根据算法的函数定义,改写JAVA程序就行了。 4. C++的返回值,如果是Char*,记得内存释放。 |
|
|
|
|
|
[求助]win7下特征码搜索出来的KeyboardClassServiceCallback模拟键鼠无效,怎么回事呢?
应该可以,不过64位驱动需要签名 |
|
|
[原创]模拟按键所有方法技术实现
顶你个肺。。。。 |
|
|
[求助]win7下特征码搜索出来的KeyboardClassServiceCallback模拟键鼠无效,怎么回事呢?
键盘的代码: NTSTATUS SearchServiceFromKdbExt(PDRIVER_OBJECT KbdDriverObject,PDEVICE_OBJECT pPortDev) { PDEVICE_OBJECT pTargetDeviceObject = NULL; UCHAR *DeviceExt; int i=0; NTSTATUS status; PVOID KbdDriverStart; ULONG KbdDriverSize = 0; PDEVICE_OBJECT pTmpDev; UNICODE_STRING kbdDriName; KbdDriverStart = KbdDriverObject->DriverStart; KbdDriverSize = KbdDriverObject->DriverSize; status = STATUS_UNSUCCESSFUL; RtlInitUnicodeString(&kbdDriName,KBD_DRIVER_NAME); pTmpDev = pPortDev; while(pTmpDev->AttachedDevice != NULL) { KdPrint(("Att: 0x%x",pTmpDev->AttachedDevice)); KdPrint(("Dri Name : %wZ",&pTmpDev->AttachedDevice->DriverObject->DriverName)); if(RtlCompareUnicodeString(&pTmpDev->AttachedDevice->DriverObject->DriverName, &kbdDriName,TRUE) == 0) { break; } pTmpDev = pTmpDev->AttachedDevice; } if(pTmpDev->AttachedDevice == NULL) { return status; } pTargetDeviceObject = KbdDriverObject->DeviceObject; while(pTargetDeviceObject) { if(pTmpDev->AttachedDevice != pTargetDeviceObject) { pTargetDeviceObject = pTargetDeviceObject->NextDevice; continue; } DeviceExt = (UCHAR *)pTmpDev->DeviceExtension; g_KoMCallBack.KdbDeviceObject = NULL; //遍历我们先找到的端口驱动的设备扩展的每一个指针 for (i=0;i<4096;i++, DeviceExt++) { PVOID tmp; if (!MmIsAddressValid(DeviceExt)) { break; } //找到后会填写到这个全局变量中,这里检查是否已经填好了 //如果已经填好了就不用继续找了,可以直接退出 if (g_KoMCallBack.KdbDeviceObject && g_KoMCallBack.KeyboardClassServiceCallback) { status = STATUS_SUCCESS; break; } //在端口驱动的设备扩展里,找到了类驱动设备对象,填好类驱动设备对象后继续 tmp = *(PVOID*)DeviceExt; if (tmp == pTargetDeviceObject) { g_KoMCallBack.KdbDeviceObject = pTargetDeviceObject; continue; } //如果在设备扩展中找到一个地址位于KbdClass这个驱动中,就可以认为,这就是我们要找的回调函数 if ((tmp > KbdDriverStart) && (tmp < (UCHAR*)KbdDriverStart+KbdDriverSize) && (MmIsAddressValid(tmp))) { //将这个回调函数记录下来 g_KoMCallBack.KeyboardClassServiceCallback = (KEYBOARDCLASSSERVICECALLBACK)tmp; } } if(status == STATUS_SUCCESS) { break; } //换成下一个设备,继续遍历 pTargetDeviceObject = pTargetDeviceObject->NextDevice; } return status; } NTSTATUS SearchKdbServiceCallBack(IN PDRIVER_OBJECT DriverObject) { //定义用到的一组全局变量,这些变量大多数是顾名思义的 NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING uniNtNameString; PDEVICE_OBJECT pTargetDeviceObject = NULL; PDRIVER_OBJECT KbdDriverObject = NULL; PDRIVER_OBJECT KbdhidDriverObject = NULL; PDRIVER_OBJECT Kbd8042DriverObject = NULL; PDRIVER_OBJECT UsingDriverObject = NULL; PDEVICE_OBJECT UsingDeviceObject = NULL; PVOID UsingDeviceExt = NULL; //这里的代码用来打开USB键盘端口驱动的驱动对象 RtlInitUnicodeString(&uniNtNameString,USBKBD_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE,NULL,0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&KbdhidDriverObject); if (!NT_SUCCESS(status)) { KdPrint(("Couldn't get the USB driver Object\n")); }else { ObDereferenceObject(KbdhidDriverObject); KdPrint(("get the USB driver Object\n")); } //打开PS/2键盘的驱动对象 RtlInitUnicodeString(&uniNtNameString,PS2KBD_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&Kbd8042DriverObject); if (!NT_SUCCESS(status)) { KdPrint(("Couldn't get the PS/2 driver Object %08x\n",status)); }else { ObDereferenceObject(Kbd8042DriverObject); KdPrint(("get the PS/2 driver Object\n")); } //这段代码考虑有一个键盘起作用的情况。如果USB键盘和PS/2键盘同时存在,用PS/2键盘 //如果两个设备都没有找到 if (!Kbd8042DriverObject && !KbdhidDriverObject) { return STATUS_SUCCESS; } //找到合适的驱动对象,不管是USB还是PS/2,反正一定要找到一个 UsingDriverObject = Kbd8042DriverObject? Kbd8042DriverObject:KbdhidDriverObject; RtlInitUnicodeString(&uniNtNameString,KBD_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE,NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&KbdDriverObject); if (!NT_SUCCESS(status)) { //如果没有成功,直接返回即可 KdPrint(("MyAttach: Coundn't get the kbd driver Object\n")); return STATUS_UNSUCCESSFUL; }else { ObDereferenceObject(KbdDriverObject); } //遍历KbdDriverObject下的设备对象 UsingDeviceObject = UsingDriverObject->DeviceObject; while(UsingDeviceObject) { status = SearchServiceFromKdbExt(KbdDriverObject,UsingDeviceObject); if(status == STATUS_SUCCESS) { break; } UsingDeviceObject = UsingDeviceObject->NextDevice; } //如果成功找到了,就把这个函数替换成我们自己的回调函数 if (g_KoMCallBack.KdbDeviceObject && g_KoMCallBack.KeyboardClassServiceCallback) { KdPrint(("Find keyboradClassServiceCallback\n")); InitVk2SC(); } return status; } |
|
|
[求助]win7下特征码搜索出来的KeyboardClassServiceCallback模拟键鼠无效,怎么回事呢?
NTSTATUS SearchServiceFromMouExt(PDRIVER_OBJECT MouDriverObject,PDEVICE_OBJECT pPortDev) { PDEVICE_OBJECT pTargetDeviceObject = NULL; UCHAR *DeviceExt; int i=0; NTSTATUS status; PVOID KbdDriverStart; ULONG KbdDriverSize = 0; PDEVICE_OBJECT pTmpDev; UNICODE_STRING kbdDriName; KbdDriverStart = MouDriverObject->DriverStart; KbdDriverSize = MouDriverObject->DriverSize; status = STATUS_UNSUCCESSFUL; RtlInitUnicodeString(&kbdDriName,MOU_DRVIER_NAME); pTmpDev = pPortDev; while(pTmpDev->AttachedDevice != NULL) { KdPrint(("Att: 0x%x",pTmpDev->AttachedDevice)); KdPrint(("Dri Name : %wZ",&pTmpDev->AttachedDevice->DriverObject->DriverName)); if(RtlCompareUnicodeString(&pTmpDev->AttachedDevice->DriverObject->DriverName, &kbdDriName,TRUE) == 0) { KdPrint(("Find Object Device: ")); break; } pTmpDev = pTmpDev->AttachedDevice; } if(pTmpDev->AttachedDevice == NULL) { return status; } pTargetDeviceObject = MouDriverObject->DeviceObject; while(pTargetDeviceObject) { if(pTmpDev->AttachedDevice != pTargetDeviceObject) { pTargetDeviceObject = pTargetDeviceObject->NextDevice; continue; } DeviceExt = (UCHAR *)pTmpDev->DeviceExtension; g_KoMCallBack.MouDeviceObject = NULL; //遍历我们先找到的端口驱动的设备扩展的每一个指针 for (i=0;i<4096;i++, DeviceExt++) { PVOID tmp; if (!MmIsAddressValid(DeviceExt)) { break; } //找到后会填写到这个全局变量中,这里检查是否已经填好了 //如果已经填好了就不用继续找了,可以直接退出 if (g_KoMCallBack.MouDeviceObject && g_KoMCallBack.MouseClassServiceCallback) { status = STATUS_SUCCESS; break; } //在端口驱动的设备扩展里,找到了类驱动设备对象,填好类驱动设备对象后继续 tmp = *(PVOID*)DeviceExt; if (tmp == pTargetDeviceObject) { g_KoMCallBack.MouDeviceObject = pTargetDeviceObject; continue; } //如果在设备扩展中找到一个地址位于KbdClass这个驱动中,就可以认为,这就是我们要找的回调函数 if ((tmp > KbdDriverStart) && (tmp < (UCHAR*)KbdDriverStart+KbdDriverSize) && (MmIsAddressValid(tmp))) { //将这个回调函数记录下来 g_KoMCallBack.MouseClassServiceCallback = (MouseClassServiceCallback_PTR)tmp; g_KoMCallBack.MouSerCallAddr = (PVOID *)DeviceExt; status = STATUS_SUCCESS; } } if(status == STATUS_SUCCESS) { break; } //换成下一个设备,继续遍历 pTargetDeviceObject = pTargetDeviceObject->NextDevice; } return status; } |
|
|
[求助]win7下特征码搜索出来的KeyboardClassServiceCallback模拟键鼠无效,怎么回事呢?
NTSTATUS SearchMouServiceCallBack(IN PDRIVER_OBJECT DriverObject) { //定义用到的一组全局变量,这些变量大多数是顾名思义的 NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING uniNtNameString; PDEVICE_OBJECT pTargetDeviceObject = NULL; PDRIVER_OBJECT KbdDriverObject = NULL; PDRIVER_OBJECT KbdhidDriverObject = NULL; PDRIVER_OBJECT Kbd8042DriverObject = NULL; PDRIVER_OBJECT UsingDriverObject = NULL; PDEVICE_OBJECT UsingDeviceObject = NULL; PVOID UsingDeviceExt = NULL; //这里的代码用来打开USB键盘端口驱动的驱动对象 RtlInitUnicodeString(&uniNtNameString,USBMOU_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE,NULL,0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&KbdhidDriverObject); if (!NT_SUCCESS(status)) { KdPrint(("Couldn't get the USB Mouse Object\n")); }else { ObDereferenceObject(KbdhidDriverObject); KdPrint(("get the USB Mouse Object\n")); } //打开PS/2键盘的驱动对象 RtlInitUnicodeString(&uniNtNameString,PS2MOU_DRIVER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&Kbd8042DriverObject); if (!NT_SUCCESS(status)) { KdPrint(("Couldn't get the PS/2 Mouse Object %08x\n",status)); }else { ObDereferenceObject(Kbd8042DriverObject); KdPrint(("get the PS/2 Mouse Object\n")); } //如果两个设备都没有找到 if (!Kbd8042DriverObject && !KbdhidDriverObject) { return STATUS_SUCCESS; } //如果USB键盘和PS/2键盘同时存在,使用USB鼠标 if (KbdhidDriverObject) { UsingDriverObject = KbdhidDriverObject; }else { UsingDriverObject = Kbd8042DriverObject; } RtlInitUnicodeString(&uniNtNameString,MOU_DRVIER_NAME); status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE,NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&KbdDriverObject); if (!NT_SUCCESS(status)) { //如果没有成功,直接返回即可 KdPrint(("MyAttach: Coundn't get the Mouse driver Object\n")); return STATUS_UNSUCCESSFUL; }else { ObDereferenceObject(KbdDriverObject); } //遍历KbdDriverObject下的设备对象 UsingDeviceObject = UsingDriverObject->DeviceObject; while(UsingDeviceObject) { status = SearchServiceFromMouExt(KbdDriverObject,UsingDeviceObject); if(status == STATUS_SUCCESS) { break; } UsingDeviceObject = UsingDeviceObject->NextDevice; } if (g_KoMCallBack.MouDeviceObject && g_KoMCallBack.MouseClassServiceCallback) { KdPrint(("Find MouseClassServiceCallback\n")); } return status; } |
|
|
[公告] 《2015移动安全挑战赛》100,000元奖金等你赢![比赛结束]
顶一下,希望能楼层中奖 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值