例说Exe程序作为DLL进行加载

c++ 动态加载DLL和静态加载DLL以及DLL的编写 1、DLL的编写 新建win32控制台或者win32项目,然后选择DLL 下面是自动生成的文件MyDll.h // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MYDLL_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 /... 阅读详情
 作 者: nbw
时 间: 2008-07-17,23:05
链 接: http://bbs.pediy.com/showthread.php?t=68730

例说Exe程序作为DLL进行加载




调用第三方exe程序里面的函数,一直是大家所向往并已经讨论过不少的问题,其方法大体有三类:

1、让第三方exe启动,然后自己程序注入进去调用之;

2、让第三方exe启动,然后远程读入其内容;

3、把第三方exe,当作DLL进行加载,并调用里面的函数。

前2个方法容易实现,但无法摆脱让exe运行的缺点,今天我们讨论第三条思路,把exe向dll一样加载,然后调用里面的函数。

就此,主要面临以下三个问题:

1、导入表修复;

2、重定位dll数据,也就是exe数据。

其实这2个问题归结起来都是重定位问题,这里就不再解释重定位原理和原因了。

有些人认为PE文件重定位,就要搞重定位表,exe要输出函数,就要搞导出表,这些其实是不必要的,只要理解了他们的原理,自己实现反而更方便。当然,另外一点原因是我现在基本忘却PE结构了。以下方法不涉及给exe增加导出表或者重定位表。

举例来说碰到的问题和解决思路,exe里面有如下代码:

        push    425570                           ; /kernel32.dll
        call    dword ptr [425280]               ; /GetModuleHandleA

这个很正常,也很简单, 0x425570 指向一个字符串, [425280] 里面是 GetModuleHandleA 函数指针,也就是导入表内容。但如果把这个exe作为DLL进行LoadLibrary,你会发现这2行代码仍然如此,一点也没变,但却无法执行了,因为这时候涉及到的这2个指针,指向的内容已经不是我们预想的了,需要把它们重定位,才能让他们指向预期目的地。重定位方法也很简单:


1、 0x425570 ,这个地址,用当前自身模块基地址加上 0x25570 ,就是新的地址;

2、 0x425280 ,这个地址,用当前自身模块基地址加上 0x25280 ,就是新的地址;

理解了这一点,就知道我们需要作什么了。

口说无凭,动手为真,下面我们举例来进行说明。就采用壳狼最近写的antidebugger测试程序吧,当然没经过他的同意 :)

目的:加载 AntiDebug.exe,调用它的第一个标签里面的 Find Debugger 功能,里面有20多个选项,我们争取把它调用完!

调用函数: 

简单跟踪以下,他这些反调试手段都在一个函数体内,调用方式如下:

00404FCC   .  50            push    eax
00404FCD   .  8BCB          mov     ecx, ebx        //这句无所谓,可以nop
00404FCF   .  E8 ECF1FFFF   call    004041C0

实现方式也很简单:

    hMod = LoadLibrary(ExePath);
    
    DWORD FindDebugerCall = (DWORD)hMod + 0x41C0;
    
    _asm{
        push 0xFFFFFFFF         //这里是调用标记,如果为这个参数,表示所有的反调试功能都选了
        mov  eax, FindDebugerCall
        call eax;
    }       


最终我们的目的就是要让上面这个函数正常运行。为此,我们要作以下大量工作。



