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

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

题目描述

反转链表,这次的题目选择了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;
}

你可能感兴趣的:(逆向分析,链表,数据结构,逆向,c语言,c++)