兴化房产交易网:软件反编译

来源:百度文库 编辑:高校问答 时间:2024/04/28 06:59:33
现代的软件反编译到了什么程度,是否可以得到原代码?
是根据什么原理实现的?
有什么好的软件介绍。。。。需要什么的知识储备

只能修改其中的图片、代码,替换其中的资源
原代码一般是得不到的

防止用软件反编译delphi程序
这里有一篇防止用DeDe软件反编译delphi程序~
用『』里的是我的注释,其余的是原创作~

Program Project1;

Uses
Forms,
windows,
sysutils,
Unit1 In 'Unit1.pas' {Form1},
Unit2 In 'Unit2.pas' {Form2};

Function RegisterServiceProcess(dwProcessId, dwType: dword): Integer; Stdcall;
External 'kernel32.dll'
{$R *.RES}
Var
HMUTEX: HWND;
RET: INTEGER;
hCurrentWindow: HWnd; //反编译要的
szText: Array[0..254] Of char; //反编译要的
Begin
Application.Initialize;
APPLICATION.TITLE := 'delphi葵花宝典 设计:张国鹏';
RegisterServiceProcess(GetCurrentProcessID, 1); //让程序在Ctl+Alt+Del中消失.

『我们可以看到作者用RegisterServiceProcess把程序注册成了WINDOWS服务程序~』
『但大家都知道这个函数包含在kernel32里,而且只在98/ME中管用~』
『所以并不要把这项作为反编译的关键,可以说可有可无~』

//防止反编译开始
hCurrentWindow := GetWindow(APPLICATION.Handle, GW_HWNDFIRST);

『由上面知道作者想知道自己的程序窗口是不是最顶级的窗口』

While hCurrentWindow <> 0 Do
Begin
If GetWindowText(hCurrentWindow, @szText, 255) > 0 Then
If pos('DeDe', StrPas(@szText)) <> 0 Then

『如果不是,则获取现在顶机窗体的标题,在做判断是不是"DeDe"』

Begin
APPLICATION.MESSAGEBOX('想反编译我?没那么容易!',
'哈哈......你这家伙!', mb_ok);
//closewindow(hCurrentWindow);//使该程序窗口最小化
enablewindow(hCurrentWindow, false);
//使该程序的窗口不能被激活 如果能获取该程序的线程ID号,则可以使该程序又不能使用,又不能关闭,酷吧?

『以上这两句是对DEDE的处理~』
『closewindow:为把制定的窗口最小化,但窗口不会从内存中清除~』
『enablewindow:指定的窗口里允许/禁止所鼠标和键盘的输入,false肯定是不能了~』

halt;
End;
hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
End;
//防止反编译结束
//防止程序的二次运行
HMUTEX := CREATEMUTEX(Nil, FALSE, 'delphi葵花宝典 设计:张国鹏');
RET := GETLASTERROR;
If RET <> ERROR_ALREADY_EXISTS Then
Begin
Application.CreateForm(TForm1, Form1);
// Application.CreateForm(TForm2, Form2);
Application.Run;
End
Else
APPLICATION.MESSAGEBOX('程序已经运行!', '提示', mb_ok);
releasemutex(hmutex);

End.

『谈谈我的看法,这种方法也许是一种简单的防止反编译的做法,但由于过于简单了,』
『到现在就不是很有用了,也许可以对付一些初学的朋友,我们可以看到查找窗口的名』
『字为"DEDE"也就是说它只是一个字符串,在程序中没有很重要的地位,也就是不耽误』
『程序的运行,我们可以借助一些软件把程序中所有的"DEDE"改为别的字符,呵呵,这』
『程序可是没有逻辑思维的,改后可就对"DEDE"没有办法了^_^~~~~~~』

反汇编得到的是汇编代码
反编译得到的是所用语言的源代码

比如,一个c语言写的程序
反汇编得到汇编代码
反编译得到c语言的源代码

WDasm32 10.0
比较好的反汇编软件.堪称破解软件的"屠龙刀"

你说的是把exe反汇编吧? 最好的工具应该是softice

简单地讲,反汇编可以看到软件作者的编程思路,可以破解部分资源,可以将软件汉化等,例如找到它是如何注册的,从而解出它的注册码。

不是所有的软件都能反汇编,有些软件加上了防反汇编的功能,即发现软件受到改变,它就停止工作。亦或有些软件加了“壳”,那就必须选脱“壳”才能反汇编。

反汇编程序一般有两种,静态反汇编如W32Dasm,动态反汇编的如Softice.

还有一些针对不同编译器的反汇编工具,比如针对VB4的等。

根据需要选择即可

静态反汇编:程序未执行时,反汇编可执行文件
动态反汇编:程序执行时,反汇编内存中的数据

动态反汇编可以解决一些壳的问题

