当前位置:首页 » 编程软件 » 栈的反编译

栈的反编译

发布时间: 2022-07-17 14:32:16

‘壹’ 栈的逆转

s->base=(int *)malloc(num*sizeof(int));
应该就出在这句上了
你的S是一个指针, 没有申请内存就访问你成员,这个是有问题的

先给s分配内存

‘贰’ 栈的操作原则是什么

堆栈使用两种基本操作:推入(压栈,push)和弹出(弹栈,pop):

1、推入:将资料放入堆栈顶端,堆栈顶端移到新放入的资料。

2、弹出:将堆栈顶端资料移除,堆栈顶端移到移除后的下一笔资料。

特点

堆栈的基本特点:

1、先入后出,后入先出。

2、除头尾节点之外,每个元素有一个前驱,一个后继。

软件堆栈

堆栈可以用数组和链表两种方式实现,一般为一个堆栈预先分配一个大小固定且较合适的空间并非难事,所以较流行的做法是Stack结构下含一个数组。如果空间实在紧张,也可用链表实现,且去掉表头。

这里的例程是以C语言实现的。

(2)栈的反编译扩展阅读:

基本算法

一、进栈(PUSH)算法

1、若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作2);

2、置TOP=TOP+1(栈指针加1,指向进栈地址);

3、S(TOP)=X,结束(X为新进栈的元素);

二、退栈(POP)算法

1、若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作2);

2、X=S(TOP),(退栈后的元素赋给X):

3、TOP=TOP-1,结束(栈指针减1,指向栈顶)。

‘叁’ 用C写栈的源代码

#include <stdio.h>
#include <malloc.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR -1
#define OK 1
#define TRUE 1
#define FALSE 0

typedef int status;
typedef int ElemType;

typedef struct{
ElemType data;
ElemType *base;
ElemType *top;
int stacksize;
}Stack,*SqStack;

status InitStack(Stack &S){
//构造一个空栈
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

status GetTop(Stack &S,ElemType &e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base) return ERROR;
e= * (S.top-1);
return OK;
}//GetTop

