首页 > 其他分享 >隐藏IAT和字符串

隐藏IAT和字符串

时间:2023-12-13 18:22:36浏览次数:30  
标签:int hello str 字符串 IAT include 隐藏

隐藏IAT和字符串

0x01 IAT

IAT即导入表,它记录了我们的文件用了哪些函数。

在杀软检测恶意程序时,导入表是一个重要的检测项,比如说我们的程序调用了Virtual AllocCreateThread,且VirtualAlloc的最后一个参数是0x40(即PAGE_EXECUTE_READWRITE ),那么在杀软看来,我们的程序就是一个高危文件。

我们所要做的就是隐藏我们所使用的敏感API,下面是一个小demo:

#include<stdio.h>
#include<Windows.h>

int main()
{
    printf("hello world\n");
    MessageBox(0, TEXT("hello world"), 0, 0);
    return 0;
}

我们编译后执行,得到结果如下:

image-20231213160421982

我们用dumpbin来查看我们的导入,命令如下:

dumpbin /IMPORTS demo.exe

image-20231213163255347

可以看到在USER32.dll中引用了MessageBoxW函数,我们现在尝试利用自定义MessageBoxW函数来隐藏其在导出表中的出现。

首先找到函数的原型:

image-20231213161417271

然后开始我们的自定义:

#include<stdio.h>
#include<Windows.h>

typedef int(WINAPI* pMessageBoxW)(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType
    );

pMessageBoxW MyMessageBoxW = (pMessageBoxW)GetProcAddress(LoadLibrary(L"USER32.dll"), "MessageBoxW");

int main()
{
    printf("hello world\n");
    MyMessageBoxW(0, TEXT("hello world"), 0, 0);
    return 0;
}

这里我们定义好函数之后,使用GetProcAddress将对应dll中的对应函数的地址拿到,然后给我们自己定义的函数,从而达到隐藏的目的。

GetProcAddress的定义如下:

GetProcAddress(
    _In_ HMODULE hModule,
    _In_ LPCSTR lpProcName
    );

第一个参数代表句柄,第二个参数代表函数名称。

下面看看隐藏的效果:

image-20231213163114631

image-20231213163207223

现在看不到我们的MessageBoxW了。

当然,这里还是会出现我们的GetProcAddress等等函数,我们也可以尝试使用自实现getprocaddress或者peb的方式来实现。

我们在自己编写shellcode时也会用到上面两种情况。

0x02 字符串

一般情况下,C/C++程序中的字符串常量会被硬编码到程序中(.data段,也就是数据段),尤其是全局变量最容易被定位到。

比如我们上例的hello world,利用strings查看我们程序里面一些字符串,命令如下

strings Hide_IAT_String.exe

image-20231213164453201

当然仅仅是Hello World是没问题的,如果是我们上述隐藏IAT时的api名字,或者一些工具的参数信息,被杀软检测到就极有可能被杀。

image-20231213171009547

所以我们可以自实现一些简单的加解密函数来隐藏字符串,下面是一个小demo

#include <stdio.h>
#include <Windows.h>

void reverseString(char* str) {
    int length = strlen(str);
    char temp;
    for (int i = 0; i < length / 2; i++) {
        temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}

int main() {
    char str[] = "dlrow olleh";
    reverseString(str);
    printf("%s",str);
}

image-20231213180937798

可以看到没有找到hello相关的字符串了。

0x03参考链接

静态恶意代码逃逸(第七课) | 倾旋的博客 (payloads.online)

通过隐藏导入表的方式规避杀软 - 先知社区 (aliyun.com)

静态恶意代码逃逸(第八课) | 倾旋的博客 (payloads.online)

标签:int,hello,str,字符串,IAT,include,隐藏
From: https://www.cnblogs.com/fdxsec/p/17899658.html

相关文章

  • 人工智能 | 什么是字符串?
    什么是字符串?字符串是在任何编程语言中都非常重要的一种数据类型。在Python中,字符串是由引号包裹的任意字符组成的不可变序列,用于表示文本类型数据。字符串定义字符串可以通过使用单引号或双引号或三引号来定义,用于表示文本信息,如姓名、消息等。#使用单引号定义字符串:name='A......
  • 通过正则表达式获取字符串中的省市区
    通过正则表达式获取字符串中的省市区//[^省]+省|.+自治区|[^澳门]+澳门|北京|重庆|上海|天津|台湾|[^香港]+香港|[^市]+市)越前面的优先级越高,会取优先级高的第一个匹配到的进行截取//^自治州]+自治州|[^特别行政区]+特别行政区|[^市]+市|.*?地区|.*?行政单位|.+盟|市辖区|[^县]+......
  • String字符串
    String字符串String类是定义在java.lang下面的,是定义好的一个类,使用的时候不需要导包。字符串不可变,他们的值在创建后不能被更改。比较:==号:如果是基本数据类型,则比较的是数据值,如果是引用数据类型,比较的是地址值equals:完全一样的结果才是true,否则是falseequalsIgnor......
  • [Vue]el-radio想要传入全部类型时,label绑定空字符串
    记录一下,原本以为不可以这样绑的。这样就可以空查了。 <el-form-itemlabel="类型"prop="type"><el-radiolabel=""v-model='query.type'@change="handleQuery">全部</el-radio><el-radiolabel="1"v-mode......
  • c语言,任意位置插入字符或者字符串
    char*insert(char*s1,char*s2,intn){intlen1=0,len2=0,i,j=0,k=0;charstr3[100];if(s1==NULL){returnNULL;}if(s2==NULL){returns1;}len1=strlen(s1);if(n>strlen(s1))......
  • 故障解析丨导入字符串NULL导致主从报错
    1.背景概述目前需要搭建一个从库,由于单表数据量较大,时间比较有限,考虑到导入导出的时间,并且GreatSQL支持并行loaddata的功能,能够加速数据的导入,因此决定使用selectintooutfile和loaddata的方式进行数据的迁移;在数据导入完成后进行数据同步,从库发生报错1032找不到记录,但......
  • WPF限制字符串的最长显示长度,超出后尾部显示...
    在WPF中,如果你想要限制一个字符串的显示长度,并在超出后用省略号(...)表示,你可以使用TextBlock控件和设置它的TextTrimming属性。这种方法可以自动截断文本并在末尾添加省略号。<TextBlockText="{BindingYourString}"TextTrimming="CharacterEllipsis"Max......
  • 前端: 1.解构表达式;2字符串模板
      解构表达式,定义一个数组 <script> //解构表达式,定义一个数组//数组解构  letarr=[1,2,3];  let[a,b,c] =arr; //快速的将内容赋值到指定的变量上面  //const[a,b,c]=arr;  console.log(a,b,c)    //对象解构   ......
  • C# --UTF8字符串解码
    今天在调用一个接口的时候,中文一直乱码,当时就各种搜,,,{"TaskId":12732823,"HospitalId":4,"TaskNo":"42312120179","PatientName":"李丽琴","PatientLocation":"新院手术室||李丽琴"}只要是中文的我收到都是乱码,......
  • Vim字符串替换的方法
    本文转载自:Vim字符串替换详细指南_笔记大全_设计学院(python100.com)一、vim字符串替换命令:%s/old/new/gvim字符串替换是一个非常实用的功能,下面将从多个方面进行介绍,帮助你更加深刻地理解该功能,提高你的工作效率。首先,我们来看一下vim字符串替换命令。上面这行代码是vi......