控制台下输出DLL的调试信息

MQTT与物联网平台(一):基础知识和设备接入物联网平台的实现(以华为云为例) 本文简单介绍了MQTT的基础知识和使用方法,以蓝牙WIFI双模芯片W801作为硬件设备,接入到华为云。 阅读详情

问:

在cmd.exe下运行rundll32.exe mydll.dll,MyFunc ,本想直接在当前cmd窗口输出调试信息.
可因rundll32是Win32 GUI程序而非Win32 console,所以cmd.exe标准输入输出句柄无法被mydll.dll继承用来向父进程cmd.exe输出数据.
这时, 如果用强行用GetStdHandle获得句柄,然后用WriteConsole来进行输出,则会发生无效句柄错误.
但是如果在这之前先AllocConsole,则可正常WriteConsole,但是会新建个控制台窗口来输出数据,很不爽 :-P

有没有什么办法向当前cmd.exe窗口输出数据呢?

我想通过给进程拍照和遍历,
可以获得rundll32的父进程cmd.exe的PID和Handle,但如何进一步下去(建立管道, 写数据)就没辙了?

不知道有没有描述清楚 还是太罗嗦了,麻烦大家看看,谢谢~

 

答:

如果只是要输出数据的话 可以向父窗口 发送键盘消息 WM_CHAR 输出你的数据

 

 

代码

Code:


BOOL APIENTRY DllMain
( HANDLE hModule,
                       
DWORD  ul_reason_for_call
,
                       
LPVOID lpReserved
)
{
    switch (
ul_reason_for_call
)
    {
        case
DLL_PROCESS_ATTACH
:
            
ShowMe
();
            
        case
DLL_THREAD_ATTACH
:
        case
DLL_THREAD_DETACH
:
        case
DLL_PROCESS_DETACH
:
            break;

    }
    return
TRUE
;
}


void ShowMe
()
{
    
DWORD    dwProcID
;
    
HWND    hWnd
;
    
dwProcID = FindParentProcID(GetCurrentProcessId
());
        
sprintf(buf, "dwProcID:%d/nProcessId:%d ",  dwProcID, GetCurrentProcessId
());
        
MessageBox (NULL, buf, "提示", MB_ICONERROR
);
    if(
dwProcID == -1
)
        return;

    
hWnd = GetProcessMainWnd(dwProcID
);
    if(
hWnd ==NULL
)
        return;

    
SendMessage(hWnd, WM_CHAR, WPARAM('Z'), NULL
);
}


Code:

DWORD FindParentProcID
(DWORD dwChildProcID)        //找到返回父进程PID, 找不到返回-1
{
    
PROCESSENTRY32     pr32 = {0
};
    
pr32.dwSize = sizeof(PROCESSENTRY32);   
// 不要漏了这句

    // 提权先
    
DebugPrivilege(SE_DEBUG_NAME, TRUE
);    
    
// 给进程照相
    
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0
);
    
// 拍照失败, 返回-1
    
if (hSnap == (HANDLE)-1) return (DWORD)-1
;
    
    
// 开始枚举...
    
if (Process32First(hSnap,&pr32) == FALSE
)  
    {
        
CloseHandle( hSnap
);
        return (
DWORD)-1
;
    }

    do
    {
        if(
pr32.th32ProcessID == dwChildProcID
)  
        {            
// 如果被枚举到的进程ID等于所给的ID, 则返回父进程ID
            
CloseHandle( hSnap
);
            return
pr32.th32ParentProcessID
;
        }
    }
    while(
Process32Next(hSnap, &pr32
));

    
// 找不到父进程ID, 返回-1
    
CloseHandle(hSnap
);
    return -
1
;
}


Code:

typedef struct tagWNDINFO
{
    
DWORD dwProcessId
;
    
HWND hWnd
;
}
WNDINFO, *LPWNDINFO
;

BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam
)
{
    
DWORD dwProcessId
;
    
GetWindowThreadProcessId(hWnd, &dwProcessId
);
    
LPWNDINFO pInfo = (LPWNDINFO)lParam
;
    if(
dwProcessId == pInfo->dwProcessId
)
    {
        
pInfo->hWnd = hWnd
;
        return
FALSE
;
    }
    return
TRUE
;
}

