昨晚进行的一次crack 是我的第1.5次crack,上次的还没搞定..下面写的可能有些问题,清各位多多指教.
目标: 文件加密器 FDET V3.0
步骤:
1. peid v0.92 侦测壳的类型
2. 显示的壳是 LCC Win32 1.x -> Jacob Navia <没见过这个> VC6.0编写的
3. 用 PROCDUMP.EXE 1.62 final 选择 unknown 类型进行脱壳
4. 可是奇怪 的是 加壳后的有1.01M大小 而脱壳后是876KB 以前我脱壳后的都要比以前的大3-5倍呢.
5. 运行脱壳后的程序 其软件序列号: 8216-21669-7457, 我按照其格式输入 软件注册号: 1234-56789-7979 // BA8B-69921-9214
然后提示 "对不起 你输入的注册码错误 不能注册!" 且弹出的提示窗口的caption为 "Error".
6. 打开w32dasm8.93 gold版, 打开脱壳后的exe, 然后 选择加载处理
7. 然后选择菜单的 参考 的 串式参考 输入"对不起 你输入的注册码错误 不能注册!" yeah, we get it!
8. 获得错误提示的虚拟地址后,向前找,就找到了正确的提示的地址,然后就继续向前搜索 果然找到了
* Reference To: CRTDLL.strcmp, Ord:0242h
:004128F0 E8D31E0000 Call 004147C8 // *************
:004128F5 83C408 add esp, 00000008
:004128F8 83F800 cmp eax, 00000000 //
:004128FB 0F859B000000 jne 0041299C // jne -> jmp ************* 【offset】00011EF8H or -> nop
:00412901 8D7DE9 lea edi, dword ptr [ebp-17]
:00412904 57 push edi
就是上面的了
9. 然后查找一下 004128FB 地址恰好是错误 密码的地址,说明 CALL 004147C8这个子程序的返回值如果<=0 表示密码与正确密码不匹配
10. 于是就有几种想法
10.1 跟踪进去找到其正确的密码 ...
10.2 就是修改上面的 jne 0041299C 为 jmp 0041299C 或者 为nop 但是可能jne的跳转还有什么其他有影响的操作,所以可能改成nop不行,就想改成jmp 于是 就不用输入密码了...
10.3 怀疑其生成的 初始软件序列号 有可能是 获取本机 硬盘序列号,CPU号,网卡MAC地址之类的东东而成,所以看如果搞清楚关系的话,写一个注册机<是叫注册机么,就是我觉得它上面的软件序列号为任意情况,我都可以产生正确的密码,这样的叫注册机么??>
11. 好像前面的代码 还有
* Reference To: KERNEL32.OpenFile, Ord:01B0h
* Reference To: KERNEL32._lwrite, Ord:0291h
* Reference To: KERNEL32._lclose, Ord:028Ch
读取文件的操作,所以我怀疑正确的注册码是不是保存在某个文件里,然后在安装目录找了一下,找到了Fdet.cfg,猜想就是一个config文件<由其后缀名>,然后由ULTRA EDIT直接打开,全是二进制代码,也没看出什么...
12.然后开始设置了几个断点 主要是strcmp这个API函数 然后一路运行<提个疑问: 我设置了断点后,没有象VC那样 run to cursor的指令吗,不然可以一直自动运行到我的断点<当然中间不能有与用户交互之类的操作>,结果害的我按了很多的 “自动步进结束”<快捷键是F6>,才到了设置的断点这<因为自动步进遇到ret就自动停止了>,所以哪位兄弟知晓的话告知小弟设置一下,或者解释一下,多谢!
13.到了断点,F7一路进去,一路跟进 strcmp 的代码:
mov esi, dword ptr[ebp+08] // ebp+的表示为函数的参数 -的表示函数内局部变量 +08是第一个参数
xor eax, eax
mov edi dword ptr[ebp+0c] // +0c 是第二个参数
or ecx ffffffff
repnz
scasb // (AC) <- ((EDI)) && (EDI) <- (EDI) - 1; // 我是去查汇编手册看到的 可是谁能告诉我AC是什么呢?? 不是寄存器呀 是内存?
not ecx
sub edi, ecx
repnz
cmpsb // ((ESI)) <-> ((EDI)) && (ESI) <- (ESI)-1 && (EDI) <- (EDI)-1; 这里就是我们的比较了....
je 74f2e6dc // 这里我没跟进去了
// 再提个问题: 我跟踪的时候想把看到的ASM代码<不是大屏幕的,是右下方的代码记下来到记事本中,然而当w32dasm失去焦点又获得焦点的时候, 右下方的代码就自动执行了,结果搞了好几次, 我只好抄到笔记本上<笨方法 :-(> 哪位兄弟知道怎么好的处理方法,请告知!!
14. 突然在跟踪的时候 ,左下方出现一个 char[015] = ****-*****-****, 惊讶,窃喜,不是我的输入,也不是初始软件序列号,难道是??传说中的密码.娃哈哈哈,然后退出来,用其一输,OK!就是它了!! 然后它里面还有代码,就是注册成功后就把“注册”这个menuitem给删除了,害的后面又重装一次,继续. 对了,谁能告诉我这个char[015]是哪里来的,初步猜测是w32dasm里面自己分配的吧.
15. 现在想 直接修改里面的EXE。。<是不是叫什么 爆破?> 然后根据w32dasm找到那句jne 0041299C的offset,打开HIEW,找到地址,然后编辑其机器码,可是我发现JMP****地址的机器码不懂写,然后在代码其他地方找了几个 JMP的代码 如下:
0F859B000000 jne 0041299C // (1)
E960010000 jmp 004129C3 // (2)
EB3D jmp 004128CA
EB14 jmp 004129B0
我根据 (1) & (2) 这样计算出C3 - 9C = 27H E960010000 - 27H = E960000FD9以为后面这个就是正确的JMP****了,结果一试,不对,郁闷了.我放弃了.外面正是AC的球赛亚,好几个门柱!!!看来他们是需要我出去看球助威才能进了 ^_^.还是那句话,哪位大哥了解转变方法的话,敬请告知!!小弟愿.....请客...哈.
一些想法:
我上面就是我晚上的一些过程,说的很乱,而且可能还有错误的地方,但是我还是想写一下,一让大家共享一下,二嘛,就是上次看雪老大说有人变相请求破解,我上次是发了一个帖子说请求破解哪个5dai的教程的思路<我确实有分析过里面的很多汇编代码的>,为了证明俺是良民,所以就大着胆子写出来了,希望大家看的时候笑的小声点瓦,嘿,否则,CS 爆你头没商量<唉,好久没C了,只有KOF97一下了>
总结:
其实这次的很简单,只相当于工具的运用而已,何况注册机还没写出来。
^_^ 看球去了,等这几天我继续 看能否写一个注册机出来 ^_^.C.U.
嘿 AC米兰win了,爽.果然是偶们一去看求,就赢:-).
谢谢大家的指导!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)