C语言2-数组、条件语句、参数传递、结构体、dll编写
这些除了dll编写宝宝之前都学过捏,先看看把。看看他是怎么从面杀角度讲解的。
数组
值得注意的是,cs里面的shellcode也是存在数组里面的。
这里讲数组的定义啊,基础类的我就不记笔记了。之前的《c语言碎碎念》博客都有些。
下面是一个数组,在内存中的形式,值得注意的是,数组最后会跟一个00,也就是如下图所示,数组中02是最后一个元素,然后跟了个0。用0结尾。
条件语句
这个也不多说好吧,如果他讲了免杀相关的我就写,没得话有需要可以看看我不久之前的博客。
if
1.底层反汇编与正向代码逻辑相反。比如说一个是i>j,那底层的汇编就是jle,小于等于则跳转,大于则不跳转,
elseif和if的区别
就是看jle跳转之后,跳转之后的地址的上一行是否有jmp语句,如果有,则是ifelse语句。
如果要看有几个elseif,那么就直接看有几个jmp就行。
if…else if..else
while
这个的底层代码是是je,如果相等则跳转。他的底层逻辑和代码的逻辑也是相反的。
do-while
至少会执行循环体一次
参数传递
参数传递的本质:将上层函数的变量,或者表达式的值复制一份,传递给下层函数。
char function(){
return 10;
}
int main(){
char i = function();
}
char function(int x){
x = x +1;
}
int main(){
int x = 2;
function(x);
//看过我之前的博客就知道,这个x还是2.
//在vc中看堆栈,可以看到两个根本不是一个地址
//以后免杀还要专门弄个虚拟机
}
结构体
结构体有个好处就是可以反复利用。
q1
为什么这两个结构体都是同样的内部变量,但是第一个大小是8第二个大小是12呢?
结构体对齐,n为字节对齐,默认为8,可填1、2、4、8,如果n的值比sizeof()得出值小,则已n的值对齐,否则以sizeof()的值对齐,结构体的总大小必须是其最大内部成员的整数倍
那怎么改对齐呢,需要使用以下关键字#pragma pack(n)
,其中的n就是以n字节对齐,将这个关键字加在定义结构体的struct关键字前面(然后所有的结构体都已这个n对齐)
dll编写
多线程调试dll方式编译和默认编译的区别
怎么改这个呢,ctest属性页-c/c++-代码生成-运行库
1.默认的小,多线程的大
2.默认的编译,不会将当前程序的dll打包进去,而多线程dll也不会把你的dll打包进去。
所以使用上图中多线程这种方式,将所有的dll打宝进去,就不会出现各种错误了。
所以基本上都用多线程就行。
基础
而dll里面那些api,都是3环东东西,然后一层一层调用,进入到0环也就是内核去实现功能
0环:内核层 .sys
3环:用户层 .exe
编写
1.一开始的程序是不会调用所有dll的,如果需要调用的话,需要用LoadLibrary这个函数来调用
加载的地一种方式
上面这个东西,也就是dll被加载的时候就会弹窗
加载的第二种方式
用rundll32来调用,
但是呢,这个东西被杀软查的非常严格,除非你写的dll是面纱的,要不然不行。
procexp.exe
这个东西可以看所有进程加载的dll,而且也是微软官方的
remotedll
这个是个可以注入dll的东西,32位的就只能用32位的dll。
杂项
汇编指令扩展:
shl 右移指令
当一个dll被加载的时候,是不能对这个dll进行读写的
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。