
底层逆向学习
文章平均质量分 60
逮虾户肉丝
这个作者很懒,什么都没留下…
展开
-
函数返回值的方式
- [ ] 2022/3/1(此处讨论的不是返回值和返回指针/引用的情况,而是当返回不同数据长度,编译器是如何指定返回方式的不同编译器,处理的情况不同,下面的分析是基于VS2019的msvc编译器:返回值长度小于4字节,通过一个寄存器带出被调函数的栈空间;返回值长度在4到8字节之间,通过两个寄存器带出;返回值长度大于8字节,通过产生临时量带出,因为寄存器已经没有足够的内存存放了;另外,该临时量是在函数被调用前就创建好,把其地址压入栈中,函数被调用时对临时量赋值好,以下开始分析:1)函数返回宽原创 2022-03-01 16:54:16 · 591 阅读 · 0 评论 -
pE文件操作--移动导出表
一、什么是导出表?先回顾一下导出表的结构:相对复杂的是AddressOfFunctions,AddressOfNames和AddressOfNameOrdinals这三个子表;其中地址表存储的是导出的函数地址,名称表存储的是以名字导出的函数的函数名的RVA,序号表存储的是以序号导出的函数的序号(序号+Base才是真正的序号值)二、为什么要移动各种表?这些表是编译器生成的,里面存储了非常重要的信息;在程序启动的时候,系统会根据这些表做初始化的工作,如将用到的DLL中的函数地址存储到IAT表;为了原创 2021-12-28 12:48:34 · 822 阅读 · 0 评论 -
PE文件解析--重定位表
一、系统加载程序的过程双击打开一个exe时,系统会为该exe创建一个进程,分配独立的虚拟4G空间。低2G为用户空间,前后64k不会被分配,0-FFFF用于做各种检查,空指针一般就指向这里;后64K用于与内核交互,高2G空间是内核使用的一般情况下,exe都是可以按照ImageBase的地址进行加载的,因为exe是第一个贴进虚拟4G空间的,但DLL文件不是;DLL文件是有exe使用它的时候才会加载到相应的exe进程空间;当然DLL也可以被另一个DLL调用;当DLL文件加载到进程空间的时候,可能会出现原创 2021-12-22 14:25:09 · 624 阅读 · 0 评论 -
PE文件解析--导出表
1、定位导出表可选pe头中的最后一个字段:数据目录项typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 如何找到这个结构前面的文章已经说过。而且这个 Size 字段不一定是真实的。上面 Vi原创 2021-12-22 10:17:37 · 1689 阅读 · 0 评论 -
PE文件扩大节的代码实现
一、扩大节(一般只适合扩大最后一个节)//1、拉伸到内存//2、重新分配一块新的内存:SizeOfImage + Ex//3、将最后一个节的SizeOfRawData和VirtualSize改成N,// N=SizeOfRawData=VirtualSize=(SizeOfRawData或者VirtualSize 内存对齐后的值) + Ex//4、修改sizeofimage大小,sizeofimage = sizeofimage + Ex二、代码实现PVOID EnlargeLast原创 2021-12-11 15:55:07 · 804 阅读 · 0 评论 -
PE文件合并节的代码实现
当DOS stub的空间也不够80个字节的时候,需要把原有的几个节表合并成一个节表,这样就可以腾出两个节表的空间,进而可以增加新的节。疑惑:原有文件的几个节之间的联系会受合并节带来的影响吗?当代码节调用数据节的时候,如何指定位置?合并节后,唯一节表的属性是原有节的属性或运算出来的结果,会带来安全问题吗?为什么合并节要先拉伸出来才能合并,因为拉伸后才是文件在内存中的状态?但拉伸这个动作本来就是按照fileBuffer中的pe头部属性virtualsize和sizeofrawdata,virtualaddre原创 2021-12-11 15:31:55 · 415 阅读 · 0 评论 -
switch的汇编分析
1:当if语句的判断条件是(表达式==常量)的形式,switch语句相当于if语句的简写,且效率更快(比较的次数减少)如果不加break,那么在找到对应常量的语句执行后,会把后面其他的常量下的语句全部执行直到default的break处;2、switch反汇编代码的变化//案例1---添加case后面的值,一个一个的增加,观察反汇编代码的变化...原创 2021-10-21 10:01:04 · 1860 阅读 · 0 评论 -
结构体(补充)
一、sizeof的使用void test1() { char a = 23; short b = 20; int c = 40; char arr[10] = { 0 }; short arr2[10] = { 0 }; int arr3[10] = { 4 }; printf("sizeof(a)=%d\nsizeof(b)%d\nsizeof(c)%d\nsizeof(arr)%d\nsizeof(arr2)=%d\nsizeof(a)=%d\n", sizeof(a), sizeof(原创 2021-10-19 22:31:21 · 130 阅读 · 0 评论 -
结构体的反汇编分析
一、为什么用结构体?char、short、int、float、数组等都是宽度不同的容器,用来存储程序执行所需要和所产生的数据,其中数组是存储相同宽度数据的容器,那么当需要存储不同宽度的不同类型的数据时,结构体是一个非常适合的选择二、结构体的定义和使用结构体的定义 结构体内部变量在定义时,除了自身以外可以使用任何类型(不能递归定义)结构体的使用void function() {/*提升堆栈:默认大小0xC0:分配的栈空间大小----0x100-0xC0=0x40001D44E0 pu原创 2021-10-19 20:08:27 · 468 阅读 · 0 评论 -
参数、局部变量、返回值和数组的反汇编分析
返回值是如何传递的?char类型:函数计算结果放入al,然后再通过al把返回值赋给main的变量short类型:函数计算结果用eax存储,返回时取ax的值赋给main的变量(为什么char类型的返回值是存储在al来返回,而short类型的返回值是存储在eax,不应该是ax吗?虽然最后还是用的ax来赋值)int类型:函数计算结果存入eax,返回时也是把eax的值赋给main的变量参数传递的本质总结:参数传递相当于将上层函数的变量或表达式的值复制一份,传递给下函数(思考:传地址也是这样吗?原创 2021-10-16 23:30:46 · 538 阅读 · 0 评论 -
循环语句的反汇编分析
for语句的句法实例分析1汇编代码的一般顺序:表达式1----->表达式3-----》表达式2,如下图也可以如下汇编代码所示,按正常的顺序逻辑:1—2----31 mov eax,[ebp+8]//赋初值2 mov [ebp-4],eax 3 mov edx,[ebp-4]//条件判断4 cmp edx,[ebp-Ch]5 jge 16 6 mov eax,[ebp-4]//循环体7 push eax8 push offset string "%d\n"9 call原创 2021-10-16 09:40:58 · 631 阅读 · 0 评论 -
从汇编角度理解正向编程
一、变量的声明全局变量声明int a,b,c;//在函数外声明的变量都是全局变量void fun1(){ a=10; b=20; c=a;}void fun2(){ int a=10,b=20; // mov [a (02BC46Ch)],0Ah; mov [b(02BC470h)],14h; mov [c (02BC474h) ],1Eh; int c = a;}局部变量声明void fun3(){ int a,b; a=10,b=20;//mov [ebp-8],0x原创 2021-10-15 16:46:37 · 212 阅读 · 0 评论 -
if语句逆向分析(中)
if…else if…else if…else多分支语句的反汇编判断//参考准则如下 //1、当每个跳转指令要跳转的地址前面都有JMP指令 //2、上面的跳转指令的地址都是一样的 //3、如果某个分支没有条件判断,则为else部分IF_begin: 影响标志位的指令; jxx [else if 的地址];IF_end jmp end;else if_begin: 影响标志位的指令; jxx [else is 的地址]else begin:......else e原创 2021-10-15 11:19:25 · 234 阅读 · 0 评论 -
IF语句逆向分析(上)
一、全局变量二、函数参数的分析三、if语句逆向分析四、if—else----语句逆向分析五、if—else if-----else—逆向分析原创 2021-10-13 17:19:08 · 391 阅读 · 0 评论