热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态获取API地址

cncpp动态获取API地址是病毒界和密界中常用的程序设计技术Author:属于中国破解组织-xIkUg[BCG][DFCG][OCN][DCM][CZG]Date:2004-

cncpp 

动态获取API地址是病毒界和密界中常用的程序设计技术
Author: 属于中国破解组织 - xIkUg[BCG][DFCG][OCN][DCM][CZG]
Date: 2004-07-28
Email: xikug@163.com
xIkUg's程序园: http://www.xp-program.com
XP-极限编程: http://bbs.xp-program.com


一点理论,Win32系统通过CreateProcess创建进程并运行一个程序。。。
在进入程序时跟一般的应用程序调用Call类似,会在堆栈中压入一个返回地址。。。这时压入的是kernel32.dll中一某一个返回地址,我们可以得到这个地址,然后找到kernel32.dll在内存中的基地址,然后找到Export Table,找到我们
需要GetModuleHandleA/LoadLibrary/GetProcAddress这几个Api函数的地址,就可以得到想要的Api地址,并在程序中使用了,这需要你对PE文件格式非常清楚

因为没有导入Api函数,在我们的程序中没有导入表,因此在OD中要调试这个程序就不能再用Api下断了,但是也有其他办法

下面我们来看看如何做,程序中已经添加了注释

001  .386
002  
003  .model flat, stdcall
004  
005  include d:/masm32/include/windows.inc
006  
007  
008  .code
009  
010  GetApiAddress PROC k32Base: DWORD, ApiName: DWORD
011      LOCAL    NumberOfNames: DWORD
012      
013      push    ebx
014      push    ecx
015      push    edx
016      push    ebp
017      push    esi
018      push    edi
019      
020      mov        edi, k32Base
021      mov        eax, edi
022      add        eax, [eax + 3Ch]                ;Kernel32.dll 的 PeHeader
023      
024      assume    eax: ptr IMAGE_NT_HEADERS
025      mov        ebx, edi
026      add        ebx, [eax].OptionalHeader.DataDirectory.VirtualAddress    ;IMAGE_EXPORT_DIRECTORY引出表入口
027      assume    eax: nothing
028  
029      mov        eax, ApiName
030      
031      mov        ecx, ebx
032      mov        ebx, [ecx + 1Ch]                ;AddressOfFunctions的地址
033      
034      mov        edx, ecx
035      mov        edx, [edx + 18h]                ;NumberOfNames地址
036      mov        NumberOfNames, edx
037      mov        edx, ApiName
038              
039      mov        ebp, ecx            ;IMAGE_EXPORT_DIRECTORY引出表入口
040      mov        ebp, [ebp + 20h]                ;AddressOfNames 地址
041      
042      mov        esi, ecx
043      mov        esi, [esi + 24h]                ;AddressOfNameOrdinals
044      
045  
046      push    ebx
047      push    ecx
048      push    esi
049      xor        ebx, ebx
050      xor        ecx, ecx
051      xor        eax, eax
052      add        ebp, edi
053      
054  getApiGetModuleHandleA:
055      mov        esi, edi
056      add        esi, [ebp + ecx * 4]
057  
058  cmpAPI:
059      mov        al, [edx + ebx]
060      cmp        al, [esi + ebx]
061      jne        getNext
062      inc        ebx
063      mov        al, 0
064      cmp        al, [esi + ebx]
065      jne        cmpAPI
066      je        getOK
067  getNext:
068      xor        ebx, ebx
069      inc        ecx
070      cmp        ecx, NumberOfNames
071      jne        getApiGetModuleHandleA
072         
073  getOK:
074      pop        esi
075      
076      add        esi, edi
077      ;ecx 为AddressOfNameOrdinals的index   
078      xor        eax, eax
079      mov        ax, word ptr [esi + ecx * 4]
080      
081      pop        ebx
082      pop        ebx
083      add        ebx, edi
084      mov        esi, [ebx + ecx * 4]
085      add        esi, edi                        ;esi为GetModuleHandleA的API地址
086      push    esi
087      pop        eax
088  
089      pop        edi
090      pop        esi
091      pop        ebp
092      pop        edx   
093      pop        ecx   
094      pop        ebx
095         
096      ret
097  
098  GetApiAddress endp
099  
100  start:
101      ;搜索kernel32.dll的基地址
102      mov        eax, [esp]
103      and        eax, 0ffff0000h
104      
105      xor        edx, edx
106      
107  getK32Base:
108      dec     eax                             ;逐字节比较验证
109      mov     dx,word  ptr [eax+IMAGE_DOS_HEADER.e_lfanew]   ;就是ecx+3ch
110      test    dx,0f000h                       ;Dos Header+stub不可能太大,超过4096byte
111      jnz     getK32Base                      ;加速检验
112      cmp     eax,dword ptr [eax+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
113      jnz     getK32Base                      ;看Image_Base值是否等于ecx即模块起始值,
114      mov        edi, eax
115      
116      mov        eax, offset sGetModuleHandleA
117      push    eax
118      push    edi
119      call    GetApiAddress
120      mov        esi, eax                        ;esi为GetModuleHandleA的API地址
121      
122      
123      mov        eax, offset sLoadLibraryA
124      push    eax
125      push    edi
126      call    GetApiAddress                    ;ebp为LoadLibraryA的API地址
127      mov        ebp, eax
128      
129      mov        eax, offset sGetProcAddress
130      push    eax
131      push    edi
132      call    GetApiAddress
133      mov        edi, eax                        ;edi为GetProcAddress的API地址
134      
135      mov        eax, offset sUser32
136      push    eax
137      call    ebp
138      
139      mov        ebx, offset sApiMessageBoxA
140      push    ebx
141      push    eax
142      call    edi
143      
144      mov        esi, eax                        ;eax为MessageBoxA
145      
146         
147      push    0
148      mov        eax, offset sTitle
149      push    eax
150      mov        eax, offset sCaption
151      push    eax
152      push    0
153      call    esi
154      
155      ret        
156  
157      sGetModuleHandleA        db        'GetModuleHandleA', 0
158      sGetProcAddress            db        'GetProcAddress', 0
159      sLoadLibraryA            db        'LoadLibraryA',0
160      sFreeLibrary            db        'FreeLibrary',0
161      sUser32                    db        'user32',0
162      
163      sApiMessageBoxA            db        'MessageBoxA',0
164      
165      sCaption                db        'Hello xIkUg!',0
166      sTitle                    db        'test',0
167      
168  end start
169  

源代码可到我的论坛下载:http://bbs.xp-program.com


推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
author-avatar
迅驰代驾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有