只能修改其中的图片、代码,替换其中的资源
原代码一般是得不到的 halt;
End;
hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
End;
//防止反编译结束
//防止程序的二次运行
HMUTEX := CREATEMUTEX(Nil, FALSE, 'delphi葵花宝典 设计:张国鹏');
RET := GETLASTERROR;
If RET <> ERROR_ALREADY_EXISTS Then
Begin
Application.CreateForm(TForm1, Form1);
// Application.CreateForm(TForm2, Form2);
Application.Run;
End
Else

反汇编得到的是汇编代码
反编译得到的是所用语言的源代码

比如,一个c语言写的程序
反汇编得到汇编代码
反编译得到c语言的源代码

WDasm32 10.0
比较好的反汇编软件.堪称破解软件的"屠龙刀"

你说的是把exe反汇编吧? 最好的工具应该是softice

简单地讲,反汇编可以看到软件作者的编程思路,可以破解部分资源,可以将软件汉化等,例如找到它是如何注册的,从而解出它的注册码。

不是所有的软件都能反汇编,有些软件加上了防反汇编的功能,即发现软件受到改变,它就停止工作。亦或有些软件加了“壳”,那就必须选脱“壳”才能反汇编。

反汇编程序一般有两种,静态反汇编如W32Dasm,动态反汇编的如Softice.

还有一些针对不同编译器的反汇编工具,比如针对VB4的等。

根据需要选择即可

静态反汇编:程序未执行时,反汇编可执行文件
动态反汇编:程序执行时,反汇编内存中的数据

动态反汇编可以解决一些壳的问题

参考资料:http://hi.baidu.com/woodsheen/blog/item/cd1daac3c5a80255b319a8a1.html 防止用软件反编译delphi程序
这里有一篇防止用DeDe软件反编译delphi程序~
用『』里的是我的注释,其余的是原创作~

Program Project1;

Uses
Forms,
windows,
sysutils,
Unit1 In 'Unit1.pas' {Form1},
Unit2 In 'Unit2.pas' {Form2};

Function RegisterServiceProcess(dwProcessId, dwType: dword): Integer; Stdcall;
External 'kernel32.dll'
{$R *.RES}
Var
HMUTEX: HWND;
RET: INTEGER;
hCurrentWindow: HWnd; //反编译要的
szText: Array[0..254] Of char; //反编译要的
Begin
Application.Initialize;
APPLICATION.TITLE := 'delphi葵花宝典 设计:张国鹏';
RegisterServiceProcess(GetCurrentProcessID, 1); //让程序在Ctl+Alt+Del中消失.

『我们可以看到作者用RegisterServiceProcess把程序注册成了WINDOWS服务程序~』
『但大家都知道这个函数包含在kernel32里,而且只在98/ME中管用~』
『所以并不要把这项作为反编译的关键,可以说可有可无~』

//防止反编译开始
hCurrentWindow := GetWindow(APPLICATION.Handle, GW_HWNDFIRST);

『由上面知道作者想知道自己的程序窗口是不是最顶级的窗口』

While hCurrentWindow <> 0 Do
Begin
If GetWindowText(hCurrentWindow, @szText, 255) > 0 Then
If pos('DeDe', StrPas(@szText)) <> 0 Then

『如果不是,则获取现在顶机窗体的标题,在做判断是不是"DeDe"』

Begin
APPLICATION.MESSAGEBOX('想反编译我?没那么容易!',
'哈哈......你这家伙!', mb_ok);
//closewindow(hCurrentWindow);//使该程序窗口最小化
enablewindow(hCurrentWindow, false);
//使该程序的窗口不能被激活 如果能获取该程序的线程ID号,则可以使该程序又不能使用,又不能关闭,酷吧?

『以上这两句是对DEDE的处理~』
『closewindow:为把制定的窗口最小化,但窗口不会从内存中清除~』
『enablewindow:指定的窗口里允许/禁止所鼠标和键盘的输入,false肯定是不能了~』

halt;
End;
hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
End;
//防止反编译结束
//防止程序的二次运行
HMUTEX := CREATEMUTEX(Nil, FALSE, 'delphi葵花宝典 设计:张国鹏');
RET := GETLASTERROR;
If RET <> ERROR_ALREADY_EXISTS Then
Begin
Application.CreateForm(TForm1, Form1);
// Application.CreateForm(TForm2, Form2);
Application.Run;
End
Else
APPLICATION.MESSAGEBOX('程序已经运行!', '提示', mb_ok);
releasemutex(hmutex);

End.

『谈谈我的看法,这种方法也许是一种简单的防止反编译的做法,但由于过于简单了,』
『到现在就不是很有用了,也许可以对付一些初学的朋友,我们可以看到查找窗口的名』
『字为"DEDE"也就是说它只是一个字符串,在程序中没有很重要的地位,也就是不耽误』
『程序的运行,我们可以借助一些软件把程序中所有的"DEDE"改为别的字符,呵呵,这』
『程序可是没有逻辑思维的,改后可就对"DEDE"没有办法了^_^~~~~~~』

百度一查就知道