一、修复输入表


    思路很简单,首先根据被加载dll的模块基地址,找到其导入表,然后根据其函数名,自己获取导入函数地址,重新填入到正常位置。
    
    在此感谢鸡蛋壳,让我在茫茫网海搜到了他的一些代码并加以改之。
    
    pDosHeader = (PIMAGE_DOS_HEADER)hMod;
    pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hMod + pDosHeader->e_lfanew);
    pOptHeader = (PIMAGE_OPTIONAL_HEADER)&(pNTHeaders->OptionalHeader);

    pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hMod + pOptHeader->DataDirectory[1].VirtualAddress);

    while(pImportDescriptor->FirstThunk)
    {
        //获取dll名称
        char * dllname = (char *)((BYTE *)hMod + pImportDescriptor->Name);

        pThunkData = (PIMAGE_THUNK_DATA)((BYTE *)hMod + pImportDescriptor->OriginalFirstThunk);

        int no = 1;
        while(pThunkData->u1.Function)
        {
            if ((pThunkData->u1.Ordinal &  IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG)
            {
                //获取函数名称
                char *funname = (char *)((BYTE *)hMod + (DWORD)pThunkData->u1.AddressOfData + 2);
                myaddr = (int*)GetProcAddress(GetModuleHandle(dllname), funname);
            }
            
            PDWORD lpAddr = (DWORD *)((BYTE *)hMod + (DWORD)pImportDescriptor->FirstThunk) +(no-1);

            MEMORY_BASIC_INFORMATION  mbi;
            VirtualQuery(lpAddr,&mbi,sizeof(mbi));
            VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOLD);
            WriteProcessMemory(GetCurrentProcess(), 
                lpAddr, &myaddr, sizeof(DWORD), NULL);
            VirtualProtect(lpAddr,sizeof(DWORD),dwOLD,0);

            no++;
            pThunkData++;
        }

        pImportDescriptor++;
    }
    
    这个东西搞完,DLL(也就是加载的exe,后面都叫dll)里面的API和其他导入函数可以正常使用了。
    

