下面呢篇文章系抄嘅,唔知对你有冇用呢。
题目: Cracking using DeDe (用dede来破解)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
引
这是一篇介绍dede的基础文章,在这里我将向你展示如何用dede分析软件,将软件
爆破,并写出他的keygen的问题.
工具:
Hmmm... 用什么呢?可能有dede?
还有 Hiew,还有Delphi(用来写keygen)
开工~~~~~~~~~~~
*1。运行dede
*2。选择文件,单击Process。
*3。test.exe将被运行,来让我们认识一下他(name,company&serial)
当然你也可以尝试一下注册按钮(winroot:千万不要把test关了)
*4。点击OK,dede开始工作~~~~~~~~读取完成~~再点ok.读取工作完成,分析正式开始
*5。点选dede中的 procedures项
*6。单击左边窗口的TForm1,你将会看到左边出现 Button1Click(双击它)————噢!发生了什么?
*7。开始浏览代码……一会你见会看到这样的信息(winroot:这些东西不会在同一个地方显示!废话!!)
* Possible reference to control 'Edit2':TEdit
………………………………
* Possible reference to control 'Edit1':TEdit
这些就是调用我们输入Name/Company的地方。
*8。我么继续看代码:
* Reference to: System..LStrCat3()
|
0044437D E82AF8FBFF call 00403BAC
00444382 8D55F0 lea edx, [ebp-$10]
T他的意思是将两个串连起来.
9. 下面你将看到edit3.text的调用. 很有趣, huh?
00444390 8B55F0 mov edx, [ebp-$10]
00444393 8B45FC mov eax, [ebp-$04]
* Reference to: System..LStrCmp()
|
00444396 E8D5F8FBFF call 00403C70
0044439B 7407 jz 004443A4
uhuh. Weeeell这意味着,edx 与eax比较,就象输入值与序列号比较一样。不会是明码比较这么简单把?我们来看
如果我们执行到这里:
0044439B 7407 jz 004443A4
如果string相等程序将什么也不会做(程序自己会判断)所以绝对不能让他跳,
我们继续往下看;
10. 0044439F E85C010000 call 00444500
我觉的有点可疑!
双击跟进取!
我们发现这里好像是一函数的开始部分,把两个值连起来.
?
00444550 E87FFEFFFF call 004443D4
这个子程序是干吗的?跟进去看到
| or: System..LStrLen()
004443F8 E863F7FBFF call 00403B60
取字符串长度
004443FF 83FB0A cmp ebx, +$0A
00444402 7F12 jnle 00444416
一直循环到$0A, 就是10.
所以它等于 "for i:=length(s) to 10"
Oki. 我们能在循环中做些什么呢?
* Reference to: System..LStrCat()
在字符串后加个 'A' .
结果怎么样呢? 程序调用字符串, 如果字符个数小于10就在后面加'A'.
11. 单击右上的"<"键推出上面那个call来到:
* Possible String Reference to: "123-"
|
00444555 683C464400 push $0044463C
oki. 我们看到'123-'很好.
继续看. 这个子程序将创建一个串:
a)LStrCopy(something,from,to)
b)存储结果
c)测试结果call 00444444
12. 看这里这里有两次变化:
0044455E B905000000 mov ecx, $00000005
00444563 BA01000000 mov edx, $00000001
调用eax的值,复制 $1到$5. 如果串是 'aaabbbccc' 则结果是'aaabb';
00444587 B904000000 mov ecx, $00000004
0044458C BA05000000 mov edx, $00000005
同样, 从第五个字母开始取四个. 所以结果是: 'bbbc'
13. 在这两个call之间, 你会看到
* Possible String Reference to: "-321-"
|
0044457E 684C464400 push $0044464C
记住他,他使中间的那个.
* Possible String Reference to: "-123"
|
004445A7 685C464400 push $0044465C
and another one in the end.
现在我们知道serial的结构: 123-xxx-321-xxx-123
14. 现在我们要找xxx的值, 进入 00444444 call.看到:
* Possible String Reference to: "zZz"
在起始和结束保存,
然后:
00444488 BA03000000 mov edx, $00000003
* Reference to: System..LStrCatN()
从字符串中调用第三个字母 像这样复制他:
zZz + char + zZz
然后, 同样的, 他们调用调用第一和第二个字母.
如果输入 'Hello', 结果是:
'HzZzlzZze'
cool.
15.这就是算法!
好让我们来算自己的serial!
Name: Ful
Company:gore
a)Temp String: Fulgore
b)第一个函数得到 我们得到: FulgoreAAA
c)然后第一个规则得到'Fulgo', 用第二个函数得到 uzZzlzZzF
d)用第2个得到'oreA', 用第二个函数得到 rzZzezZzo
e) 用第3个函数我们得到: 123-FzZzlzZzu-321-ozZzezZzr-123
f) 让我们检测以下!成功!!!
g) 用到下面的函数:
1st:
procedure prepare(var s:string);
var z:string;
i:integer;
begin
z:=s;
for i:=length(z) to 10do
s:=s+'A';
end;
2nd
function Cripple(s:String):string;
var kk:string;
begin
kk:='zZz'+s[3]+'zZz';
kk:=s[1]+kk+s[2];
result:=kk;
end;
3rd.
function generate(name,comp:string):string;
var temp:string;
begin
temp:=name+comp;
prepare(temp);
result:='123-'+cripple(copy(temp,1,5))+'-321'+cripple(copy(temp,5,4))+'-123';
end;
爆破
Well,这一步非常简单, 看Button1Click的代码,
双击call 00444500 进入我们会看到:
004445D2 740C jz 004445E0
* Possible String Reference to: "screw you!"
004445D4 B86C464400 mov eax, $0044466C
* Reference to: Dialogs.ShowMessage(System.AnsiString)
004445D9 E896F9FFFF call 00443F74
004445DE EB0A jmp 004445EA
* Possible String Reference to: "good for you!"
004445E0 B880464400 mov eax, $00444680
很明显的可以看到我们下一步将干什么,只需将 jz 变成jmp.
运行 RVA converter (在dede的tools里)将004445D2 变成offset: 000439D2
运行 hiew, 进入 hex 模式, 按F5 到000439D2;
这里将出现 JE 操作码 ,把它变成 JMP, save然后运行
收工
爆破已经完成, 相信你能写出他的keygen