当前位置: 首页 > 编程笔记 >

C语言内嵌汇编API内存搜索引擎实例

鲜于喜
2023-03-14
本文向大家介绍C语言内嵌汇编API内存搜索引擎实例,包括了C语言内嵌汇编API内存搜索引擎实例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C语言内嵌汇编API内存搜索引擎的方法,分享给大家供大家参考。具体实现方法如下:

// apisearchEngine.cpp : Defines the entry point for the console application.  

//  

  

#include "stdafx.h"  

#include <Windows.h>  

  

 DWORD __stdcall GetStrLengthA(char* szName)  

{  

    _asm  

    {  

        push edi  

        push ebx  

        mov eax,  szName  

        mov edi, eax  

        mov ebx, eax  

        xor al, al  

  

lstrscan:  

        scas byte ptr [edi]          //字符扫描法检查字符串指针长度   

        jnz lstrscan  

        dec edi  

        sub edi, ebx  

        mov eax, edi  

        pop ebx  

        pop edi  

          

    }  

}  

  

 DWORD __stdcall CalcBufferCRC(char* lpBuffer)  

{  

    _asm  

    {  

        push ebx  

        push edi  

        push ecx  

        push ebp  

        mov ebx, lpBuffer  

        push ebx  

        call GetStrLengthA  

        mov edi, eax  

        shr edi, 2  

        xor ecx, ecx  

loopBegin:  

        dec edi  

        jl loopOver  

        xor ecx, dword ptr [ebx]  

        add ebx, 4  

        jmp loopBegin  

loopOver:  

        mov eax, ecx  

        pop ebp  

        pop ecx  

        pop edi  

        pop ebx  

    }  

}  

  

DWORD __stdcall GetProcAddressA(HANDLE hModule, DWORD dwExportCRC)  

{  

    //DWORD lpProcNameCRC = ;  

    DWORD dwProcNumber;  

    LPVOID pProcAddress, pProcNameAddress, pProcIndexAddress;  

    _asm  

    {  

        push ebx  

        push esi  

          

        mov eax, hModule  

        mov edx,dwExportCRC      // edx=函数名CRC32  

        mov ebx, eax                // ebx=基址  

        mov eax, [ebx+0x3c]          // eax=文件头偏移  

        mov esi, [ebx+eax+0x78]      // esi=输出表偏移,文件头+可选头的长度=$78  

        lea esi, [ebx+esi+0x18]      // esi=函数名数量 = 函数数量 [ebx+esi+$14]  

        lods dword ptr ds:[esi]  

        mov dwProcNumber, eax       // eax=函数名数量  

        lods dword ptr ds:[esi]  

        mov pProcAddress, eax       // eax=函数偏移量  

        lods dword ptr ds:[esi]  

        mov pProcNameAddress, eax   // eax=函数名偏移量  

        lods dword ptr ds:[esi]  

        mov pProcIndexAddress, eax  // eax=序列号偏移量  

        mov edx, dwProcNumber       // edx=遍历次数  

LoopBegin:  

        xor eax, eax                // Result = 0  

        dec edx  

        jl LoopEnd  

        mov eax, pProcNameAddress  

        add eax, ebx                // eax=函数名基地址  

        mov eax, dword ptr ds:[eax+edx*4]  

        add eax, ebx                // eax=遍历函数名  

        push eax  

        call CalcBufferCRC  

        cmp eax, dwExportCRC      // 对比CRC32  

        jnz LoopBegin  

        shl edx, 1  

        add edx, pProcIndexAddress  // 函数基序列  

        movzx eax, word ptr ss:[edx+ebx]  

        shl eax, 2  

        add eax, pProcAddress       // 函数基地址  

        mov eax, [eax+ebx]  

        add eax, ebx                // Result = 函数地址  

LoopEnd:  

        pop esi  

        pop ebx  

          

    }  

} 