二、重定位代码段指针


    重定位意义比较广泛,大体有三类数据需要重定位。
    
    1、代码段指针。比如我上面举例的 push    425570 ,这个0x425570是个字符串指针。再比如 mov     edi, dword ptr [425400] , 这里面的 0x425400,也是指针,也需要重定位;
    
    2、数据段指针。比如这个exe里面,用到了一些SEH结构,SEH结构里面含有指向函数体的指针,比如:
    
    SEH异常处理结构:

    0042BA94  E0 1C 40 00 E6 1C 40 00 00 00 00 00 FE FF FF FF  ?@.?@.....?
    0042BAA4  00 00 00 00 D8 FF FF FF 00 00 00 00 FE FF FF FF  ....?....?
    0042BAB4  28 20 40 00 2E 20 40 00 00 00 00 00 FE FF FF FF  ( @.. @.....?
    0042BAC4  00 00 00 00 D4 FF FF FF 00 00 00 00 FE FF FF FF  ....?....?
    0042BAD4  95 24 40 00 9B 24 40 00 00 00 00 00 FE FF FF FF  ?@.?@.....?
    0042BAE4  00 00 00 00 D8 FF FF FF 00 00 00 00 FE FF FF FF  ....?....?
    0042BAF4  C8 28 40 00 CE 28 40 00 00 00 00 00 E4 FF FF FF  ?@.?@.....?
    0042BB04  00 00 00 00 B8 FF FF FF 00 00 00 00 FE FF FF FF  ....?....?

    这段数据,在数据段,里面有诸如 0x00401CE0 之类的指针,指向函数体,也需要重定位。

    3、其他一些野指针。这个就需要自己去调试找了。
    
    
    如何找上面三类数据,这是个问题,首先看一些需要重定位的例子:
    
            00407D5F   B9 402A4300      mov     ecx, 00432A40
            
            00408137   8B3D 90534200    mov     edi, dword ptr [425390]

            00D88131   FF15 78544200    call    dword ptr [425478]

    上面的三条,开头是代码地址,中间是opcode,后面是指令。我们需要把 00432A40 425390 425478 这3个地址重新转换成新的地址达到重定位的目的。他们的特点,是都是 0x004xxxxx,也就是大小在exe的代码段范围内,也就是exe的基地址加上模块大小。
    
    因此我们可以查找每条mov、call指令,判断一下立即数,发现有在这个范围内的,就认为该条需要重定位。
    
    但所需要处理的汇编指令和类型是在太多了,其他还有cmp je add ....
    
    所以我的思路,就是把程序里面每条指令都搜索以下,发现有类似常量,就把它揪出来供重定位。
    
    不可否认这个思路很挫,但实际也很有效。为此我找到了裸葱裸大虾的OD插件 ustrref 的代码,把这个很挫的思路应用在他的代码上。事实正明任何很挫的方法,只要跟裸大虾联系起来,就不仅不挫反而很有效了。
    
    对其StrFinder.cpp里面的代码进行修改,大体如下:
    
    
            if (    //这里只列举这几条指令情况,不全面
            (0 != memicmp(da.result, "mov", 3)) &&
            (0 != memicmp(da.result, "cmp", 3)) &&
            (0 != memicmp(da.result, "call", 4)) &&
            (0 != memicmp(da.result, "push", 4))
            )
            continue;

        ip1 = 0;
        ip2 = 0;

        for (int j = 0; j < MAXCMDSIZE; j++)
        {
            Readmemory(&pConst, da.ip + j, 4, MM_RESTORE | MM_SILENT);
            if ((pConst> 0x400000) && (pConst < 0x441000))
            {
                if (ip1 == 0)
                {
                    ip1 = da.ip + j;

                    sprintf((char*)pszStr, "0x%X  ,", ip1);

                    pCallBack(nStrIndex++, dwBase, dwOffset, dwSize, StrType, (char *)pszStr);

                    continue;
                }
                if (ip2 ==0)
                {
                    ip2 = da.ip + j;

                    sprintf((char*)pszStr, "0x%X  ,", ip2);

                    pCallBack(nStrIndex++, dwBase, dwOffset, dwSize, StrType, (char *)pszStr);

                    break;
                }
            }
        }
        
        修改后的代码很挫,因此得到的结果也很挫,大体如下:
        
        Address    Disassembly                                          Text String
        00401006   mov     eax, dword ptr [42FB98]                      0x401007  ,
        00401021   push    esi                                          0x40102A  ,
        00401022   push    eax                                          0x40102A  ,
        00401023   call    00412A80                                     0x40102A  ,
        00401028   mov     edi, dword ptr [<&KERNEL32.GetVersionExA>]   0x40102A  ,
        00401120   push    00425570                                     0x401121  ,
        00401120   push    00425570                                     0x401127  ,
        00401125   call    dword ptr [<&KERNEL32.GetModuleHandleA>]     0x401127  ,
        00401125   call    dword ptr [<&KERNEL32.GetModuleHandleA>]     0x40112C  ,
        0040112B   push    0042555C                                     0x40112C  ,
        0040112B   push    0042555C                                     0x401133  ,
                    ...............................
                    
        总共9476条,里面还有很多重复的,过滤一下剩下2803条。后面的 Text String ,是需要重定位的数据地址。以第一条为例:
        
        00401006   mov     eax, dword ptr [42FB98]                      0x401007  ,
    
        表示 0x401007 这个内存处的数据 0x42FB98 需要重新定位以下。
        
        当然这么多数据,里面有很多不能随便修改的,譬如:
        
        0040439A  F7C3 00400000  test    ebx, 4000
        
        按照我上面的思路,把这个地方也搜索出来了,因为里面有 0x04307C,但实际上这个地方不能修改,所以我们手工挑出来删除就可以了。
        
        另外还有比如:
        
        //这个地方是短跳转,也不能修改
        00413ECC   > /E8 BF400000   call    00417F90
        
        其他还有很多,需要自己去调试了。
        
三、重定位数据段数据

    上面说了对付代码段内容,但对付数据段,就没这么简单了。比如我上面提到的SEH结构,这个地方的内存数据是exe运行起来才加载处理的,没有好的办法找出来,只有靠自己去调试。
    
    拿上面SEH例子来说,编译后运行,会出错,错误地点定位在:
    
    004043A2  |.  E8 F9F0FFFF   call    004034A0    //这个函数里面出错
    004043A7  |.  84C0          test    al, al
    004043A9  |.  74 0E         je      short 004043B9
    004043AB  |.  6A 00         push    0
    004043AD  |.  6A 10         push    10
    004043AF  |.  68 24664200   push    00426624                         ;  debugger is found by fd_find_debugger_window!
    004043B4  |.  E8 9A900000   call    0040D453
    
    上面得 call    004034A0,功能是“found by fd_find_debugger_window”,跟踪以下,他主要是强行关闭一个句柄,然后跳到一个异常处理的地方用到了某些SEH结构。跟踪,下面这段代码可能是在设置某个异常处理结构:

    0040E289  /$  8BC1          mov     eax, ecx
    0040E28B  |.  33D2          xor     edx, edx
    0040E28D  |.  33C9          xor     ecx, ecx
    0040E28F  |.  C700 14884200 mov     dword ptr [eax], 00428814  //这里0x00428814指向一个结构,里面含有函数地址指针
    0040E295  |.  8950 34       mov     dword ptr [eax+34], edx
    0040E298  |.  8950 54       mov     dword ptr [eax+54], edx
    0040E29B  |.  8948 4C       mov     dword ptr [eax+4C], ecx
    0040E29E  |.  8950 50       mov     dword ptr [eax+50], edx
    0040E2A1  /.  C3            retn
    
    0x00428814指向内容:
    
    00428814  83 E3 40 00 D8 B1 42 00 C8 E3 40 00 24 B2 42 00  冦@.乇B.茹@.$睟.
    00428824  E6 E4 40 00 70 B2 42 00 25 E7 40 00 BC B2 42 00  驿@.p睟.%鏎.疾B.
    00428834  25 E7 40 00                                      %鏎.c
    
    我们把 0x00428814 这个地方所有看起来貌似地址一样的数据统统重定位就可以了。
    
    
    
    其他还有很多地方,有的是被错误重定位了,有的是没有重定位,这些地方都需要靠人工调试去找出来。由于我们的目标程序本身就是反调试,这无疑让我调试起来有些吃力,最终仍然有2条功能没有实现:
    
    found by fd_parent_process!
    found by fd_find_debugger_window!
    
    这2功能的实现,不仅仅是重定位问题,还涉及到了程序的初始化问题。因为我们直接把exe给LoadLibrary起来他并没有执行本身的初始化部分,导致一些内存数据没有被初始化。
    
    原则上这个问题也很容易解决,我们自己调用函数OEP地方的代码就可以了,当然这肯定要导致我们所谓的dll会像exe一样启动起来出来自己的界面。所以可以在显示界面的地方搞点SMC,让他停留在那个地方不出现就可以了。
    
    话虽这么说,但这个启动过程是如此漫长,我修复了十几条重定位数据,仍然没有正常跑起来,我就放弃了。
    
    
    我附件里面的程序,首先启动LoadExe.exe,然后上面三个按钮分别用来加载exe、修复位导入表、重定位数据。
    
    下面的3个函数用来实现相关功能,都是调用的check.exe里面的函数。check.exe就是壳狼同学写的,我对被调用函数其稍微处理了一下,发现调试器以后直接返回,不弹出他自己的对话框。
    
    如果程序在你系统上执行产生非法、退出,那很正常,可以尝试打开调试器再跑我这个程序,如果运气好的话,能看到点东西,不至于白下载。
    
    
     上传的附件
文件类型: rarLoadExe.rar (2008-07-17 23:05, 232.0 KB, 177 次下载)
Dll与exe的区别及使用详解 DLL(Dynamic Link Library,动态链接库)和EXE(Executable, 可执行文件)是两种不同类型的文件格式,主要用于不同的目的。DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。由于DLL能被应用程序动态载入内存。所以,应用程序可以在需要时才将DLL载入到内存中,这让程序的可维护性变得很高。比如QQ的视频功能需要升级,那么负责编写QQ的程序员不必将QQ所有代码都重写,只需将视频功能相关的DLL文件重写即可。 阅读详情

相关推荐

dll是在何时被加载?如何延迟加载dll?

dll延迟加载,dll加载方式

Allen Roson 1779

像加载DLL一样加载EXE

介绍 你可能已经被警告过,不要用LoadLibrary()加载可执行文件,你可能尝试这么做过,然后程序就崩溃了,所以你可能会认为这是不可能的。 但实际上这是可行的,本文就将介绍具体的方法。 声明 这好像跟微软说的有点不一样。实际上,微软没说不要加载,他们只是说“不要用LoadLibrary()加载可执行文件,应该用CreateProcess() ”。不过除非你很清楚

liujiayu2的专栏 1545

VS2008下把EXE程序转换成DLL

一个MFC项目进行到一半,界面都设计好了,领导突然说,要做成DLL的,NND,一句话,够折腾人的,界面重做的话,之前用2天,现在又需要2天,这个时间谁给?到时候项目不能按时完成,又会怪你做事不快,又会质问你,你之前工作没积累吗?这么简单的事情,要做这么久?我感觉有句话说的挺好的,没有教不会的学生,只有不会教的老师,或者说老师教的方法不对;换句话说,没有不会打仗的士兵,只有不会指挥的军官。

军说网事 9260

把exe文件当dll用,也可以在dll中调用exe中的函数

http://blog.sina.com.cn/s/blog_47108278010000hs.html 1. 被调用的exe文件   工程文件中 program Project1; uses   Forms,Dialogs,   Unit1 in 'Unit1.pas' {Form1}; {$R *.RES}   function mymsgbox:Boolean;expor

l799623787的专栏 4085

DLL注入explorer.exe进程

**DLL注入explorer.exe进程**   最近一直在学习dll注入远程进程的相关知识,于是有了这篇文章。通过注入的方式会运行程序,在资源管理器中是看不到,相关的进程的,这为程序的隐藏提供了极大的便利。 一、新建dll动态链接库,然后在dllmain.cpp文件中的 “case DLL_PROCESS_ATTACH:”下输入当你dll被进程加载时要执行的代码。这里我们用 “ Messag...

qq_20113959的博客 3867

VC2015,C++内存中运行EXE文件

本例中默认调用C:\111.EXE,测试时,请在这个位置放一个可以正常打开的程序,运行本例程序即可正常调用。但在VC2015中,就会出现一些错误,本项目源码已经把错误修正,可以正常编译并运行,感兴趣的可以下载。VC2015项目中所用的源码主要源自于网络,修正一些错误后,源码如下,此源码在VC6中可以正常编译,

1038

输入表:EXE怎么样调用DLL

** 输入表是PE文件结构中不可或缺的部分,输入表也称之为“导入表”。 首先还得先从DLL文件入手。日常生活中我们会看见一些大型软件有很多的DLL格式的文件,它们是“动态链接库文件”,这些文件中有很多的导入函数,这些函数不会直接被执行,当一个程序(EXE)运行时,导入函数是被程序调用执行的,其执行的代码是不在主程序(EXE)中的一小部分函数,其真正的代码却在DLL文件中。这时我们就

小猪快跑 1037

将EXE加载为DLL:可能执行任务

将一个EXE文件作为DLL加载到另一个EXE文件中并执行功能

exe也可以当Dll用

function abcd(x: integer): integer; stdcall; var Form1: TForm1; implementation function abcd(x: integer): Intege

haiou327’blog 1387

滤波器初步入门(非常全面)

主要关注的是-3dB这个点,-3dB就是截止频率所对应的点,我们把功率降至50%以下的信号定义为被衰减掉了(但要跟实际情况相结合,有些信号衰减-3db不够,需要衰减更多)-3dB这个点对应我们的电压来说是0.707。设计电路可以留一定的余量,如果你把4k设计为截止频率,那么4k时候衰减倍数为-3dB通常是不够的,你可以将截止频率设为2k,那么4k的衰减就可以达到15dB(假设),根据自己的需要去设计对应的截止频率。理想的滤波器是当输入的信号频率大于截止频率时,大于部分的频率对应的电压信号直接归0。

yybyybds的博客 5720

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 343

C#把dll打包到exe

把其他类库生成的dll,和现在的exe打包在一起,发给别人的时候,就发一个exe即可。 1.建立一个类库项目 代码 生成dll 2.建立一个winform项目 3.在项目中把dll引用里面去 4.把dll直接复制到项目的根目录中 并且修改下面2项 5.回到项目的界面上,在按钮中增加ClassLibrary1.dll的方法 6.在启动的地方加上代码 using System; using System.Collections.Generi...

故里2130 1万+

整理并记录几种运算放大器

运算放大器是一种十分常见的电子元器件,最近我在学习运放,以前在学校没有好好的学习,今天在B站看了唐老师讲运算放大器-唐老师讲电赛系列视频教程,记录下所学的,纯当是自己的笔记 学习运放,有两个重要的概念及重要的计算法宝,虚短vp=vn;和虚断ip=in 1反向比例运算电路 Rf可以大于、小于或等于R,起到放大、跟随、衰减输入的作用; 平衡电阻没有太高的精度要求,可加可不加; 有些运放内部集成了补偿电路,就不需要使用平衡电阻,加了反而增大误差,如OPA227 2.同向比例运放电路 .

qq_36823004的博客 6364

C#内存加载dll和EXE是不是差不多,主要是EXE有入口点

/ 被加载的 DLL 代码// 自定义有返回值方法内存加载并调用:csharp运行try// 1. 读取 DLL 字节(内存加载核心)// 2. 找 DLL 中的类型和方法(重点:自定义业务方法)if (calcType == null) throw new Exception("未找到 Calculator 类型");null,null);// 3. 调用方法并获取返回值Console.WriteLine($"DLL 方法返回值:{result}");// 输出 300。

901

从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析

本文详细解析了RK3588与FPGA通过PCIe通信的实战过程,涵盖驱动编译、数据传输及性能优化等关键步骤。通过XDMA驱动实现高效DMA传输,适用于视频处理、数据采集等高性能场景,帮助开发者快速掌握嵌入式系统中的PCIe通信技术。

weixin_29214691的博客 522

Mid-360激光雷达与Fast-LIO2实战:从环境搭建到实时点云建图

本文提供Livox Mid-360激光雷达与Fast-LIO2算法从零开始的实战教程。详细介绍了在Ubuntu和ROS环境下进行系统配置、依赖安装、硬件连接与网络设置的完整流程,并指导如何运行算法实现实时点云建图与可视化,最后总结了关键参数调优与常见问题排查方法。

weixin_29300241的博客 152

windows有哪些系统自带的exe应用程序 这些程序有可能被dll劫持吗

这些工具和应用程序大多数是Windows操作系统的内置部分,用于管理系统、网络、硬件、文件等。你可以通过执行这些exe文件来访问Windows中的各种功能,通常通过“运行”窗口(Win + R)或命令行界面来启动它们。需要注意的是,一些应用程序可能在不同版本的Windows中有所变化,具体情况可能有所不同。Windows 系统自带的许多工具和应用程序都有可能成为 DLL 劫持的攻击目标,尤其是那些通过动态加载 DLL 文件的应用程序。

sunminem的博客 2515

【OpenFOAM】-olaFlow-算例6- waveFloatingObject

波浪作用下的浮体的刚体运动,属于流固耦合(FSI)问题

ou_no的博客 3537

把C#程序(含多个Dll)合并成一个Exe的简单方法

开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了。但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具。那该怎么办呢?下文介绍一种超简单的方法,不用写一行代码就可轻松实现。这里我们需要用到一款名为Fody.Costura的工具。Fody.Costura是一个Fody框架下的插件,可通过Nuget安装到VS工程中。安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里。

anlog的专栏 1688

【第1章>第9节】基于FPGA的图像开运算处理算法的Verilog实现

本文介绍了基于FPGA的开运算图像处理实现方法。主要内容包括:1)输入图像二值化处理,通过阈值将灰度图像转换为二值图像;2)数据缓存与窗口提取,使用寄存器数组缓存5行图像数据并构建5×5处理窗口;3)腐蚀运算逻辑,判断窗口内是否全为白色像素;4)膨胀运算逻辑,检测窗口内是否存在白色像素。最后给出了Verilog实现方案,通过级联腐蚀和膨胀模块完成开运算处理。该方法可用于FPGA图像处理算法开发。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 313