HWND GetProcessMainWnd(DWORD dwProcessId)        
// 找到返回进程主窗口的hWnd, 如果没有,返回NULL
{
    
WNDINFO wi
;
    
wi.dwProcessId = dwProcessId
;
    
wi.hWnd = NULL
;
    
EnumWindows(YourEnumProc,(LPARAM)&wi
);
    return
wi.hWnd
;
}

 

 

 
系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例) 系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。 阅读详情

相关推荐

HFSS螺旋线圈的设计与仿真

undefined.全局变量在这里进行设置:Project/Project Properties, browse and setup the global variables.undefined.方程中的局部变量设置:HFSS/Design Properties, browse and setup the local variables。按照下图填写曲线的方程内容:fill the parameters according to the setup in the following picture。

johnboat的专栏 3847

在DLL 中输出调试信息

在C++ dll 中使用printf输出调试信息,可能会出现输出信息不及时的问题(尤其是在C#项目中),可以使用OutputDebugString 函数代替。这里为了方便,将OutputDebugString封装成一个函数,顺便支持不定长参数和时间打印,便于使用。 #include <windows.h> #include <stdio.h> #include <stdarg.h> void ShowDbgInfo(const char* data, ...)..

sinat_27720649的博客 5310

手把手教你用fusb302实现PD快充:从驱动移植到实战调试(附源码)

本文详细解析了基于FUSB302芯片实现USB PD快充的完整开发流程。内容涵盖芯片选型、硬件设计要点、Linux驱动移植与内核集成,并重点剖析了PD协议交互中的关键调试技巧,如“死亡15ms”时序问题与中断模式选择。文章通过实战经验,帮助嵌入式开发者高效完成从驱动移植到系统集成的全链路开发,并附有源码参考。

sky77的博客 378

如何在DLL中打印信息到控制台

在C/C++实现的动态链接库中,如果需要向控制台打印调试信息,根据具体情况,可能需要做处理: Invoker调用者: 调用者没有控制台 调用者有控制台 Dll动态链接库: 使用调用者的控制台 使用自己的控制台 动态链接库如果想使用调用者的控制台: 采用AttachConsole可以将调用者进程控制台IO attach到指定的进程控制台上,然后就可以使用Co...

weixin_30746117的博客 4016

ANSYS MAXWELL内置式永磁同步电机(IPMSM)转矩最大时输入电流相位的确定

1.在转子转速为零时看一个周期内的转矩变化

qq_41752507的博客 6517

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3014

VS2022 dll工程如何打印log

在调试LibOpenBLT的dll库时,发现错误但是无法调试的时候,可以在dll中打印log到console。1.打开项目属性-链接器-输入-附加依赖项。//打印到指定的控制台窗口。2.右键编辑-添加代码。

xxxcopyman的博客 1397

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

本文使用OpenCV C++ 实现基于轮廓比对的缺陷检测。

Zero___Chen的博客 1150

c语言调试dll,计算机二级考试C语言辅导:控制台下输出DLL的调试信息

在cmd.exe下运行rundll32.exe mydll.dll,MyFunc ,本想直接在当前cmd窗口输出调试信息.可因rundll32是Win32 GUI程序而非Win32 console,所以cmd.exe标准输入输出句柄无法被mydll.dll继承用来向父进程cmd.exe输出数据.这时, 如果用强行用GetStdHandle获得句柄,然后用WriteConsole来进行输出,则会发生...

weixin_35725862的博客 326

【GameFramework框架内置模块】9、有限状态机(FSM)

这篇文章分享FSM有限状态机,了解过StarForce源码的同学相比都比较了解,GameFramework框架给我们抽象了一个Procedure流程的概念。这个Procedure流程可以方便的处理我们游戏从启动到游戏的各个流程阶段的处理逻辑,实现的核心就是FSM状态机,内部的Procedure流程就是不同的FsmState状态。接下来,就是FSM有限状态机的教程了。有限状态机(Finite-state machine,FSM)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2533

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4137

全国二级c语言怎么调试,08年计算机二级考试C语言:控制台下输出DLL的调试信息...

在cmd.exe下运行rundll32.exemydll.dll,MyFunc,本想直接在当前cmd窗口输出调试信息.可因rundll32是Win32GUI程序而非Win32console,所以cmd.exe标准输入输出句柄无法被mydll.dll继承用来向父进程cmd.exe输出数据.这时,如果用强行用GetStdHandle获得句柄,然后用WriteConsole来进行输出,则会发生...

weixin_42499379的博客 370

【深度学习驱动流体力学】OpenFOAM目录流体力学求解器汇总介绍

下面这些目录结构和其中的求解器和工具展示了OpenFOAM作为一个功能强大且广泛应用的开源CFD软件框架的多样性和灵活性。每个求解器都专门用于解决不同类型的流体动力学问题,从基础的流动模拟到复杂的多相流动和燃烧模拟等各种应用场景。

源代码杀手的博客 1186

VC++ 通过控制台输出调试信息

用VC MFC/DLL编程时通常Debug版需要将测试信息通过控制台输出,而编译成Release版时需要将这些输出调试信息的代码给注释掉,通常这些代码较多操作比较麻烦。这个程序的作用就是为了程序员在进行MFC/DLL软件开发时Debug版可以在一个单独的控制台窗口进行调试程序的输出,而做成Release版时不必手工将这些代码注释掉,由此程序自动完成。注意:在一个进程之内只存在一个控...

老狼的专栏 1427

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MFC/DLL 编程时用独立的控制台窗口显示用户自定义调试信息

我将这个功能封装为两个文件,请将此文本内容下载到本地,保存为正确的文件名后使用。在不改变源代码的情况下实现,Debug版显示调试信息窗口,在Release版下不现实调试窗口且不增加程序负担。 ###############DBWindow.h################## /***********************************************************

1257

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MFC程序利用控制台输出调试信息

近日研究师兄的一个MFC程序,见其会生成一个控制台窗口输出信息,就如同ANSYS的Output窗口,觉得这个功能实在有用。          于是研究了一下他的代码,不过因为其为DLL工程,又可怜我的VC6打不开他的VS2005的Test工程,原先的工程没有办法编通过。          于是想把实现此功能的类拆出来,仔细研究之后,做了个Test工程,居然不好用,不知道哪里出了问题。    

多学多思 1225

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#之winform控制台打印输出、打印调试

开发winform的时候,使用控制台打印解决方法,需要先往主函数所在的源文件中加入以下内容。在C#的时候,使用的是Console.WriteLine("Hello World");// 允许调用控制台输出。/// 应用程序的主入口点。// 控制台输出,需加入此库。

lbaihao的专栏 7699

VC++ 中用来调试和输出 console 信息的工具

VC++ 中用来调试和输出 console 信息的工具   /******************************************************************** 创建日期: 2004/09/02 文件名称: DBWindow.h 作者: 袁桂芳(Fangrn) 版本: 2.0 邮箱: fangrn@163.com 创建目的: 用VC ...

Fangrn的专栏 874

运行QT的exe程序时将QDebug调试信息输出到控制台

运行QT的exe程序时将QDebug调试信息输出到控制台

LSL_Blogs的博客 4074

vs2019控制台c++调试信息打印到底部的输出窗口

vs2019控制台调试信息打印到底部的输出窗口。

Txwtech 1393

c# winform下调用命令行

之前在做winform的时候习惯性的想用控制台输出一些实时信息,以便调试。然而每次都直接写console.write();的时候都没有用,虽然也不报错。 VS号称宇宙最强IDE还是比较中肯的,毕竟微软和windows在那儿搁着。debug期间看信息一般打断点也都能解决,看对VS的熟练度了。 以下是在winform中调用console时需要的内容。 在program.cs中添加: =====

有莘曦的专栏 1852

form程序利用控制台输出

玩过单机游戏的人都应该有这种体会:按下一个特定按键,游戏便弹出一个类似dos的窗口,然后输入相关信息就可以改变游戏内容,大多数单机游戏都支持这种合法的作弊方式。 个人在开发form程序的时候,有时候会在后台用非界面线程处理一些耗时操作,有时希望能看到中间的一些调试信息,但是如果使用form输出,就会很麻烦,涉及到线程同步问题,而且有时候有些信息仅仅是为了给开发人员看的,这个时候便想到调用一个控制...

bus2046 1193

控制台调试程序

if(AllocConsole())  //申请控制台程序 分配     {         m_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);      }     else     {         m_hConsole=G

627
上一篇: ACPI BIOS RootKit 实践
下一篇: System Security Administration for NT
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值