请问一下E2C如何使用
本帖最后由 zhangjinxuan 于 2022-11-13 20:40 编辑rt,现在有了dosbox,e2c,要反编译的exe文件,下一步该怎么做呢?
比如,要反编译的exe文件为 a.exe,我在dosbox中执行 e2c a.exe 给我提示Can't open file "a.exe.GLB",还把我 a.exe 给删了,e2c到底怎么用啊
EXE文件反编译成C源代码的工具软件简介
EXEC-2-C是一个反汇编到 C 的软件,包含以下文件
- E2A.EXE - 反汇编
- A2APARSE.EXE - 汇编预处理
- E2C.EXE - 转换 A2A.EXE 的结果到 pseudo-C
- ENVMNU.EXE - 前几个文件的集成环境
https://xiazai.zol.com.cn/detail/50/494618.shtml 人造人 发表于 2022-11-13 11:28
https://xiazai.zol.com.cn/detail/50/494618.shtml
不是,具体命令怎么用 本帖最后由 jackz007 于 2022-11-13 13:53 编辑
zhangjinxuan 发表于 2022-11-13 11:36
不是,具体命令怎么用
运行 "envmnu.exe" 进入集成环境
input file name :t.exe <--- 在这里输入 exe 文件名
Assembler file name :t.ASM <--- 这个文件名会自动产生
Pseudo-Cfile name :t.R <--- 这个文件名会自动产生
输入 "t.exe",按 1 次回车,再按下 F10 生成反编译文件,然后,退出 IDE,目录内新添加的文件 "t.R" 就是你所要的伪 C 源代码文件。
这个文件内容看上去是这个样子:
*
***************************************************************************
* *
* This file was prepared by EXEC-2-C code restoration utility Ver 0.1*
* Copywrite (c) The Austin Code Works & Polyglot International *
* Jerusalem, 1991 *
* *
***************************************************************************
*/
#include "EXEC-2-C.H"
char var1_0 [ 129 ] = "19751976197719781979198019811982198319841985198619"
"8719881989199019911992199319941995\x10\0\0\x16\0~\x01\0L\0V\t\0@\0\x80"
">\0\xa6\0\x91\xc3\0\xc7\x01\x81$\x02\x8a\x03|G\x05\xeb\t\xcaB\x0c\x18\x128\x1f\x1cX*";
Byte var1_9c [ 47 ] = {
40,68,57,0,40,240,70,0,104,151,
90,0,3,0,7,0,9,0,13,0,
28,0,38,0,130,0,220,0,220,1,
10,3,233,3,162,5,210,8,233,10,
197,15,3,22,34,32,22
};
char var1_cb [ 1045 ] = "-^8\x99;\x88E";
char var2_0 [ 5 ] = "year ";
char var2_5 [ 5 ] = "summ ";
char var2_a [ 11 ] = "ne ?? year ";
char var2_15 [ 315 ] = "summ ne ?? year summ ne ?? year summ ne ?? year su"
"mm ne ?? year summ ne ?? year summ ne ?? year summ"
" ne ?? year summ ne ?? year summ ne ?? year summ n"
"e ?? year summ ne ?? year summ ne ?? year summ ne "
"?? year summ ne ?? year summ ne ?? year summ ne ??"
" year summ ne ?? year summ ne ?? year summ ne ?? y"
"ear summ ne ?? ";
char var4_3 [ 10 ] = "PSQRVW\x1e\x06\x07\x1f";
char var4_d [ 10 ] = "_^ZY\xc3";
Byte var4_a4 [ 11 ] = {
80,86,87,30,6,197,118,4,252,180,
2
};
/*======== Code section prepared by EXEC-2-C code restoration utility =======*/
/****************************************************************************/
near proc_1()
/****************************************************************************/
{
push(ax);
ax = 0;
geninterrupt(0x16); /*BIOS Service func ( ah ) = 0 */
/*Read next kbd char */
/*Output: AH-scan code AL-char code */
ax = pop();
}
/****************************************************************************/
near proc_2()
/****************************************************************************/
{
push(ax);
push(bx);
push(cx);
push(dx);
push(ds);
bx = 0;
ax =- 0x4800;/*PCH : RM_Table_init*/
cx = 0x7D0;/*PCH : RM_Table_init*/
label_11:
do
*bx = al;
while(bx = bx + 2, --cx != 0);
bh = 0;
dx = 0;
ah = 2;/*PCH : RM_Table_init*/
geninterrupt(0x10); /*BIOS Service func ( ah ) = 2 */
/*Set cursor pos */
/*Input: BH-page DH-row DL-clmn */
ds = pop();
dx = pop();
cx = pop();
bx = pop();
ax = pop();
}
. . . . . .
/****************************************************************************/
far main()
/****************************************************************************/
{
ax = DATA_SEG_1;
ds = ax;
ax = DATA_SEG_2;
es = ax;
proc_5();
bx = 0;
push(bx);
push(0x15);
proc_2();
do {
push(*( Word *)MK_FP(es , bx + 0xA));
proc_4();
sp = sp + 2;
proc_3();
} while(bx = bx + 0x10, --cx != 0);
proc_1();
proc_3();
cx = pop();
bx = pop();
do {
push(*( Word *)MK_FP(es , bx + 0xD));
proc_4();
sp = sp + 2;
proc_3();
} while(bx = bx + 0x10, --cx != 0);
proc_1();
ax = 0x4C00;/*PCH : RM_Table_init*/
geninterrupt(0x21); /*DOS func ( ah ) = 4Ch */
/*Terminate process */
/*Input: AL-ret code */
}
实际内容还是汇编语言样子,这或许和 t.exe 本来就不是一个 C 语言编译出来的代码有关?
会不会让你失望呢? 你一定会失望的
一个简单的hello world程序,反编译出来的代码2000多行,怎么样?
失望吧?
人造人 发表于 2022-11-13 14:26
你一定会失望的
一个简单的hello world程序,反编译出来的代码2000多行,怎么样?
失望吧?
最让人崩溃的是,里面居然找不到 printf() 的函数调用和 “hello, world!\n” 的字符串,完全看不出这玩意和你的源程序到底有什么关系。 jackz007 发表于 2022-11-13 15:14
最让人崩溃的是,里面居然找不到 printf() 的函数调用和 “hello, world!\n” 的字符串,完全看 ...
{:5_109:} jackz007 发表于 2022-11-13 15:14
最让人崩溃的是,里面居然找不到 printf() 的函数调用和 “hello, world!\n” 的字符串,完全看 ...
"hello, world!\n" 字符串倒是 “有”,只是这个代码无法通过tc编译器的编译
本帖最后由 jackz007 于 2022-11-13 16:31 编辑
人造人 发表于 2022-11-13 16:11
"hello, world!\n" 字符串倒是 “有”,只是这个代码无法通过tc编译器的编译
我们写的代码其实只是这个反编译代码中很小的一部分,TC 编译器除了要连接我们自己代码生成的 obj 以外,还要附加链接编译器提供的其他 obj 文件,这个 obj 文件才是真正的大头。我们所写的 main 函数只不过是这个 obj 需要调用的一个 function 而已。所以,如果要重新编译这个反编译的代码,需要从中识别和提取属于 main() 的代码,把属于启动 obj 的代码剥离掉。 我发现了另外一个工具 ghidra
感觉还可以
undefined8 FUN_001013a0(long **param_1,ulong param_2,void *param_3,void *param_4)
{
undefined8 uVar1;
ulong uVar2;
void **__ptr;
void *pvVar3;
ulong local_28;
long **local_18;
if (param_1 == (long **)0x0) {
uVar1 = 0;
}
else {
uVar2 = FUN_001016ea(param_1);
if (uVar2 < param_2) {
uVar1 = 0;
}
else {
local_28 = param_2;
local_18 = param_1;
if (param_3 == (void *)0x0) {
uVar1 = 0;
}
else {
while (local_28 != 0) {
local_18 = (long **)(*local_18 + 2);
local_28 = local_28 - 1;
}
__ptr = (void **)malloc(0x18);
if (__ptr == (void **)0x0) {
uVar1 = 0;
}
else {
pvVar3 = malloc((size_t)param_4);
*__ptr = pvVar3;
if (*__ptr == (void *)0x0) {
free(__ptr);
uVar1 = 0;
}
else {
memcpy(*__ptr,param_3,(size_t)param_4);
__ptr = param_4;
__ptr = *local_18;
*local_18 = (long *)__ptr;
param_1 = (long *)((long)param_1 + 1);
uVar1 = 1;
}
}
}
}
}
return uVar1;
}
char FUN_0010134d(long param_1)
{
char cVar1;
char local_9;
if (param_1 == 0) {
local_9 = '\0';
}
else {
local_9 = '\x01';
while ((cVar1 = FUN_0010170a(param_1), cVar1 != '\x01' && (local_9 != '\0'))) {
local_9 = FUN_001014cf(param_1,0);
}
}
return local_9;
}
一路 if-else 到底
一点也不智能,^_^
人造人 发表于 2022-11-13 17:42
一路 if-else 到底
一点也不智能,^_^
我先研究下 人造人 发表于 2022-11-13 17:35
我发现了另外一个工具 ghidra
感觉还可以
哇,好看!
这是什么系统? liuhongrun2022 发表于 2023-7-19 15:12
哇,好看!
这是什么系统?
archlinux + i3-wm
页:
[1]