一次突发奇想的逆向(类 链表 模板 的逆向)

博主搬家时看到《VC++入门到精通》,书中链表一节让其用类实现链表有了收获。还提到IDA中v10的作用及构造、析构函数作用,探讨了无符号表时需靠经验还原类成员和函数,最后介绍了类模板可保证节点类型复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来 我们这边搬家我看到了一个本书 名字叫做vc++ 入门到精通  名字看起来很厉害

然后我大致翻了一下内容   这本书还可以吧  然后有一节讲的是 链表   我以前实现链表是关于结构体 比较多 

然后类还真的没怎么写过 这次写了一下 感觉还是有点收获 然后我们看一下源码

#include "stdafx.h"
#include <stdio.h>
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<time.h>
#include<queue>
#include "windows.h"
using namespace std;
class CNode
{

public:
	CNode();
	~CNode();
	CNode *m_pnext;
	int m_data;

private:

};

CNode::CNode()
{
	m_pnext = NULL;
}

CNode::~CNode()
{

}
class Clist
{
public:
	Clist();
	~Clist();
	CNode* Move();
	void addnode(CNode* pNode);
	void passlist();
	CNode* m_pHeader;
	int nodesum;
private:

};

Clist::Clist()
{
	nodesum = 0;
	m_pHeader = NULL;
}

Clist::~Clist()
{
	if (nodesum > 0)
	{
		CNode *delenode = m_pHeader;
		CNode *deletemp = NULL;
		for (int i = 0; i < nodesum; i++)
		{
			deletemp = delenode->m_pnext;
			delete delenode;
			delenode = deletemp;
		}
		nodesum = 0;
		delenode = NULL;
		deletemp = NULL;
	}
	m_pHeader = NULL;
}
CNode* Clist::Move()
{
	CNode* m_pmove =m_pHeader;
	for (int i = 1; i < nodesum; i++)
	{
		m_pmove = m_pmove->m_pnext;
	}
	return m_pmove;
}
void Clist::addnode(CNode* addNote)
{
	if (nodesum == 0)
	{
		m_pHeader = addNote;
	}
	else
	{
		CNode* ptemp = Move();
		ptemp->m_pnext = addNote;
	}
	nodesum++;
}
void Clist::passlist()
{
	if (nodesum > 0)
	{
		CNode* ptemp = m_pHeader;
		printf("%5d", ptemp->m_data);
		for (int i = 1; i < nodesum; i++)
		{
			ptemp = ptemp->m_pnext;
			printf("%5d", ptemp->m_data);
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	Clist list;
	for (int i = 0; i < 5; i++)
	{
		CNode *pNode = new CNode();
		pNode->m_data = i;
		list.addnode(pNode);
	}
	list.passlist();
		printf("\n");
		getchar();
	return 0;
}

然后这里是ida 

一直不明白  这里的v10起到了什么的作用 不过从这里可以看出  构造函数还有析构函数的 作用

但是这里的ida 是由符号表的 假如没有了 符号表

哈哈 那么如果没有了符号表 是不是看起来一脸懵鸭

那么就需要我们自己的经验来尽量还原了。。。

比如 还原类成员还有还原 函数   。。。

那么我们看一下类模板吧

#include "stdafx.h"
#include <stdio.h>
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<time.h>
#include<queue>
#include "windows.h"
using namespace std;
class cnet
{
public:
	cnet* m_pnext;
	char m_data;
	cnet()
	{
		m_pnext = NULL;

	}

};
class CNode
{
public:
	CNode();
	~CNode();
	CNode *m_pnext;
	int m_data;

private:

};

CNode::CNode()
{
	m_pnext = NULL;
}

CNode::~CNode()
{

}

template<class Type>
class Clist
{
public:
	Type* m_pHeader;
	int nodesum;
	Clist()
	{
		nodesum = 0;
		m_pHeader = NULL;
	}
	~Clist()
	{
		if (nodesum > 0)
		{
			Type *delenode = m_pHeader;
			Type *deletemp = NULL;
			for (int i = 0; i < nodesum; i++)
			{
				deletemp = delenode->m_pnext;
				delete delenode;
				delenode = deletemp;
			}
			nodesum = 0;
			delenode = NULL;
			deletemp = NULL;
		}
		m_pHeader = NULL;
	}
	Type* Move()
	{
		Type* m_pmove = m_pHeader;
		for (int i = 1; i < nodesum; i++)
		{
			m_pmove = m_pmove->m_pnext;
		}
		return m_pmove;
	}
	void addnode(Type* addNote)
	{
		if (nodesum == 0)
		{
			m_pHeader = addNote;
		}
		else
		{
			Type* ptemp = Move();
			ptemp->m_pnext = addNote;
		}
		nodesum++;
	}
	void passlist()
	{
		if (nodesum > 0)
		{
			Type* ptemp = m_pHeader;
			cout << ptemp->m_data;
			for (int i = 1; i < nodesum; i++)
			{
				ptemp = ptemp->m_pnext;
				cout << ptemp->m_data;
			}
			cout << endl;
		}
	}
private:

};

int _tmain(int argc, _TCHAR* argv[])
{
	Clist<CNode> list;
	for (int i = 0; i < 5; i++)
	{
		CNode *pNode = new CNode();
		pNode->m_data = i;
		list.addnode(pNode);
	}
	list.passlist();
	Clist<cnet> lists;
	for (int i = 0; i < 5; i++)
	{
		cnet *pNode = new cnet();
		pNode->m_data ='a'+i;
		lists.addnode(pNode);
	}
	lists.passlist();
		printf("\n");
		getchar();
	return 0;
}

其实这里的优势就是可以适应任何的 类型的节点  保证的复用性 

然后我们看一下ida 里面的东西

 

这里还是 一如既往的。。。。。。emmm 

反正还是当 编程文章看吧  23333

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值