DWORD __stdcall GetKernel32Module()  {      _asm      {          PUSH    EBP          XOR     ECX, ECX          //MOV     ESI, [FS:ECX + 0x30]        ; ESI = &(PEB) ([FS:0x30])         MOV     ESI, FS:[0X30]          MOV     ESI, [ESI + 0x0C]           ; ESI = PEB->Ldr              MOV     ESI, [ESI + 0x1C]           ; ESI = PEB->Ldr.InInitOrder next_module:              MOV     EBP, [ESI + 0x08]           ; EBP = InInitOrder[X].base_address              MOV     EDI, [ESI + 0x20]           ; EBP = InInitOrder[X].module_name (unicode)             MOV     ESI, [ESI]                  ; ESI = InInitOrder[X].flink (next module)              CMP     [EDI + 12*2], CL            ; modulename[12] == 0 ?              JNE     next_module                 ; No: try next module.          MOV     EAX, EBP          POP     EBP      }  }  int main(int argc, char* argv[])  {      printf("write by xiaoju !\n");      printf("*****************\n");      DWORD dwBaseKernel32 = GetKernel32Module();      printf("Kernel32的模块地址:%08x\n",dwBaseKernel32);        DWORD LoadLibraryCRC32= CalcBufferCRC("LoadLibraryA") ;      printf("LoadLibraryA的CRC值(静态写到程序中):%08x\n\n", LoadLibraryCRC32);            DWORD dwAddrLoadLibrary = GetProcAddressA((HANDLE)dwBaseKernel32, 0x577a7461);       printf("在程序中动态得到的LoadLibraryA的地址:%08x\n", dwAddrLoadLibrary);      getchar();      return 0;  }

希望本文所述对大家的C程序设计有所帮助。

 类似资料:
  • 1. 引言 其实我们不知道的是,早期的计算机是没有内存的,但是如今我们去买电脑时,都会十分关心电脑内存的各种参数,因此可以看出内存对于电脑性能的重要性。那么为什么需要内存呢?换句话说,内存与计算机以及程序之间的关系又是什么呢?本章将会以内存为中心,探讨许多与内存相关的概念和话题,这些概念是学好后续C语言知识不可缺少的基础,因此希望读者认真对待本章节的内容。 2. 计算机程序运行的目的 2.1 什么

  • 本文向大家介绍汇编语言 寄存器内存访问原理解析,包括了汇编语言 寄存器内存访问原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字

  • 搜索引擎分为两部分: 时间筛选 和 搜索引擎 (详情) 1.时间筛选 便捷按钮有今日、昨日、前日、上周 X、近七天,并且能自定义选择时间段来得出想要的结果报表 2.搜索引擎 (时间段详情) 选择日期,查看来自对应时间段内,各个搜索引擎的访问量比例

  • 5. C内联汇编 用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码。另外,有些平台相关的指令必须手写,在C语言中没有等价的语法,因为C语言的语法和概念是对各种平台的抽象,而各种平台特有的一些东西就不会在C语言中出现了,例如x86是端口I/O,而C语言就没有这个概念,所以in/

  • 第12章 汇编语言和C语言 C/C++语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言的特点,如:寄存器变量、位操作等。所以,C语言的程序与汇编语言程序之间能很平滑地衔接。另外,目前主要的C语言程序开发环境,如:Turbo C/C++、Borland C/C++等,也都提供了很好的混合编程手段。 本章主要介绍汇编语言和C语言的混合编程和调用方法。虽然其它高级

  • lucene 和 es 的前世今生 lucene 是最先进、功能最强大的搜索库。如果直接基于 lucene 开发,非常复杂,即便写一些简单的功能,也要写大量的 Java 代码,需要深入理解原理。 elasticsearch 基于 lucene,隐藏了 lucene 的复杂性,提供了简单易用的 restful api / Java api 接口(另外还有其他语言的 api 接口)。 分布式的文档存储