status Push(Stack &S,ElemType e){
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){
S.base=(ElemType *)realloc(S.base,
(S.stacksize+STACKINCREMENT) * sizeof(ElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

status Pop(Stack &S,ElemType &e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base) return ERROR;
e= * --S.top;
return OK;
}//Pop

‘肆’ 反编译DLL工具

关键看是什么语言编写的。
我所知道的有:
如果是C#
Reflector
PB,
则有PBkiller
如果是c、c++、delphi,
则只能反编译成c,并且和原先的基本上不一样

‘伍’ 反编译exe文件就是把exe还原为汇编

首先了解一下概念,exe程序只是WIN下PE格式的可执行文件的一种,而所谓的计算机执行的代码只是一串二进制数,跟数据没区别,当CS,EIP指向哪,哪里就是程序,而汇编语言之所以叫最底层的语言,是因为, 汇编的每一个语法,都应对了一串二进制的指令,这也就是反汇编的原理,所以NO1.一、反编译exe程序 就是 把 exe 还原为汇编语言吗?,这句话,不能叫还原,应该叫解释,“解释”的东西,没还原的那么逼真,比如,在汇编源程序中所有的标号和注释,进行编译后,变成二进制可执行文件后,在反汇编,标号就变成数字了,而注释更是没了..... 二、除了 还原为 汇编语言,还能 反编译为 其他高级语言吗?不能,高级语言的语法是建立在大量的计算机二进制代码之上的,比如你C语言随便调用一个子函数,到了二进制中,他是先压栈,参数(编译后参数从右往左压,每个语言还不一样),然后就是call 子函数,子函数运行后,他还要清理堆栈,所以你一个句简单的高级语言,其实蕴含了大量的代码,而高级语言编译后的程序,就脱离了他的开发环境,楼上说的会引起你误会,java的中间码,可以用他自带的反编译工具,因为Java不是编译器,而是解释器,所以他不编译,只是解释他的中间码NO2.所有的exe都可以反汇编,但是你要注意,不只exe这种pe格式,linux下可执行文件是elf,所以你在反汇编的时候,要注意可执行文件的文件的头,而早期的DOS只是纯二进制代码,没有头文件,这个很重要,你要反汇编什么格式,就要选择相应的工具NO3.exe反汇编,当然是OD,不过,我对OD不熟悉,好像他只支持WIN下的反汇编

‘陆’ 一个关于栈的输入输出问题

A: 先入1 2,然后出2,然后人3,出3,最后出1
B: 1 2 3依次入栈,然后依次出栈
C: 此答案3先出栈,说明此时 1 2 3都已经先入栈且都未出栈,1肯定在2后出栈。
D: 1入 1出;2入 2出;3入 3出

‘柒’ java反编译中iload是什么意思

iload 是jvm指令,将指定的int型本地变量推送至栈顶;
你应该看的是字节码吧;
java反编译工具jd gui,应该是看不到jvm指令的;
关于jvm指令,你网上搜一下可以了解了;
asm.jar java字节码生成开源框架有兴趣可以学习一下,这个可以了解jvm指令。

‘捌’ C语言中的栈实现进制转换

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define MAXSIZE 100

typedef int DataType;
typedef struct{
DataType data[MAXSIZE];
int top;
}SeqStack,*PSeqStack;

PSeqStack Init_SeqStack(void)
{
PSeqStack S;
S=(PSeqStack)malloc(sizeof(SeqStack));
if(S)
S->top=-1;
return S;
}

int Push_SeqStack(PSeqStack S,DataType x)
{
if (S->top==MAXSIZE-1)
return 0;
else
{
S->top++;
S->data[S->top]=x;
return 1;
}
}

int Empty_SeqStack(PSeqStack S)
{
if(S->top==-1)
return 1;
else
return 0;
}

int Pop_SeqStack(PSeqStack S,DataType *x)
{
if(Empty_SeqStack(S))
return 0;
else
{
*x=S->data[S->top];
S->top--;
return -1;
}
}

void Destory_SeqStack(PSeqStack *S)
{
if(*S)
free(*S);
*S=NULL;
return;
}

typedef int DataType;
int conversation(int n,int r)
{
PSeqStack S;
DataType x;
if(!r)
{
printf("基数不能为0");
return(0);
}
S=Init_SeqStack();
if(!S)
{
printf("栈初始化失败");
return(0);
}
while(n)
{
Push_SeqStack(S,n%r);
n=n/r;
}
while (!Empty_SeqStack(S))
{
Pop_SeqStack(S,&x);
printf("%d",x);
}
Destory_SeqStack(&S);
return 0;
}

void main()
{
int i,a;
printf("输入要转换的进制!!\n");
scanf("%d",&a);
printf("输入要转换的数!!\n");
scanf("%d",&i);
conversation(i,a);
}

热点内容
跳转页源码 发布:2024-09-17 03:13:05 浏览:543
html文件上传表单 发布:2024-09-17 03:08:02 浏览:784
聊天软件编程 发布:2024-09-17 03:00:07 浏览:726
linuxoracle安装路径 发布:2024-09-17 01:57:29 浏览:688
两个安卓手机照片怎么同步 发布:2024-09-17 01:51:53 浏览:207
cf编译后没有黑框跳出来 发布:2024-09-17 01:46:54 浏览:249
安卓怎么禁用应用读取列表 发布:2024-09-17 01:46:45 浏览:524
win10设密码在哪里 发布:2024-09-17 01:33:32 浏览:662
情逢敌手迅雷下载ftp 发布:2024-09-17 01:32:35 浏览:337
安卓如何让软件按照步骤自动运行 发布:2024-09-17 01:28:27 浏览:197