精华内容
下载资源
问答
  • 我有一个c#控制台程序 和一个写好的c++ dll, 想通过c#Task方式调用dll的函数&#...进而实现多线程?不想在dll添加任何导出,增加dll的整洁度(Tensorrt项目)    </p>
  • 当前项目,需要查看C++的目标进程的内存分配情况,最直接的方式就是跟踪new/delete的使用情况;通过查看libstd++的源码发现,new的底层调用的还是malloc(有的版本可能不是,需要注意,c++的标准里没有强制要求new...

    简介

    当前项目中,需要查看C++的目标进程的内存分配情况,最直接的方式就是跟踪new/delete的使用情况;通过查看libstd++的源码发现,new的底层调用的还是malloc(有的版本可能不是,需要注意,c++的标准里没有强制要求new的底层一定要通过malloc来实现);因此就对libstd++.so里的malloc进行hook【这里需要注意:不能对全局的malloc进行hook,而要对libstd++.so里的malloc进行hook】;

    具体实现

    当前考虑的方案是通过ptrace对目标进程进行attach后,操控目标进程load一个so,并且完成对libstd++.so里的malloc的plt hook;由于在load的so里需要起一个单独的线程,把统计到的malloc(对应到new)的调用信息上报到服务器,因此so可以理解为是多线程的so;而出于简单demo演示的考虑,设计的目标进程是单线程的,也就是一个while(1)循环一定时间;
    在这种情况下,注入so就是失败的;

    测试

    C程序测试

    一开始考虑是不是因为是g++和gcc的编译差别导致的?于是写了gcc编译的demo进行测试;
    结果:
    失败——说明不是gcc或者g++编译导致的问题

    注入链接了libpthread.so的so前,先强行load libpthread.so

    通过ptrace机制,在注入hook.so前,先强行loadlibpthread.so,代码大概如下:

        //for test 强行loadlibpthread.so
        long long int so_handle_0 = inject_so(pid, dlopen_addr, "/lib64/libpthread.so.0");
        if(0 == so_handle_0)
            PRINT_AND_DETACH_RETURN0(pid, "Insect Fail: /lib64/libpthread.so.0\n")
        printf("Insect Succ: /lib64/libpthread.so.0\n\n\n");
    
        //加载 .so ,并返回其handle,用于后续从该so中寻找要替换的函数的地址
        long long int so_handle = inject_so(pid, dlopen_addr, lib_path);
        if(0 == so_handle)
            PRINT_AND_DETACH_RETURN0(pid, "NOT FOUND: so_handle\n")
    
        printf("so_handle = 0x%llx\n", so_handle);
    

    这种情况下,load hook.so可以成功,但是load libpthread.so.0还是失败,创建线程当然也失败,原因未知

    代码强行load 该so

    加载so的执行程序编译时,不必加 -lpthread选项,并且通过ldd来查看该执行程序,动态链接里也是没有libpthread.so的;
    结果:
    没有问题,load成功(load所选的参数,跟通过ptrace的方式是一样的,都是: RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE ),并且能够创建并运行新线程;

    把目标进程编译成多线程版本

    在编译目标进程时,加上 -lpthread 选项——哪怕它里面完全没有任何涉及多线程的地方;so编译时,不必加 -lpthread 选项;
    结果:
    注入并且hook就都是成功的了;

    后续

    原本怀疑是不是静态编译和动态编译的问题,但通过ldd来查看编译出来的so时,发现该so的动态链接里是有libpthrad.so的,也就是说是动态链接的,应该没有问题;
    目前未确定原因,待查;

    展开全文
  • 动态链接 动态链接(dynamic-link library,DLL)是Windows操作系统...DLL作为包含可由个程序同时使用的代码和数据的,实现了资源共享,节省内存,使个应用程序共享DLL在内存的页面。自16位的Windows操作系
    1. 动态链接库
      动态链接库(dynamic-link library,DLL)是Windows操作系统提供的一种可执行文件,包含了所有Windows应用程序编程接口(Application Programming Interface, API)提供的函数。DLL作为包含可由多个程序同时使用的代码和数据的库,实现了资源共享,节省内存,使多个应用程序共享DLL在内存中的页面。自16位的Windows操作系统推出以后,Microsoft推出的各版本Windows操作系统都严重依赖动态链接库中的函数和数据。DLL很大程度上简化了项目管理,解决了平台差异,大大提高了软件开发和维护的效率。除上述优点外,DLL也是远程注入技术和Windows挂钩技术的基础技术支持之一。

    2. 远程线程注入技术
      Microsoft出于系统稳定性的需要,在设计操作系统时为每一个进程分配各自的私有地址空间,当进程内线程运行时,只对本进程内存享有访问控制权限。这种稳定的设计为访问其他进程资源设置了阻碍,远程线程注入技术的出现打破了这一局限。远程线程注入的核心思想是在另一个进程中创建远程线程,从而进入目标进程的地址空间,通过加载DLL文件,使目标进程积极配合执行意向代码。

      常规的远程线程注入技术都是在获取宿主进程PID后,获取待注入DLL完整路径,将其写入宿主进程内存后,利用CreateRemoteThread函数创建远程线程,LoadLibraryA/LoadLibraryW函数作为远程线程启动的入口函数,注入结束后,调用VirtualFreeEx函数释放先前申请的内存。CreateRemoteThread虽可以轻松地创建远程线程,但经过实际的开发测试发现这种注入方法极其不稳定,对64 bit操作系统及win7以上版本操作系统都不能很好支持,利用该技术实现的应用程序其跨平台性及实用性都将面临着极大的挑战。

    展开全文
  • 《Linux多线程服务端编程:使用muduo C++网络》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
  • 本文主要讲述了在Linux下使用libcurl进行多线程下载的方法,代码参考了libcurl使用多线程下载大文件源码示例!,感谢原作者的辛苦付出,另外本文使用到了libcur,所以需要编译Libcurl,编译的方法参考我之前的...
    
    
    

    前言

    本文主要讲述了在Linux下使用libcurl进行多线程下载的方法,代码参考了libcurl使用多线程下载大文件源码示例!,感谢原作者的辛苦付出,另外本文使用到了libcur,所以需要编译Libcurl,编译的方法参考我之前的博文Linux下使用libcurl下载入门(编译与示例),其实也是非常简单的。


    一、软件界面

    软件使用了四个线程下载,分别显示进度。

    如图,在linux下下载了一个1.2G的文件,本地使用nginx搭建的服务器,支持多个线程同时下载单个文件。

    二、使用步骤

    1.引入库

    在QT的工程文件中加入:

    其中路径需要结合自己的实际情况修改。

    LIBS += /home/autumoon/QTProject/curlTest/libcurl.so.4.7.0

    2.在widget中动态创建进度条

     

    因为是4个线程,所以创建了4个进度条。

        int nPosWidth = ui->wg_progress->width();
        int nPosHeight = ui->wg_progress->height();
        int nPartWidth = nPosWidth >> 2;
    
        for (int i = 0; i < 4; ++i)
        {
            QProgressBar* pBar = new QProgressBar(ui->wg_progress);
            pBar->setGeometry(nPartWidth * i, 0, nPartWidth, nPosHeight);
            g_vProgressBar.push_back(pBar);
        }
    
        g_vpProgressFunc.push_back(nProgress0);
        g_vpProgressFunc.push_back(nProgress1);
        g_vpProgressFunc.push_back(nProgress2);
        g_vpProgressFunc.push_back(nProgress3);

    因为是4个线程,所以分别设置了4个回调函数,注意界面上的操作使用了互斥锁,否则可能会出现错误提示,为了减少进度显示对下载的速度造成影响,于是使用了进度精度参数。

    回调函数具体内容如下:

    int MainWindow::nProgress0(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded)
    {
        if (g_vProgressBar.size() > 0)
        {
            int percent = 0;
            if (totalToDownload > 0)
            {
                percent = (int)(nowDownloaded / totalToDownload * 100);
                if(percent % g_nProcessPrecision == 0)
                {
                    g_mutex.lock();
                    g_vProgressBar[0]->setMaximum(totalToDownload);
                    g_vProgressBar[0]->setValue(nowDownloaded);
                    g_mutex.unlock();
                }
            }
        }
    
        return 0;
    }

    3.工程分享

    再次分享我个人的工程文件,注意你需要自己编译libcurl,然后替换我的工程文件中的libcurl.so.4.7.0文件才可以正常运行。

    蓝奏云:libCurlDownload.rar


    总结

    多线程下载非常方便,比如我使用nginx搭建的服务器,直接支持多线程下载。

    展开全文
  • 动态加载 Windows平台下,可以动态的对dll进行加载,使用到的API主要有:LoadLibrary、GetProcAddress、FreeLibrary等。下面以加载winmm.dll为例对相关代码进行简要介绍: 动态加载dll,在加载之前先进行...
    有了前面的hello world的经验,本文在其基础上研究一些实用功能的实现。

    库的动态加载

    Windows平台下,可以动态的对dll进行加载,使用到的API主要有:LoadLibrary、GetProcAddress、FreeLibrary等。下面以加载winmm.dll为例对相关代码进行简要介绍:
    动态加载dll,在加载之前先进行typedef,这里以实用winmm.dll中的函数PlaySound为例:

    typedef BOOL (__stdcall/*或者WINAPI*/* pPlaySound)(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound );
    接着加载dll并获取PlaySound的入口:
    HMODULE handle = LoadLibrary("winmm.dll");
    if(!handle)
    {
    //加载动态库不成功
    return;
    }
    else
    {
    pPlaySound PlaySound=NULL;
    PlaySound=(pPlaySound)::GetProcAddress(handle, "PlaySound");
    接下来就可以使用刚刚获取到的函数了:
    if(!PlaySound)
    {//加载函数不成功
    return;
    }
    else
    {//加载成功,执行
    HMODULE hmod=NULL;
    DWORD fdwSound=SND_FILENAME|SND_ASYNC;//SND_LOOP|
    PlaySound(_T("C:\\audio.wav"), hmod, fdwSound);
    }
    }
    使用完毕,进行释放:
    if (handle)
    {
    FreeLibrary(handle);
    }
    动态加载dll比较方便,但我用得比较多的是静态加载。

    库的静态加载

    还是以加载winmm库为例,静态加载就不是winmm.dll了而是winmm.lib,使用方法是首先包含头文件,然后使用#pragma来加载lib文件:
    代码如下:

    #include <MMSystem.h>
    #pragma comment(lib,"winmm.lib")
    接着在需要使用winmm.lib中的函数的地方只需要像调用其他函数一样进行调用即可,如:
    HMODULE hmod=NULL;
    DWORD fdwSound=SND_FILENAME|SND_ASYNC;//SND_LOOP|
    PlaySound(_T("C:\\audio.wav"), hmod, fdwSound);
    注意:前面的代码我都是在plugin::init中添加的,能够在测试页面打开后正确播放C盘的audio.wav文件。

    创建新线程

    该功能可以使用_beginthread(需包含头文件process.h)来创建新的线程也可也使用WIN API CreateThread(需包含头文件windows.h)来创建。
    测试这个功能可以创建一个新的线程,并在该线程中利用前面的代码播放声音文件:
    首先实现函数beginPlay,利用静态加载lib的方式来实现:

    void beginPlay(void*)
    {
    HMODULE hmod=NULL;
    DWORD fdwSound=SND_FILENAME|SND_ASYNC;//SND_LOOP|
    PlaySound(_T("C:\\audio.wav"), hmod, fdwSound);
    }
    在init中添加_beginthread(beginPlay,0,NULL);
    这样插件运行的时候就会在新创建的线程中播放声音文件了。


    展开全文
  • 一种语言的开发环境往往会附带有语言,这些就是对操作系统的API的包装,我们也称这些语言为运行 对于MSVC的运行(CRT),...在调试模式下,使用调试运行多线程调试(/MTd)、多线程调试DLL(/MDd) ...
  • MFC的使用,有三种设置: 1.使用标准Windows库 2.在静态库中使用MFC:是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行;.../MD:在dll中使用多线程,创建动态链接库的releas...
  • (1)Linux C中多线程与volatile变量 (2)linux C 的volatile使用 三、mdadm工具--搭建软RAID (1)Raid含义 (2)什么是RAID 0的条纹? (3)要求 (4)安装mdadm来管理RAID 第1步:更新系统并安装mdadm以管理...
  • MFC使用动态链接

    2016-07-24 10:40:53
    MFC创建动态链接库使用visual studio 2010创建动态链接库,创建时... 动态库(.dll) MFC的使用 在动态dll中使用MFC 运行库 多线程DLL(/MD) 如下为案列代码-头文件如下#ifndef __TEST_DLL__ #define __TEST_DLL__ #p
  • 和其它多线程一样,不能在IDE环境调试,只能编译EXE后再调试。 特别声明:此DLL仅限于VB爱者研究使用使用者请注明出处(首发于VBGOOD 链接地址http://www.vbgood.com/thread-108165-1-1.html),不得用于商业用途...
  • 调用第三方 多线程开发防止

    千次阅读 2013-12-03 15:24:44
    开发信用卡转账的问题集 ...在qt应用动态库,需要在.pro文件加入LIBS += -Lc:/gmc/qmf -lposinfqmf 说明:-LC:表示动态库.lib文件的路径,-l表示的是动态库.lib的名字。 2.头函数的编写  如果
  • 任务并行 (TPL) 是 .NET Framework 4 版的 System.Threading 和 System.Threading.Tasks 命名空间的一...TPL 会动态地按比例调节并发程度,以便最有效地使用所有可用的处理器。 此外,TPL 还处理工作分区、Thre...
  • 经过研究发现需要使用TLS技术来进行多线程本地存贮,为每一个线程开辟一块空间来存储C语言生成的dll动态库中需要保存的全局变量,这样来保证多线程调用dll中的方法时,dll中的全局变量相互独立,不受其他线程干扰。...
  • DLL的多线程

    万次阅读 2016-04-06 11:02:35
    VC++动态链接编程之多线程 在DLL可以处理多线程,...即便是一个控制台程序,我们都可以使用多线程: #include #include void ThreadFun(void) { while(1) { printf( "this is new thread/n" ); Sleep( 100
  • python多线程机制

    2015-10-28 17:23:29
    开发多线程的应用系统...同样身为动态语言,Ruby也提供了多线程的支持,但是在Ruby1.9之前的多线程机制是在语言的实现模拟了线程及线程调度机制,而并没有使用操作系统本身的线程机制(在以后的描述,我们称为原生
  • Python多线程机制

    千次阅读 2014-09-19 23:22:29
    开发多线程的应用系统,是在...同样身为动态语言,Ruby也提供了多线程的支持,但是在 Ruby 1.9之前的多线程机制是在语言的实现模拟了线程及线程调度机制,而并没有使用操作系统本身的线程机制(在以后的描述,我们
  •  将生产者和消费者模拟算法封装在一个动态链接库中,主程序调用相关函数。生产者放入产品和消费者取走产品的速度可调节。 分别用循环队列和栈实现。 一般模拟这个算法都是生产这,消费者各开一个线程,...
  • Java中集合类是Java编程中使用最频繁、最方便的类。集合类作为容器类可以存储任何类型的数据,当然也可以结合泛型存储指定的类型(不过泛型仅仅在编译期有效,运行时是会被擦除的)。集合类中存储的仅仅是对象的引用...
  • sgx intel ipp 加密使用

    千次阅读 2017-12-11 22:11:16
    在配置好sgx 和 ipp之后 若是想在enclave外部使用 ippcp,需要在引入ippcp.h 链接ippcp,这些都在ippcp的安装路径下: ...一般在普通程序中使用静态链接,在enclave中的程序使用动态链接 所以在链接时要注
  • 发布时,不需要静态。 vs2008,在工程属性直接将动态dll转为静态, 1、正式版本在Release-Static编译,Debug仍可正常使用 2、仍使用#pragma comment加载 ...3、dll和主程序的属性:运行——多线程(/MT)
  • Python多线程(1)

    千次阅读 2011-03-17 19:25:00
    同样身为动态语言,Ruby 也提供了多线程的支持,但是在Ruby 1.9 之前的多线程机制是在语言的实现模拟了线程及线程调度机制,而并没有使用操作系统本身的线程机制(在以后的描述,我们称为原生线程)。...
  • 1.DBSqlMan是多线程访问mysql的动态库 2.mysql5,开源的windows下使用的mysql2次开发库,mysql官网上可以下载 3.testDb,简单的应用DBSqlMan的例子 整个工程已经在VS2005下运行通过,并在实际应用中使用过。提供了...
  • 昨天遇到个令我斯巴达的问题,我在VC2003中生成MFC应用程序,我在项目属性页中设置[在静态库中使用 MFC]。无奈编译出来的程序还是动态链接到MFC库的。 今天在网上搜集了一些资料,成功解决。现将解决方法做个记录...
  • 2.在C++如果在制作含有模板函数的动态库时,一定要注意模板函数的声明和实现要放在一个文件,建议最好在一个hpp文件,否则即使动态链接动态库的时候没有出错,在执行的时候会报找不到定义的那个模板函数的错。...
  • 多核多线程,加速模糊,异步接口; :rocket: 类似于iOS的动态背景模糊:与使用RenderScript处理位图相比,该组件具有更好的性能和效果。 2.开始 下载 implementation ' com.hoko:hoko-blur:1.3.5 ' 静态模糊 同步...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,000
精华内容 400
关键字:

动态库中使用多线程