本文实例讲述了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语言的混合编程和调用方法。虽然其它高级
第8章 C语言与内存 C语言与内存 C语言指针初步 C语言指针进阶 C语言指针举例 C语言指针修饰符const C语言const举例 C语言volatile与typedef C语言运算符标签操作 C语言运算符加减举例 C语言指针越界访问举例 C语言指针逻辑运算符 C语言多级指针 C语言多级指针举例 C语言数组 C语言结构体字节对齐 C语言内存分布思想概述 C语言只读空间 C语言内存分布之数据段 C