AEJoy —— 最受欢迎的 5 个 Ae 表达方式

NOTE] 原文作者我意识到表达式可能令人生畏,有些人宁愿复制粘贴有用的代码,而不愿学习这门语言。对此我完全理解。因此,我想与您分享我的。这些是我几乎在每个项目中都会使用的表达式,我认为它们极大地提升了工作流程。

ShaderJoy 的兴趣技术杂货铺 363

将DLL打包在EXE文件中的两种方法

需求描述 在C#的项目中,经常会引用一些外部的DLL库。在发布的时候,必需将这些库和可执行程序一起发布,否则会导致程序无法运行。在一些项目中,会有这样的需求:希望发布一个单独的可执行文件,将所引用的DLL文件打包入EXE程序中的方式来实现。 实现原理 想要实现这个库有以下三种方式: 以嵌入的资源将DLL文件打包,然后在运行的时候再释放出来; 以嵌入的资源将DLL文件打包,然后在运行时直接加载至内...

郝伟老师的博客——大数据、并行计算与人工智能时代 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c++ 在内存中加载 exe/dll (不使用CreateProcess、LoadLibrary 等 API)

背景 在网上搜索了很多病毒木马的分析报告,看了一段时间后,发现还是有很多病毒木马都能够模拟PE加载器,把DLL或者是EXE等PE文件,直接从内存中直接加载到自己的内存中执行,不需要通过API函数去操作,以此躲过一些杀软的检测。 程序实现原理 首先,在EXE文件中,根据PE结构格式获取其加载映像的大小SizeOfImage,并根据SizeOfImage在自己的程序中申请一块可读、可写、可执行的内存,那么这块内存的首地址就是EXE程序的加载基址 然后,根据EXE中的PE结构格式获取其映像对齐大小Section

LYSM 6519

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

把C#程序(含多个Dll)合并成一个Exe的超简单方法

https://www.cnblogs.com/instance/archive/2015/10/09/4863811.html 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了。 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具。那该怎么办呢? 下文介绍一种超简单的方法,不用写一行代码就可轻松实现。 这里我们需要用到一款...

坚定的走 2293

C 将引用的DLL嵌入到EXE文件中

C# 将引用的DLL嵌入到EXE文件中 去发现同类优质开源项目:https://gitcode.com/ 应用场景 在开发C#应用程序时,为了简化分发过程,你可能需要将程序依赖的DLL文件直接集成到最终的可执行文件(EXE)中。这样做的好处是用户只需要拷贝一个单独的EXE文件即可运行应用,而不需要担心丢失或遗漏DLL文件。 实现步骤 1. 打开项目属性 在Visual Studio中,找到你的项...

gitblog_06683的博客 1164
上一篇: Rootkit Unhooker驱动逆向分析
下一篇: Sysinternal出品工具TcpView的驱动逆向源代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值