0%

C语言2-数组、条件语句、参数传递、结构体、dll编写

C语言2-数组、条件语句、参数传递、结构体、dll编写

这些除了dll编写宝宝之前都学过捏,先看看把。看看他是怎么从面杀角度讲解的。

数组

值得注意的是,cs里面的shellcode也是存在数组里面的。

这里讲数组的定义啊,基础类的我就不记笔记了。之前的《c语言碎碎念》博客都有些。

下面是一个数组,在内存中的形式,值得注意的是,数组最后会跟一个00,也就是如下图所示,数组中02是最后一个元素,然后跟了个0。用0结尾。

image-20240103000532874

条件语句

这个也不多说好吧,如果他讲了免杀相关的我就写,没得话有需要可以看看我不久之前的博客。

if

1.底层反汇编与正向代码逻辑相反。比如说一个是i>j,那底层的汇编就是jle,小于等于则跳转,大于则不跳转,

elseif和if的区别

就是看jle跳转之后,跳转之后的地址的上一行是否有jmp语句,如果有,则是ifelse语句。

如果要看有几个elseif,那么就直接看有几个jmp就行。
if…else if..else

while

这个的底层代码是是je,如果相等则跳转。他的底层逻辑和代码的逻辑也是相反的。

do-while

至少会执行循环体一次

参数传递

参数传递的本质:将上层函数的变量,或者表达式的值复制一份,传递给下层函数。

1
2
3
4
5
6
7
char function(){
return 10;
}

int main(){
char i = function();
}
1
2
3
4
5
6
7
8
9
10
11
char function(int x){
x = x +1;
}

int main(){
int x = 2;
function(x);
//看过我之前的博客就知道,这个x还是2.
//在vc中看堆栈,可以看到两个根本不是一个地址
//以后免杀还要专门弄个虚拟机
}

结构体

结构体有个好处就是可以反复利用。

q1

image-20240107221844568

为什么这两个结构体都是同样的内部变量,但是第一个大小是8第二个大小是12呢?
结构体对齐,n为字节对齐,默认为8,可填1、2、4、8,如果n的值比sizeof()得出值小,则已n的值对齐,否则以sizeof()的值对齐,结构体的总大小必须是其最大内部成员的整数倍
那怎么改对齐呢,需要使用以下关键字#pragma pack(n),其中的n就是以n字节对齐,将这个关键字加在定义结构体的struct关键字前面(然后所有的结构体都已这个n对齐)

image-20240107223101109

dll编写

多线程调试dll方式编译和默认编译的区别

怎么改这个呢,ctest属性页-c/c++-代码生成-运行库

1.默认的小,多线程的大
2.默认的编译,不会将当前程序的dll打包进去,而多线程dll也不会把你的dll打包进去。
image-20240107225929798
所以使用上图中多线程这种方式,将所有的dll打宝进去,就不会出现各种错误了。

所以基本上都用多线程就行。

基础

image-20240107230403739

而dll里面那些api,都是3环东东西,然后一层一层调用,进入到0环也就是内核去实现功能

1
2
0环:内核层  .sys
3环:用户层 .exe

编写

image-20240107232804445

1.一开始的程序是不会调用所有dll的,如果需要调用的话,需要用LoadLibrary这个函数来调用

加载的地一种方式

image-20240107234543458

image-20240107234205370

image-20240107234215510

上面这个东西,也就是dll被加载的时候就会弹窗

加载的第二种方式

用rundll32来调用,

image-20240107234342834

但是呢,这个东西被杀软查的非常严格,除非你写的dll是面纱的,要不然不行。

procexp.exe

这个东西可以看所有进程加载的dll,而且也是微软官方的

remotedll

这个是个可以注入dll的东西,32位的就只能用32位的dll。

杂项

汇编指令扩展:
shl 右移指令

当一个dll被加载的时候,是不能对这个dll进行读写的