C语言内嵌汇编API内存搜索引擎实例
本文实例讲述了C语言内嵌汇编API内存搜索引擎的方法,分享给大家供大家参考。具体实现方法如下:
//
#include"stdafx.h"
#include<Windows.h>
DWORD__stdcallGetStrLengthA(char*szName)
{
_asm
{
pushedi
pushebx
moveax, szName
movedi,eax
movebx,eax
xoral,al
lstrscan:
scasbyteptr[edi] //字符扫描法检查字符串指针长度
jnzlstrscan
decedi
subedi,ebx
moveax,edi
popebx
popedi
}
}
DWORD__stdcallCalcBufferCRC(char*lpBuffer)
{
_asm
{
pushebx
pushedi
pushecx
pushebp
movebx,lpBuffer
pushebx
callGetStrLengthA
movedi,eax
shredi,2
xorecx,ecx
loopBegin:
decedi
jlloopOver
xorecx,dwordptr[ebx]
addebx,4
jmploopBegin
loopOver:
moveax,ecx
popebp
popecx
popedi
popebx
}
}
DWORD__stdcallGetProcAddressA(HANDLEhModule,DWORDdwExportCRC)
{
//DWORDlpProcNameCRC=;
DWORDdwProcNumber;
LPVOIDpProcAddress,pProcNameAddress,pProcIndexAddress;
_asm
{
pushebx
pushesi
moveax,hModule
movedx,dwExportCRC //edx=函数名CRC32
movebx,eax //ebx=基址
moveax,[ebx+0x3c] //eax=文件头偏移
movesi,[ebx+eax+0x78] //esi=输出表偏移,文件头+可选头的长度=$78
leaesi,[ebx+esi+0x18] //esi=函数名数量=函数数量[ebx+esi+$14]
lodsdwordptrds:[esi]
movdwProcNumber,eax //eax=函数名数量
lodsdwordptrds:[esi]
movpProcAddress,eax //eax=函数偏移量
lodsdwordptrds:[esi]
movpProcNameAddress,eax //eax=函数名偏移量
lodsdwordptrds:[esi]
movpProcIndexAddress,eax //eax=序列号偏移量
movedx,dwProcNumber //edx=遍历次数
LoopBegin:
xoreax,eax //Result=0
decedx
jlLoopEnd
moveax,pProcNameAddress
addeax,ebx //eax=函数名基地址
moveax,dwordptrds:[eax+edx*4]
addeax,ebx //eax=遍历函数名
pusheax
callCalcBufferCRC
cmpeax,dwExportCRC //对比CRC32
jnzLoopBegin
shledx,1
addedx,pProcIndexAddress //函数基序列
movzxeax,wordptrss:[edx+ebx]
shleax,2
addeax,pProcAddress //函数基地址
moveax,[eax+ebx]
addeax,ebx //Result=函数地址
LoopEnd:
popesi
popebx
}
}
DWORD__stdcallGetKernel32Module()
{
_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(nextmodule)
CMP [EDI+12*2],CL ;modulename[12]==0?
JNE next_module ;No:trynextmodule.
MOV EAX,EBP
POP EBP
}
}
intmain(intargc,char*argv[])
{
printf("writebyxiaoju!\n");
printf("*****************\n");
DWORDdwBaseKernel32=GetKernel32Module();
printf("Kernel32的模块地址:%08x\n",dwBaseKernel32);
DWORDLoadLibraryCRC32=CalcBufferCRC("LoadLibraryA");
printf("LoadLibraryA的CRC值(静态写到程序中):%08x\n\n",LoadLibraryCRC32);
DWORDdwAddrLoadLibrary=GetProcAddressA((HANDLE)dwBaseKernel32,0x577a7461);
printf("在程序中动态得到的LoadLibraryA的地址:%08x\n",dwAddrLoadLibrary);
getchar();
return0;
}
希望本文所述对大家的C程序设计有所帮助。
相关文章
- 记一次线上内存泄漏的破案过程
- 实时数据库 内存数据库_实时数据库产品
- java解释器虚拟机-java 虚拟机内存/线程共享情况
- 内存避障fence(一)一个内存乱序实例
- 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )
- C/C++内存管理
- 统计tomcat内存使用情况的jsp代码详解编程语言
- Linux下获取内存信息快速指南(linux获取内存信息)
- Linux系统内存管理实践指南(linux内存管理)
- Linux内存映射驱动:极大提升系统性能(linux内存映射驱动)
- Linux内存回收:掌握释放命令(linux内存回收命令)
- JVM之堆内存(年经代,老年代)详解编程语言
- 学习Linux: 如何优化内存使用(linux内存实例)
- Redis:基于内存的高性能数据库(redis内存数据库)
- Linux线程内存占用分析(linux线程内存占用)
- Redis创建新实例:高速、轻巧的内存数据存储平台(rediscreate)
- 管理Oracle实例:优化内存管理(oracle实例内存)
- 如何有效地清理Linux服务器内存(linux服务器清理内存)
- Oracle数据库内存优化提升系统性能(oracle内存调大)
- 内存Redis最佳的内存大小选择(redis选择多大)
- Oracle11依赖内存,谨防占用过多(oracle11占内存)
- 拆解发现华为P50 Pro采用三层CPU:或因买不到麒麟9000专用内存
- PHP内存缓存Memcached类实例
- Python使用稀疏矩阵节省内存实例
- 容易造成JavaScript内存泄露几个方面
- C语言内存对齐实例详解
- C#中string和StingBuilder内存中的区别实例分析