逆向分析练习七(反转链表)

题目描述

反转链表,这次的题目选择了64位编译方便我们熟悉64位下的寄存器和,依旧是debug版的代码,这次的代码中存在大量的指针使用,方便我们熟悉指针在内存级别的操作流程

debugX64版汇编代码

00007FF6EF7417E0  mov         qword ptr [rsp+8],rcx
00007FF6EF7417E5  push        rbp
00007FF6EF7417E6  push        rdi
00007FF6EF7417E7  sub         rsp,128h
00007FF6EF7417EE  lea         rbp,[rsp+20h]
00007FF6EF7417F3  lea         rcx,[__1CD46B39_ConsoleApplication1@cpp (07FF6EF751029h)]
00007FF6EF7417FA  call        __CheckForDebuggerJustMyCode (07FF6EF74134Dh)  //64位的检测
00007FF6EF7417FF  mov         qword ptr [pre],0  //pre = 0
00007FF6EF741807  cmp         qword ptr [head],0  //while(head != 0)
00007FF6EF74180F  je          reverseList+67h (07FF6EF741847h)
00007FF6EF741811  mov         rax,qword ptr [head]  //rax = head
00007FF6EF741818  mov         rax,qword ptr [rax+8]  //rax = head->field2
00007FF6EF74181C  mov         qword ptr [temp],rax  //temp = rax
00007FF6EF741820  mov         rax,qword ptr [head]  //rax = head
00007FF6EF741827  mov         rcx,qword ptr [pre]  //rcx = pre
00007FF6EF74182B  mov         qword ptr [rax+8],rcx  //head->field2 = rcx
00007FF6EF74182F  mov         rax,qword ptr [head]  //rax = head
00007FF6EF741836  mov         qword ptr [pre],rax  //pre = rax
00007FF6EF74183A  mov         rax,qword ptr [temp]  //rax = temp
00007FF6EF74183E  mov         qword ptr [head],rax  //head = rax
00007FF6EF741845  jmp         reverseList+27h (07FF6EF741807h)
00007FF6EF741847  mov         rax,qword ptr [pre]  //循环出口,rax = pre
00007FF6EF74184B  lea         rsp,[rbp+108h]
00007FF6EF741852  pop         rdi
00007FF6EF741853  pop         rbp
00007FF6EF741854  ret

分析

64位下的单个字变成了QWORD也就是64位,所有的通用寄存器也都做了扩容变成了rax,rdx这种

struct tmp{QWORD val;QWORD tmpaddr;
}
struct tmp* func(struct tmp* head){pre = 0;
while(head != 0){temp = head->field2;head->fiedl2 = pre;pre = head;head = temp;
}return pre;
}

源代码

// Definition for singly - linked list.
struct ListNode {int val;struct ListNode* next;};
// 双指针法:
struct ListNode* reverseList(struct ListNode* head) {//保存cur的下一个结点struct ListNode* temp;//pre指针指向前一个当前结点的前一个结点struct ListNode* pre = NULL;//用head代替cur,也可以再定义一个cur结点指向head。while (head) {//保存下一个结点的位置temp = head->next;//翻转操作head->next = pre;//更新结点pre = head;head = temp;}return pre;
}

逆向分析练习七(反转链表)相关推荐

  1. PAT 1025 反转链表 (25)(STL-map+思路+测试点分析)

    1025 反转链表 (25)(25 分) 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4, ...

  2. LeetCode 206. 反转链表 思考分析

    题目 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可 ...

  3. [网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了外部威胁防护和勒索病毒对抗.这篇文章将讲解逆向分析OllyDbg动态调试 ...

  4. CRC原理及其逆向分析方法

    CRC原理及其逆向破解方法: 介绍: 这篇短文包含CRC原理介绍和其逆向分析方法,很多程序员和破解者不是很清楚了解 CRC的工作原理,而且几乎没人知道如何逆向分析它的方法,事实上它是非常有用的. 首先 ...

  5. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  6. 卷进大厂系列之LeetCode刷题笔记:反转链表(简单)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3 ...

  7. PAT甲级1074 Reversing Linked List :[C++题解]反转链表,借用vector

    文章目录 题目分析 题目链接 题目分析 分析:数组模拟链表,这题反转操作在数组中进行,然后直接输出即可,甚至不用放回到链表. //遍历链表,该链表用数组模拟 //保存链表结点地址到数组中 for(in ...

  8. 逆向分析使用COM组件对象模型的代码

    <恶意代码分析实战>第七章实验7-2的程序使用了COM进行联网通信.首先把书上第七章关于COM介绍的原文贴出来: 总结一下,就是说恶意程序有时会通过另一个服务程序提供的接口函数实现一些操作 ...

  9. (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程

    一.回顾 上一篇博客,我带着以下的问题逆向分析了 KiSwapContext 和 SwapContext 这两个函数: SwapContext 有几个参数,分别是什么? SwapContext 在哪里 ...

最新文章

  1. Swift3.0语言教程使用路径字符串
  2. 汽车销售系统javaweb代码_有什么代驾系统能远离销售套路_搜狐汽车
  3. object-c 1
  4. ITK:将矢量图像投射为另一种类型
  5. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)
  6. oracle xml文件是什么文件,介绍关于Oracle下存取XML格式数据的方式
  7. 生成多个 SSH-Key 、生成多个公钥和私钥
  8. 用gSOAP开发Web Service程序
  9. table中加表单元素怎么验证_使用element-ui +Vue 解决 table 里包含表单验证的问题...
  10. hortonworks/registry配置详解
  11. BZOJ 3359: [Usaco2004 Jan]矩形( dp )
  12. python下载百度文库文档_Python百度文库爬虫之txt文件
  13. 变种WannaCry
  14. php代码实现微信代扣,html5+如何通过native.js实现APP微信支付代扣签约?
  15. 简单的数据库造数据方法
  16. oracle 判断条件不在某一时间范围内(not between)
  17. 2分钟定制自己的专属桌面——win10仿Mac os风格美化!
  18. 倍福plc的型号_EL9186——plc倍福模块+EL9100型号EL9010
  19. “中国第一程序员” 求伯君的传奇经历
  20. mybatis内用大于号小于号

热门文章

  1. 门锁被智能化之后,水龙头也被AI锁定,用深度学习提醒节约用水了解一下
  2. BCompare 应用程序发生错误 解决办法
  3. 钱扣了,订单却是未支付,用户炸了——聊聊如何防止支付掉单
  4. AAFD故障电弧探测器的重要性
  5. 动漫绘画教程:动漫人物的眼睛睫毛怎么画?
  6. “当迷茫时就回到原点,或者退一步再思考” | 技术人金句系列
  7. STM32CubeMX和华为LiteOS Studio开发STM32
  8. 蓦然回首终结者SmartSoftHelp开发辅助工具MiniLite2.0,软件性能提升,数据库性能提升,web应用高并发设置...
  9. Java毕业设计_网上银行存取与贷款系统
  10. 技校学计算机工资,本人想去技校学习计算机,请问计算机好学吗,这个行业怎么样,学成之后工资如何...