首页
社区
课程
招聘
[原创]非新人则飘
发表于: 2008-3-16 18:50 12409

[原创]非新人则飘

2008-3-16 18:50
12409
名称位于 crackme1,项目 44
          地址=0040700C
          区段=.rdata
          类型=导入    (已知)
          名称=KERNEL32.WriteFile
 
       名称位于 crackme1,项目 35
          地址=00407018
          区段=.rdata
          类型=导入    (已知)
          名称=KERNEL32.ReadFile
名称位于 crackme1,项目 33
 地址=004070B4
 区段=.rdata
 类型=导入    (已知)
 名称=USER32.MessageBoxA
0040CA16    E8 89020000   call    crackme1.0040CCA4           ; 又取字符的又换窗口字符的,这函数是干什么的..- -
0040CA1B    83C4 1C       add     esp,1C
0040CA1E    8845 EC       mov     byte ptr ss:[ebp-14],al
0040CA21    DB45 E8       fild    dword ptr ss:[ebp-18]
0040CA24    DD5D DC       fstp    qword ptr ss:[ebp-24]
0040CA27    DD45 DC       fld     qword ptr ss:[ebp-24]
0040CA2A    8B45 EC       mov     eax,dword ptr ss:[ebp-14]   ; 1连串不知道干什么的浮点操作后eax装入用户名了
0040CA2D    25 FF000000   and     eax,0FF                     ; 只留下最后面2位字符
0040CA32    8945 D4       mov     dword ptr ss:[ebp-2C],eax   ; 然后再对这2个数字做一连串的浮点操作
0040CA35    DB45 D4       fild    dword ptr ss:[ebp-2C]
0040CA38    DD5D D4       fstp    qword ptr ss:[ebp-2C]
0040CA3B    DC45 D4       fadd    qword ptr ss:[ebp-2C]
0040CA3E    DD5D CC       fstp    qword ptr ss:[ebp-34]
0040CA41    DD45 CC       fld     qword ptr ss:[ebp-34]
0040CA44    E8 37FDFFFF   call    crackme1.0040C780
0040CA49    8945 E8       mov     dword ptr ss:[ebp-18],eax
0040CA4C    58            pop     eax
0040CA4D    5B            pop     ebx
0040CA4E    59            pop     ecx
0040CA4F  ^ EB 8F         jmp     short crackme1.0040C9E0
0040CA51    83C4 0C       add     esp,0C                   ; 在这儿输入的名字就全部取出来了
0040CA54    DB45 E8       fild    dword ptr ss:[ebp-18]
0040CA57    DD5D DC       fstp    qword ptr ss:[ebp-24]
0040CA5A    DD45 DC       fld     qword ptr ss:[ebp-24]
0040CA5D    DB45 F8       fild    dword ptr ss:[ebp-8]
0040CA60    DD5D D4       fstp    qword ptr ss:[ebp-2C]
0040CA63    DC4D D4       fmul    qword ptr ss:[ebp-2C]
0040CA66    DD5D CC       fstp    qword ptr ss:[ebp-34]
0040CA69    DD45 CC       fld     qword ptr ss:[ebp-34]
0040CA6C    E8 0FFDFFFF   call    crackme1.0040C780
0040CA71    8945 E8       mov     dword ptr ss:[ebp-18],eax
0040CA74    DB45 F4       fild    dword ptr ss:[ebp-C]
0040CA77    DD5D DC       fstp    qword ptr ss:[ebp-24]
0040CA7A    DD45 DC       fld     qword ptr ss:[ebp-24]
0040CA7D    DC05 CCC04000 fadd    qword ptr ds:[40C0CC]
0040CA83    DD5D D4       fstp    qword ptr ss:[ebp-2C]
0040CA86    DD45 D4       fld     qword ptr ss:[ebp-2C]
0040CA89    DC25 D4C04000 fsub    qword ptr ds:[40C0D4]
0040CA8F    DD5D CC       fstp    qword ptr ss:[ebp-34]
0040CA92    DD45 CC       fld     qword ptr ss:[ebp-34]
0040CA95    E8 E6FCFFFF   call    crackme1.0040C780    ;取用户名,上面对用户名做一些处理,保存到堆栈中.这儿才开始算注册码
0040CA9A    8945 F4       mov     dword ptr ss:[ebp-C],eax ;到这儿ebp-4保存着注册名
0040CA9D    68 01030080   push    80000301
0040CAA2    6A 00         push    0
0040CAA4    FF75 E8       push    dword ptr ss:[ebp-18]
0040CAA7    68 01000000   push    1
0040CAAC    BB 68010000   mov     ebx,168
0040CAB1    E8 EE010000   call    crackme1.0040CCA4     ;0040CCA4是算法call,运行到这儿算出ww后的前4位
0040CAB6    83C4 10       add     esp,10                
0040CAB9    8945 E0       mov     dword ptr ss:[ebp-20],eax
0040CABC    68 01030080   push    80000301
0040CAC1    6A 00         push    0
0040CAC3    FF75 F4       push    dword ptr ss:[ebp-C]
0040CAC6    68 01000000   push    1
0040CACB    BB 68010000   mov     ebx,168
0040CAD0    E8 CF010000   call    crackme1.0040CCA4     ;最后面的几位算出来了
0040CAD5    83C4 10       add     esp,10                       
0040CAD8    8945 DC       mov     dword ptr ss:[ebp-24],eax    ;eax装的是注册码后面的几位
0040CADB    FF75 DC       push    dword ptr ss:[ebp-24]        ;[ebp-24]= 注册码后面的几位,
0040CADB                                           ;[ebp-20]=ww后的前四位,
0040CADB                                           ;根据call的参数压入栈的顺序,
0040CADB                                           ;于是知道这儿是按照"ww"+"[ebp-20]"+"[ebp-24]"来组合得到注册码的
0040CADE    FF75 E0       push    dword ptr ss:[ebp-20]
0040CAE1    68 DCC04000   push    crackme1.0040C0DC                          ; ww
0040CAE6    B9 03000000   mov     ecx,3                       ;要组合的部分:3个
0040CAEB    E8 22FDFFFF   call    crackme1.0040C812           ; 这个是组合字串符的call
0040CAF0    83C4 0C       add     esp,0C
0040CAF3    8945 D8       mov     dword ptr ss:[ebp-28],eax
0040CAF6    8B5D E0       mov     ebx,dword ptr ss:[ebp-20]
0040CAF9    85DB          test    ebx,ebx                     ; 有没有算到前四位
0040CAFB    74 09         je      short crackme1.0040CB06
0040CAFD    53            push    ebx
0040CAFE    E8 9B010000   call    crackme1.0040CC9E
0040CB03    83C4 04       add     esp,4
0040CB06    8B5D DC       mov     ebx,dword ptr ss:[ebp-24]
0040CB09    85DB          test    ebx,ebx
0040CB0B    74 09         je      short crackme1.0040CB16                    
0040CB0D    53            push    ebx
0040CB0E    E8 8B010000   call    crackme1.0040CC9E
0040CB13    83C4 04       add     esp,4
0040CB16    8B45 D8       mov     eax,dword ptr ss:[ebp-28]
0040CB19    50            push    eax
0040CB1A    8B5D E4       mov     ebx,dword ptr ss:[ebp-1C]
0040CB1D    85DB          test    ebx,ebx
0040CB1F    74 09         je      short crackme1.0040CB2A              ; 判断有没有算到后几位
0040CB21    53            push    ebx
0040CB22    E8 77010000   call    crackme1.0040CC9E
0040CB27    83C4 04       add     esp,4
0040CB2A    58            pop     eax                                  ; 内存注册机可以在这儿取东西
0040CB2B    8945 E4       mov     dword ptr ss:[ebp-1C],eax
0040CB2E    6A FF         push    -1
0040CB30    6A 08         push    8
0040CB32    68 03000116   push    16010003
0040CB37    68 01000152   push    52010001
0040CB3C    E8 69010000   call    crackme1.0040CCAA                     
0040CB41    83C4 10       add     esp,10
0040CB44    8945 E0       mov     dword ptr ss:[ebp-20],eax
0040CB47    8B45 E4       mov     eax,dword ptr ss:[ebp-1C]
0040CB4A    50            push    eax
0040CB4B    FF75 E0       push    dword ptr ss:[ebp-20]
0040CB4E    E8 1BFDFFFF   call    crackme1.0040C86E                     ; 把输入的注册码和算出来的分别放在edx,ecx
0040CB53    83C4 08       add     esp,8
0040CB56    83F8 00       cmp     eax,0
0040CB59    B8 00000000   mov     eax,0
0040CB5E    0F94C0        sete    al
0040CB61    8945 DC       mov     dword ptr ss:[ebp-24],eax
0040CB64    8B5D E0       mov     ebx,dword ptr ss:[ebp-20]
0040CB67    85DB          test    ebx,ebx
0040CB69    74 09         je      short crackme1.0040CB74
0040CB6B    53            push    ebx
0040CB6C    E8 2D010000   call    crackme1.0040CC9E                      ;这儿比较call了
0040CB71    83C4 04       add     esp,4
0040CB74    837D DC 00    cmp     dword ptr ss:[ebp-24],0                   
0040CB78    0F84 3B000000 je      crackme1.0040CBB9                     ;爆破点:最
0040CB78                                                                ;好nop,00在我这儿就不能正常运行了
0040CB7E    68 04000080   push    80000004
0040CB83    6A 00         push    0
0040CB85    68 DFC04000   push    crackme1.0040C0DF                         ; 恭喜!
0040CB8A    68 01030080   push    80000301
0040CB8F    6A 00         push    0
0040CB91    68 00000000   push    0
0040CB96    68 04000080   push    80000004
0040CB9B    6A 00         push    0
0040CB9D    68 E6C04000   push    crackme1.0040C0E6                         ; 哈哈,你成功了!
0040CBA2    68 03000000   push    3
0040CBA7    BB 00030000   mov     ebx,300
0040CBAC    E8 F3000000   call    crackme1.0040CCA4

xiaolang
ww68081620050797
asdas
ww26201620050784
0040CA9D    68 01030080   push    80000301   ;保存着加密需要的1个数字
0040CAA2    6A 00         push    0
0040CAA4    FF75 E8       push    dword ptr ss:[ebp-18];第二个
0040CAA7    68 01000000   push    1
0040CAAC    BB 68010000   mov     ebx,168   ;根据ebx来选择使用哪套算法.
0040CAB1    E8 EE010000   call    crackme1.0040CCA4 

关于"应该用极简单来形容的crackme"破文
请坚持看懂每一个asm指令~
直接拖OD:
2个输入框,1个确定框

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
修改crackme达到某种目的,非新人则飘
     

请坚持看懂每一个asm指令~
不能上网,整理硬盘,突然某个疙瘩翻出这个crackme,发现是PYG的做的.
(PYG是哪位?很棒的crackme.我新手真的没见过这位仁兄)
立马翻上OD,上阵唠..
系统有问题,F8和F12有问题,一用就得重启,于是用+,-,F4,F7来搞了。^_^其实这样效率也是太高的了..
脱壳就是ESP。
pushad后面F4,然后硬件断点,retn F4,F7,
lording..
IMT_recing...
完后发现太完美了,她居然被脱得这么干净...嘿嘿..
拖入OD的黑房子
一路滚鼠标翻代码,碰到call就enter进去瞧下无问题就 "-"回来在下一个指令F4
没走几步路,就发现一个非比寻常的call..
0044DEAA    E8 197FFBFF   call    dumped_.00405DC8; 进去看,发现它居然明张
0044DEAA    ;目胆的调用了kernel32.CreateMutexA(创建互斥对象),nop掉。
0044DEAA    ;保存后测试发现可以成功运行多个.o(∩_∩)o...

继续往下面滚鼠标

0044DEE0    E8 C7E4FFFF   call    dumped_.0044C3AC               ; F4到下面就弹出框,那就进
0044DEE0                          ;去吧:在原地F2,ctrl+F2,F9,F7

进去后继续翻
00444D52    807D FB 00    cmp     byte ptr ss:[ebp-5],0
00444D56    74 0F         je      short dumped_.00444D67
00444D58    E8 DFE6FBFF   call    dumped_.0040343C               ; 跟到下面提示框出现了,00444D58        ;在前面略略跟了后觉得应该是初始化以及判断互斥对象的code,所以0044DEE0
00444D58        ;那个call还是很重要的,不能跳过,那进这个看看可以nop不..
00444D5D    64:8F05 00000>pop     dword ptr fs:[0]
00444D64    83C4 0C       add     esp,0C

程序继续跑,然后在004450A1处出现了框,再进去,里面是连续几个call,最后跳到MessageBoxA,那就nop这个好唠.
0044509B    8B83 D4020000 mov     eax,dword ptr ds:[ebx+2D4]
004450A1    FF93 D0020000 call    near dword ptr ds:[ebx+2D0]
004450A7    33C0          xor     eax,eax  ;注意这儿是清空返回值,简直是太好了!一般的call
004450A7    ;返回值eax都会被后面的code调用,而这儿清空了,也就是它不调用了.
004450A7    ;于是我们..哈哈
004450A9    5A            pop     edx

PS:+,-的作用很大很大哦!运行到弹出框的代码处,想要返回前面的call?难道又要从新运行?呵呵,其实OD已经把我们运行过的地方保存下来了,按+,-就可以翻到了
只是介绍个经验,不敢说是文章,note也不敢....
ole~
上传的附件:
2008-3-16 18:53
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
某keyfiles,非新人则飘
     

请坚持看懂每一个asm指令~
又拖来一个小子,现在已经进黑房子了....

我觉得这个太可爱了。。
为什么就这么可爱呢?
奇怪的可爱....

搜索字串符
Ultra 字符串参考
地址       反汇编                                    文本字符串
004010F3   push    CRACKME6.00403017                 keyfile.dat
00401109   push    CRACKME6.00403023                 error!
0040110E   push    CRACKME6.0040302A                 key file not found!
0040113B   push    CRACKME6.00403023                 error!
00401140   push    CRACKME6.0040303E                 error reading file!
0040116E   push    CRACKME6.00403023                 error!
00401173   push    CRACKME6.00403052                 invalid key!
00401183   push    CRACKME6.00403076                 correct!!!
00401188   push    CRACKME6.0040305F                 correct key! good job!

可以直接修改那些跳转->jmp,一直jmp到正确的位置,然后无论牛头马面都会成功了.
の..
直接到4010f3看看,原来这是个读取+判断文件内容的子函数啊!这么简洁那就应该是asm写的唠
004010E1    6A 00         push    0
004010E3    68 80000000   push    80
004010E8    6A 03         push    3
004010EA    6A 00         push    0
004010EC    6A 01         push    1
004010EE    68 00000080   push    80000000
004010F3    68 17304000   push    CRACKME6.00403017              ; keyfile.dat
004010F8    E8 BD000000   call    <jmp.&KERNEL32.CreateFileA>    ;CreatFileA是创建文件的函数,如果004010F8    ;存在则它的
004010F8    ;返回值eax不就是false了嘛?^_^
004010FD    A3 88304000   mov     dword ptr ds:[403088],eax
00401102    83F8 FF       cmp     eax,-1
00401105    75 14         jnz     short CRACKME6.0040111B;如果不是创建成功了(-1),
00401105                  ;那就越过错误提示,当然,我们可以让他一直越过..
00401107    6A 10         push    10
00401109    68 23304000   push    CRACKME6.00403023              ; error!
0040110E    68 2A304000   push    CRACKME6.0040302A              ; key file not found!
00401113    6A 00         push    0
00401115    E8 94000000   call    <jmp.&USER32.MessageBoxA>; boy!你怎么会运行到这儿?回去回去!修改成jmp!
0040111A    C3            retn    ;给你个错误框就返回了,不成..
0040111B    6A 00         push    0                              ;我们需要修改上面以运行到这儿来继续crack
0040111D    68 96304000   push    CRACKME6.00403096
00401122    6A 0A         push    0A
00401124    68 8C304000   push    CRACKME6.0040308C
00401129    FF35 88304000 push    dword ptr ds:[403088]
0040112F    E8 98000000   call    <jmp.&KERNEL32.ReadFile>       ;按照某个格式来读取keyfile.dat文件,
0040112F                  ;╭∩╮(︶︿︶)╭∩╮鄙BS我..不知道这个函数的参数
00401134    83F8 00       cmp     eax,0
00401137    75 15         jnz     short CRACKME6.0040114E ;如果什么也读不到,ReadFile会返回0,这儿就不会跳了
00401139    6A 10         push    10
0040113B    68 23304000   push    CRACKME6.00403023              ; error!
00401140    68 3E304000   push    CRACKME6.0040303E              ; error reading file!
00401145    6A 00         push    0
00401147    E8 62000000   call    <jmp.&USER32.MessageBoxA>      ;怎么能让它运行到这儿呢?上面的jmp!
0040114C    EB 48         jmp     short CRACKME6.00401196        ;跳到00401196结束创建文件的工作,然后ret,也不成~
0040114E    8D15 8C304000 lea     edx,dword ptr ds:[40308C]      ;把读到的东西和某些玩意做比较
00401154    83C2 05       add     edx,5
00401157    803A 31       cmp     byte ptr ds:[edx],31           ;ascii([第5位])=ascii(31)
0040115A    75 10         jnz     short CRACKME6.0040116C        ;熟悉了吧?不是就跳到后面告诉你这是错误的码
0040115C    83C2 03       add     edx,3                          ;第二位了
0040115F    803A 33       cmp     byte ptr ds:[edx],33           ;ascii([第8位])=ascii(33)
00401162    75 08         jnz     short CRACKME6.0040116C        ;不是就跳到后面告诉你这是错误的码
00401164    42            inc     edx                            ;edx的大小加1,也就是它指向下一个字符
00401165    803A 30       cmp     byte ptr ds:[edx],30           ;ascii([第9位])!=ascii(30)
00401168    74 02         je      short CRACKME6.0040116C        ;不能是ascii(30)啊,是了就
00401168                  ;AG了..就前功尽弃了,就不能可歌可泣了,就功亏一篑了..
0040116A    EB 15         jmp     short CRACKME6.00401181        ;上面的完全匹配才会到达革命党阵地00401181!
0040116C    6A 10         push    10
0040116E    68 23304000   push    CRACKME6.00403023              ; error!
00401173    68 52304000   push    CRACKME6.00403052              ; invalid key!
00401178    6A 00         push    0
0040117A    E8 2F000000   call    <jmp.&USER32.MessageBoxA>
0040117F    EB 15         jmp     short CRACKME6.00401196
00401181    6A 40         push    40
00401183    68 76304000   push    CRACKME6.00403076              ; correct!!!
00401188    68 5F304000   push    CRACKME6.0040305F              ; correct key! good job!
0040118D    6A 00         push    0
0040118F    E8 1A000000   call    <jmp.&USER32.MessageBoxA>      ;此乃光明顶!
00401194    EB 00         jmp     short CRACKME6.00401196
00401196    FF35 88304000 push    dword ptr ds:[403088]          ;结束上面那个CreatFile的工作,不然真让它创建个文件?
0040119C    E8 13000000   call    <jmp.&KERNEL32.CloseHandle>
004011A1    C3            retn                                   ;game win~

怀疑我怎么知道上面那些地址指向的就是第一位,第二位...?の..我也不知道啊,也是在跟了之后才发现的..^_^

这样就知道keyfile.dat应该的内容了,第五位是1(ascii 31),第八位是33(ascii 33),第九位不是0(ascii 0),其他的无视。
可是仅仅让它给我们说句"你做的好"怎么体现出我们的伟大?
...继续我们的黑匣子计划..
我把它要读取的文件名字改成Xlang  .dat
在把验证的第5,8,位改成l,g..来对应"ixiaolang!"
hohohoho这样就很好很强大了。。
看它保存文件名的地方,403017,在数据窗口db 403017,看到了嘛?
右键->二进制->编辑->改成xiaolang.dat..不过貌似多覆盖了一个字符。。 换成"Xlang  .dat"好了
也就是用58 6C 61 6E 67 20 20 2E 64 61 74填充原位置,这样就和原来的文件名一样长了
然后分别用6ch(10进制是108),67h(10进制是103)
hoho,再说一个小 tip吧..
按着alt输入某个数字然后松开,这样在windows输入的就是你现在所选的那个页面中那个数字所对应的unicode码.
の...好像不很明白啊,不过知道是alt+103输入的是g,alt+108输入的是l就可以了,然后转换成16进制就可以在OD里面使用了,(因为我不怎
么喜欢windows下乱七八糟的工具,一直只使用计算器的)大家以后着急没有ascii转换工具也可以这样用一下这汗牛啊!

修改
0040114E    8D15 8C304000 lea     edx,dword ptr ds:[40308C]      
00401154    83C2 05       add     edx,5
00401157    803A 31       cmp     byte ptr ds:[edx],31           
0040115A    75 10         jnz     short CRACKME6.0040116C        
0040115C    83C2 03       add     edx,3                          
0040115F    803A 33       cmp     byte ptr ds:[edx],33           
00401162    75 08         jnz     short CRACKME6.0040116C        
00401164    42            inc     edx                           
00401165    803A 30       cmp     byte ptr ds:[edx],30   
这块的!
hoho,修改的方法上面已经说很清楚了!不重复了哦!

只是交流心得,不敢说是文章,也不敢说是note。。
有问题指教..
上传的附件:
2008-3-16 18:54
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
娃娃的一个crackme..,非新人则飘
     

请坚持看懂每一个asm指令~
拖入黑房子,才想起PEID,再拖到菜市场,发现是aspack 2.1,心中有底后再次拉入黑房子。。
尝试esp搞它,pushad后F4,数据窗口跟随,硬件断点,F9...
出现经典aspack oep前奏,F4 ret,F7..
lording..
IMT_recing..
ole~
脱的很干净的感觉~
^_^

到正文,停止啰嗦,直接到点。。
它的读取文件的大概流程是这样的
CreatFile判断是不是存在文件,不存在就直接失败.
然后读取刚才访问文件的前10个字节,保存到4020f3
再在4020fd的位置再保存,还是那10个字节。
然后从4020f3第一个字节开始和58异或
如果有1个字节为0就停止异或.
在对照后面的lstrcmpA,我晕了。。
居然是要求那十个字节符合
每个字节xor 58后,两串字节的大小和一串的大小一样~
最简单的:也就是说,它需要所有位和58异或后都为0.
试着改成5858585858..
..
不成
继续..思考
想到头疼死。。
最后静下心来了,翻出"深入理解计算机系统"好好的复习了一下二进制和16进制...
可是,怎么也想不出其他的数字符合这个条件了..
终于。。

睡着了居然.....

先贴关键代码如下
00401098   > \6A 00       push    0                                    ; /hTemplateFile = NULL
0040109A   .  68 EF204000 push    dump.004020EF                        ; |Attributes=READONLY|HIDDEN|SYSTEM|ARCHIVE|NORMAL|402048
0040109F   .  6A 03       push    3                                    ; |Mode = OPEN_EXISTING
004010A1   .  6A 00       push    0                                    ; |pSecurity = NULL
004010A3   .  6A 03       push    3                                    ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
004010A5   .  68 000000C0 push    C0000000                             ; |Access = GENERIC_READ|GENERIC_WRITE
004010AA   .  68 E5204000 push    dump.004020E5                        ; |[bcg].key
004010AF   .  E8 DE000000 call    <jmp.&kernel32.CreateFileA>          ; \CreateFileA
004010B4   .  A3 00204000 mov     dword ptr ds:[402000],eax            ;此进程句柄保存到402000
004010B9   .  833D 002040>cmp     dword ptr ds:[402000],-1             ;
004010C0   .  0F84 920000>je      dump.00401158   
004010C6   .  6A 00       push    0                                    ; /pOverlapped = NULL
004010C8   .  68 07214000 push    dump.00402107                        ; |pBytesRead = dump.00402107
004010CD   .  6A 0A       push    0A                                   ; |BytesToRead = A (10.)
004010CF   .  68 F3204000 push    dump.004020F3                        ; |Buffer = dump.004020F3
004010D4   .  FF35 002040>push    dword ptr ds:[402000]                ; |hFile = 00000098 (window)
004010DA   .  E8 C5000000 call    <jmp.&kernel32.ReadFile>             ; \ReadFile
004010DF   .  85C0        test    eax,eax
004010E1   .  74 75       je      short dump.00401158
004010E3   .  6A 00       push    0                                    ; /pOverlapped = NULL
004010E5   .  68 07214000 push    dump.00402107                        ; |pBytesRead = dump.00402107
004010EA   .  6A 0A       push    0A                                   ; |BytesToRead = A (10.)
004010EC   .  68 FD204000 push    dump.004020FD                        ; |Buffer = dump.004020FD
004010F1   .  FF35 002040>push    dword ptr ds:[402000]                ; |hFile = 00000098 (window)
004010F7   .  E8 A8000000 call    <jmp.&kernel32.ReadFile>             ; \ReadFile
004010FC   .  85C0        test    eax,eax
004010FE   .  74 58       je      short dump.00401158
00401100   .  FF35 002040>push    dword ptr ds:[402000]                ; /hObject = 00000098 (window)
00401106   .  E8 93000000 call    <jmp.&kernel32.CloseHandle>          ; \CloseHandle
0040110B   .  33C0        xor     eax,eax
0040110D   .  EB 04       jmp     short dump.00401113
0040110F   .  C9          leave
00401110   .  C2 1000     retn    10
00401113   >  80B0 F32040>xor     byte ptr ds:[eax+4020F3],58
0040111A   .  40          inc     eax
0040111B   .  80B8 F32040>cmp     byte ptr ds:[eax+4020F3],0
00401122   .^ 75 EF       jnz     short dump.00401113
00401124   .  68 F3204000 push    dump.004020F3                        ; /String2 = "#*,>i%"
00401129   .  68 FD204000 push    dump.004020FD                        ; |String1 = ""
0040112E   .  E8 77000000 call    <jmp.&kernel32.lstrcmp>              ; \lstrcmpA
00401133   .  83F8 00     cmp     eax,0
00401136   .  74 06       je      short dump.0040113E
00401138   .  EB 1E       jmp     short dump.00401158
0040113A   .  C9          leave
0040113B   .  C2 1000     retn    10
0040113E   >  68 00100000 push    1000                                 ; /Style = MB_OK|MB_SYSTEMMODAL
00401143   .  68 26204000 push    dump.00402026                        ; |officialcrackme
00401148   .  68 BF204000 push    dump.004020BF                        ; |注册验证成功,恭喜您成功破解了这个程序
0040114D   .  6A 00       push    0                                    ; |hOwner = NULL
0040114F   .  E8 5C000000 call    <jmp.&user32.MessageBoxA>            ; \MessageBoxA
00401154   .  C9          leave
00401155   .  C2 1000     retn    10


早上起来的动作是久闻的 闻鸡 翻身 而起。。

扳开电源->再次打开[bbg].key观察
突然发现..
我个马虎居然把5858写到ASCii栏了。。。
马上换16进制编辑,585858..
oh year~

PS:这是昨天在无聊看U盘中的crackme时找到的,发现原文似乎写错了?原作者理解错了还是我错了?
不过这crackme在最中间大名鼎鼎的挂着不准爆破,不准使用辅助工具,不准内存补丁.
第2个是大大咧咧的接受..本来就不用滴嘛~
第3个也欣然遵守,(其实是根本不会写- -)
可是...第一个太残忍了..吧..
就这样看着绝佳的爆破点禁止爆破...我!@%¥……#¥……#¥……$%&$&$%*$%*
上传的附件:
2008-3-16 18:54
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
绝对详细到和鄙人一样的菜鸟会永远BS我.,非新人则飘
     

请坚持看懂每一个asm指令~
直接拖入OD的黑房子.
进去发现怎么跑系统DLL里面了 - -~!
ALT+F9返回直接卡死..^%&%^@%@..这破系统...
准备重启突然想到这玩意没壳怎么搞死我的?
把alt+tap按的快把字磨完调出了OD窗口,下面的信息栏赫然的写着***** Kasper....
の....
原来这麽多天折磨我的是卡巴啊~~~
郁闷,一直怀疑是我HOOK错了还是咋地,原来是卡巴老起义..
卡巴啊卡巴..删除了吧(是兄弟的电脑,在村不能上网很多东西没法找到原因..村的暴发户,用的P4,4G内存,320硬盘,就是不能上网..这几天卡巴那问题搞的我一直挺郁闷的)

为了保证万无一失,我还准备从新安装系统,可兄弟却大力阻挠,原因却实在是郁闷:他儿子安装了那么多的游戏,这一重装,游戏没有了儿子不闹死,怎么解释也不成..
- -

哈哈习惯我的废话连篇了没?
正文开始~

入口:
00401016 >  6A 00         push    0
00401018    E8 CE240000   call    <jmp.&KERNEL32.GetModuleHandleA>
0040101D    A3 87414000   mov     dword ptr ds:[404187],eax
00401022    6A 00         push    0
00401024    68 84314000   push    aescul.00403184
00401029    6A 00         push    0
0040102B    6A 65         push    65
0040102D    FF35 87414000 push    dword ptr ds:[404187]
00401033    E8 7D240000   call    <jmp.&USER32.DialogBoxParamA>
00401038    90            nop
00401039    90            nop
0040103A    90            nop
0040103B    90            nop
0040103C    90            nop
0040103D    90            nop
0040103E    90            nop
0040103F    90            nop
00401040    90            nop
00401041    90            nop
00401042    90            nop
00401043    90            nop
00401044    90            nop
00401045    90            nop
...........

汗颜,这...
这样就基本上可以确定是ASM编译的了,高级语言的编译器怎么可能产生这么..BT这么..无敌这么...惊人的nop串呢?(从1038-3037,NND翻了我5分钟来着...)
那就先跳到后面的有效代码处在说.
3038下断+F9

顺利运行,输入信息
xiaolang
qqqqqq
断下后发现自己实在是好无聊,人家用ASM写的...直接看就是了..干什么找关键码..
(比较从403038开始..)
(顺便佩服下作者,自己设计堆栈用pushfd和popfd来storage数据,鄙人实在是自问功力相去甚远..)

我的0I5LZ7G123RXCV9OPAS6TBN4 8YUHJKDF0QWEM


00403038    33C0          xor     eax,eax                                ; 清空eax

0040303A    68 93334000   push    aescul.00403393                        ;压入403393这个地址作为SEH句柄,也就是把这部分作为SEH来。。作为算法的一部分..- -原谅我的语言能力

0040303F    64:FF30       push    dword ptr fs:[eax]                     

00403042    64:8920       mov     dword ptr fs:[eax],esp

00403045    9C            pushfd                   ;注意注意,这儿使用了2个pushad,


00403046    9C            pushfd                   ;而执行到第二个popad算法已经完了^_^

00403047    58            pop     eax  ;害羞次,忘了pushfd是干什么的.专门跟了次程序观察堆00403047    ;栈才..知道的.是压入flag(标志)寄存器,popfd压出到eax

00403048    0D 00010000   or      eax,100          ; 把标志的第九位改为1;0x100转换2进制为00403048     ;100000000b哦(如果后面没有特殊说明,就一概指的是  位向量的第?位,
00403048     ;の..不过MS只有这一处:-)

0040304D    50            push    eax

0040304E    9D            popfd            ; hoho,注意到了吗,上面的有2个pushfd,0040304E    ;这儿却只有1个popfd:原来它是用标志寄存器的指来参与计算的啊!

0040304F    90            nop
00403050    33F6          xor     esi,esi                                ; 连续几个清空寄00403050    ;存器,esi,edi,edx.然后就开始得到正确注册码了

00403052    33FF          xor     edi,edi ;!!此时eax保存着12位长的标志寄存器(第2位被清零)
00403054    33D2          xor     edx,edx

00403056    8B2D 124B4000 mov     ebp,dword ptr ds:[404B12]              ; 用EBP和EDI来调
00403056    ;用参数计算码:这就是直接使用ASM的好处,可以无视程序员的默契:-)
00403056    ;此时ebp=24
0040305C    BF 02454000   mov     edi,aescul.00404502



;important proc:


00403061    55            push    ebp             ;保护ebp,edi,esi值
                                                  ;再看几句后,推断出40313B的call00403062    57            push    edi             ;是个变形的跳转,断开算法防止写注册机
00403063    56            push    esi             ;为什么..参看40308e

00403064    BD C0444000   mov     ebp,aescul.004044C0                    ; 指向算法表=aescul.004044C0 (ASCII "0I5LZ7G123RXCV9OPAS6TBN48YUHJKDF0QWEM")

00403069    BB BA434000   mov     ebx,aescul.004043BA                    ; 是一个根据机器
00403069    ;得到的ASCII "WS76468-OEM-0011903-00578"吧??测试了2个用户名都是一样的..后面就
00403069    ;用机器码代替

0040306E    8A0433        mov     al,byte ptr ds:[ebx+esi]               ; 取机器码字符然后放到al,

00403071    C1F8 04       sar     eax,4                                  ; sar是逻辑右移的简写: 除以16..有用的是AL的值

00403074    83E0 0F       and     eax,0F                                 ; 只留下eax中低于8的位,即只有最后一位的HEX值是有用的.即用的是标志

00403077    E8 BF000000   call    aescul.0040313B;跳转call。换去看403077 的代码!





0040313B    8935 EE444000 mov     dword ptr ds:[4044EE],esi       ; 4044ee保存着处理到了第几个字符
00403141    8B15 EA444000 mov     edx,dword ptr ds:[4044EA]
00403147    8B0D E6444000 mov     ecx,dword ptr ds:[4044E6]       ; 37
0040314D    3BD1          cmp     edx,ecx
0040314F    72 02         jb      short aescul.00403153           ; 如果大于37就直接在算法表取第一个字符0
00403151    33D2          xor     edx,edx
00403153    0FBE7415 00   movsx   esi,byte ptr ss:[ebp+edx]       ; 根据4044ea处来取算法表中的字符
00403158    81E6 0F000080 and     esi,8000000F                    ; 取得的字符与1000000000000000000000000000B and
0040315E    79 05         jns     short aescul.00403165           ; 不溢出就跳走
00403160    4E            dec     esi
00403161    83CE F0       or      esi,FFFFFFF0
00403164    46            inc     esi
00403165    3BF0          cmp     esi,eax                         ; 到这儿esi一定是0或不溢出的时候那个数字;为什么?参考<深入了解计算机第二章>
00403167    74 09         je      short aescul.00403172           ; 看到这儿明白是以eax作为"条件"保存的一个位置的
00403169    42            inc     edx
0040316A    3BD1          cmp     edx,ecx                         ; 比较edx+1后是不是大于最大循环次数[4044e9]=37d
0040316C  ^ 7C E5         jl      short aescul.00403153           ; 否则继续循环寻找合适的.."***"注册码一部分 ??实在是不知道该怎么表述了- -~!
0040316E    33D2          xor     edx,edx                         ; 不然设置edx循环计数器为0,从新寻找一次
00403170  ^ EB E1         jmp     short aescul.00403153           ; jmp?jmp?!jmp?!#%@#%PS:如果没有那个表中刚好没有适合标志寄存器的值,不就无限循环了?望解释..
00403172    8915 EA444000 mov     dword ptr ds:[4044EA],edx
00403178    8B35 EE444000 mov     esi,dword ptr ds:[4044EE]       ; 4044ee一直是个空地址,作者是使用特殊的清空寄存器的
0040317E    0FBE042A      movsx   eax,byte ptr ds:[edx+ebp]       ; 终于得到正确的返回值eax了,是以上面一系列循环后得到edx值在算法表中寻址得到的
00403182    42            inc     edx                             ; 此时edx=为寻找合适数循环次数+1,4044ea=循环次数
00403183    C3            retn


0040307C    8807          mov     byte ptr ds:[edi],al     ;看到这儿清楚404502是个temp地址
0040307E    8A0C33        mov     cl,byte ptr ds:[ebx+esi]
00403081    83E1 0F       and     ecx,0F
00403084    8BC1          mov     eax,ecx  ; 再次取机器码字符然后放到al,不过这次没有右移.
00403084    ;也就是取的是机器码
00403086    E8 B0000000   call    aescul.0040313B


0040308B    8847 01       mov     byte ptr ds:[edi+1],al  把根据机器码得到在字符放到根据标
0040308B    ;志得到的字符的后面



0040308E    5E            pop     esi                     ;e.和上面的push对应哦!
0040308F    5F            pop     edi                     ;还原.ebp,edi,esi
00403090    5D            pop     ebp                     ;然后继续算下一个注册码段


00403091    46            inc     esi
00403092    83C7 02       add     edi,2
00403095    3BEE          cmp     ebp,esi
00403097  ^ 75 C8         jnz     short aescul.00403061                  ; 循环


00403099    33F6          xor     esi,esi
0040309B    8B86 BA424000 mov     eax,dword ptr ds:[esi+4042BA];累死累死了,不写了
004030A1    8B9E 02454000 mov     ebx,dword ptr ds:[esi+404502];是暗码比较的,去内存看看吧
004030A7    3BC3          cmp     eax,ebx
004030A9    75 45         jnz     short aescul.004030F0
004030AB    83C6 04       add     esi,4
004030AE    8B86 BA424000 mov     eax,dword ptr ds:[esi+4042BA]
004030B4    8B9E 02454000 mov     ebx,dword ptr ds:[esi+404502]
004030BA    3BC3          cmp     eax,ebx
004030BC    75 32         jnz     short aescul.004030F0
004030BE    83C6 04       add     esi,4
004030C1    8B86 BA424000 mov     eax,dword ptr ds:[esi+4042BA]
004030C7    8B9E 02454000 mov     ebx,dword ptr ds:[esi+404502]
004030CD    3BC3          cmp     eax,ebx
004030CF    75 1F         jnz     short aescul.004030F0
004030D1    83C6 04       add     esi,4
004030D4    8B86 BA424000 mov     eax,dword ptr ds:[esi+4042BA]
004030DA    8B9E 02454000 mov     ebx,dword ptr ds:[esi+404502]
004030E0    3BC3          cmp     eax,ebx
004030E2    75 0C         jnz     short aescul.004030F0
004030E4    C705 F2444000>mov     dword ptr ds:[4044F2],1
004030EE    EB 0A         jmp     short aescul.004030FA
004030F0    C705 F2444000>mov     dword ptr ds:[4044F2],0
004030FA    9D            popfd      ;到这儿就判断得到返回注册成功与否的flag了,后面的那个004030FA    ;  跳转就是最佳爆破点了。。不过,还得用patch来,因为程序要用原数据解密的
004030FA    ;要爆破,也可以先dump再来 ^_^ (可行与否.小浪我也不知道..)


现在整理思路。。
只说1个码的生产过程,首先根据标志查表取得1个位,再根据机器码查表取得1个位,组合~ole

啊噢...累死了,打字打了2个小时了,分析才分析了10分钟吧.. ; )

现在阿一都觉得自己太啰嗦了:基本上每一行都做了注释......- -

今天(3.09)决定不再寒碜自己了,17大就快要闭幕了,家里网马上也就可以安装了,停止作文我继续学习..

PS:我也很喜欢找破文看,不过就像大部分人说的,不懂汇编就不会crack,起初我看的那叫云里雾里啊,具体的情形是一段100句的代码大概要查几个小时..
恶补asm后,发现和自己的思维方式..の..."很般配"     :-)
而且很多思想用C系列的就可以理解.
其实呢,现在不仅crack甚至大部分涉及ASM的计算机业都不需要非常棒的掌握ASM,只要达到可读就游刃有余了。
于是就诞生了这几篇破破烂烂,萝莉啰唆,JJYY,8899,龙门八卦的..破..文 来让比我晚一个星期的兄弟们在学习思路的时候也同时学习ASM....
再PS:
很多问题我也根本就不清楚实在是因为我根本还没入门嘛~还请大家在看到文章中的错误后回复这破文,以免其他人跟我误入歧途 ..
(其实我也没办法才写的..这几天没有网只有几十个crackme..)
再再PS:极力推荐一本书给师弟们:<深入理解计算机结构>,不认真的读大略知道讲什么就足够一般crack用了,真的可以称为上至天文下至地理的计算机教程.
上传的附件:
2008-3-16 18:55
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
不会写题目..算是破解文章唠 ^_^,非新人则飘
     

请坚持看懂每一个asm指令~
本来是打算不写了,可是小道消息错误,人民大会堂还是没有闭幕,网还是不能好,实在是无聊死...
废话不说,假正文开始   |\:^]

话说,昨天下午(3.13)6:00多,兄弟的儿子回来带着一U盘,急冲冲的要拷东西..
我呆在旁边547(无事情),溜达到厨房。。。
就听的好好滴兄弟在他儿子面前把我扇的是气宇轩昂,网络精英,hacker匪长...

哈哈哈哈哈哈....心花怒放..
正在想怎么来表现自己的大侠风度,侄子就呼我了。。。
o(∩_∩)o...
更灵异的是侄子居然是对crack感兴趣,正在调试 一个软件.
可能是哪篇文章里面的附件,他描述道: 按照流程怎么也搞不成,电脑还重启+死机了好几次(hoho还记得卡巴嘛?)
の...
下面呢,就该我大展身手了!

习惯性的拖入黑匣子,F9准备跑跑.
没想到直接卡死,卡巴这猪...
下一步,peid:某灵异壳,真的素没有见过的说。。
下一步,od......静态分析看代码.... - -...
一连串的kernel32.VirtualAlloc,の..
那就寻找对应的VirtualFree吧
往下翻,看到巨N多的ExitProcess()   看的是胆战心惊...无奈的感慨谍影重重。。

拖到某处了,觉得很,の..反正就是壳出口了
0055FD6F    0348 14       add     ecx,dword ptr ds:[eax+14]
0055FD72    894D CC       mov     dword ptr ss:[ebp-34],ecx
0055FD75    68 00800000   push    8000
0055FD7A    6A 00         push    0
0055FD7C    FF75 FC       push    dword ptr ss:[ebp-4]
0055FD7F    FF15 C0F05500 call    near dword ptr ds:[<&KERNEL32.VirtualFree>]      ; kernel32.VirtualFree
0055FD85    68 00800000   push    8000
0055FD8A    6A 00         push    0
0055FD8C    FF75 EC       push    dword ptr ss:[ebp-14]

0055FD8F    FF15 C0F05500 call    near dword ptr ds:[<&KERNEL32.VirtualFree>]      ; 最后2个kernel32.VirtualFree了

0055FD95    8B45 CC       mov     eax,dword ptr ss:[ebp-34]
0055FD98    5F            pop     edi
0055FD99    5E            pop     esi
0055FD9A    5B            pop     ebx
0055FD9B    83C4 5C       add     esp,5C
0055FD9E    5D            pop     ebp
0055FD9F    50            push    eax
0055FDA0    A1 08F05500   mov     eax,dword ptr ds:[55F008]
0055FDA5    8378 14 00    cmp     dword ptr ds:[eax+14],0
0055FDA9    75 05         jnz     short Program.0055FDB0; 最后的循环,作用应该是修改环境
0055FDAB    58            pop     eax
0055FDAC    33C0          xor     eax,eax
0055FDAE    40            inc     eax
0055FDAF    C3            retn
0055FDB0    58            pop     eax
0055FDB1    FFE0          jmp     near eax  ;出口
0055FDB3    5F            pop     edi
0055FDB4    5E            pop     esi
0055FDB5    5B            pop     ebx
0055FDB6    C9            leave
0055FDB7    C3            retn
呵呵。。不过不能运行找到也没有用,hoho那就重启+换个用户 ^_^
接着F4到0055FDB1,の.
enter
果然,是经典的 V C++
lording..
imtrecing...修改OEP=eax值 (等于多少?卖个无聊的关子:-)
关键时刻嫂子居然招呼要吃饭了..
侄子晚上要出去,这得快点表现啊..
脱壳后还是不能调试,那就静态 - -~
字串符:

进去please input e-mai....
下面是修改后的文件
004469F7    90            nop
004469F8    90            nop
004469F9    90            nop
004469FA    90            nop
004469FB    90            nop
004469FC    90            nop
004469FD    90            nop
004469FE    90            nop
004469FF    90            nop
00446A00    90            nop
00446A01    90            nop
00446A02    90            nop
00446A03    68 40F94B00   push    test111.004BF940                ; @
00446A08    51            push    ecx
00446A09    E8 E44F0400   call    test111.0048B9F2
00446A0E    83C4 08       add     esp,8
00446A11    85C0          test    eax,eax
00446A13    90            nop
00446A14    90            nop
00446A15    90            nop
00446A16    90            nop
00446A17    90            nop
00446A18    90            nop
00446A19    8B4C24 2C     mov     ecx,dword ptr ss:[esp+2C]
00446A1D    2BC1          sub     eax,ecx
00446A1F    3BC7          cmp     eax,edi
00446A21    90            nop
00446A22    90            nop
00446A23    90            nop
00446A24    90            nop
00446A25    90            nop
00446A26    90            nop
00446A27    8379 F4 00    cmp     dword ptr ds:[ecx-C],0
00446A2B    90            nop
00446A2C    90            nop
00446A2D    90            nop
00446A2E    90            nop
00446A2F    90            nop
00446A30    90            nop
00446A31    68 CC9D4B00   push    test111.004B9DCC                ; .
00446A36    51            push    ecx
00446A37    E8 B64F0400   call    test111.0048B9F2
00446A3C    83C4 08       add     esp,8
00446A3F    85C0          test    eax,eax
00446A41    90            nop
00446A42    90            nop
00446A43    90            nop
00446A44    90            nop
00446A45    90            nop
00446A46    90            nop
00446A47    2B4424 2C     sub     eax,dword ptr ss:[esp+2C]
00446A4B    3BC7          cmp     eax,edi
00446A4D    90            nop
00446A4E    90            nop
00446A4F    90            nop
00446A50    90            nop
00446A51    90            nop
00446A52    90            nop
00446A53    56            push    esi
00446A54    6A 00         push    0
00446A56    8D4D 70       lea     ecx,dword ptr ss:[ebp+70]
00446A59    E8 EB6D0500   call    test111.0049D849
00446A5E    6A 00         push    0
00446A60    8D8D 04010000 lea     ecx,dword ptr ss:[ebp+104]

进去register:
下面呢,也是修改后的:
00446E69    83FF 02       cmp     edi,2
00446E6C    75 06         jnz     short dumped_.00446E74
00446E6E    837D F4 01    cmp     dword ptr ss:[ebp-C],1
00446E72    74 68         je      short dumped_.00446EDC
00446E74    A1 986D4D00   mov     eax,dword ptr ds:[4D6D98]
00446E79    8378 F4 00    cmp     dword ptr ds:[eax-C],0
00446E7D    90            nop
00446E7E    90            nop
00446E7F    68 40F94B00   push    dumped_.004BF940                ; @
00446E84    50            push    eax
00446E85    E8 684B0400   call    dumped_.0048B9F2
00446E8A    83C4 08       add     esp,8
00446E8D    85C0          test    eax,eax
00446E8F    90            nop
00446E90    90            nop
00446E91    8B0D 986D4D00 mov     ecx,dword ptr ds:[4D6D98]
00446E97    2BC1          sub     eax,ecx
00446E99    83F8 FF       cmp     eax,-1
00446E9C    90            nop
00446E9D    90            nop
00446E9E    51            push    ecx
00446E9F    68 3E040000   push    43E
00446EA4    8BCE          mov     ecx,esi
00446EA6    E8 6F680500   call    dumped_.0049D71A
00446EAB    8BC8          mov     ecx,eax
00446EAD    E8 1D690500   call    dumped_.0049D7CF
00446EB2    8B16          mov     edx,dword ptr ds:[esi]
00446EB4    6A 01         push    1
00446EB6    8BCE          mov     ecx,esi
00446EB8    FF92 58010000 call    near dword ptr ds:[edx+158]
00446EBE    EB 1C         jmp     short dumped_.00446EDC
00446EC0    6A 10         push    10
00446EC2    68 00904B00   push    dumped_.004B9000                ; seo elite
00446EC7    68 08F84B00   push    dumped_.004BF808                ; seo elite's licence server is currently down... please try again later
00446ECC    8BCE          mov     ecx,esi
00446ECE    E8 357E0500   call    dumped_.0049ED08
00446ED3    6A 02         push    2
00446ED5    8BCE          mov     ecx,esi
00446ED7    E8 005F0500   call    dumped_.0049CDDC
00446EDC    68 04F84B00   push    dumped_.004BF804                ; n
00446EE1    55            push    ebp
00446EE2    E8 A6320400   call    dumped_.0048A18D
00446EE7    83C4 08       add     esp,8
00446EEA    85C0          test    eax,eax
00446EEC    EB 22         jmp     short dumped_.00446F10
00446EEE    6A 10         push    10
00446EF0    68 00904B00   push    dumped_.004B9000                ; seo elite
00446EF5    68 A8F74B00   push    dumped_.004BF7A8                ; this email is not registered in our database. please check your spelling, and try again...
00446EFA    8BCE          mov     ecx,esi
00446EFC    E8 077E0500   call    dumped_.0049ED08
00446F01    68 06914B00   push    dumped_.004B9106
00446F06    B9 986D4D00   mov     ecx,dumped_.004D6D98
00446F0B    E8 D0ACFBFF   call    dumped_.00401BE0
00446F10    68 5CF54B00   push    dumped_.004BF55C                ; c
00446F15    55            push    ebp
00446F16    E8 72320400   call    dumped_.0048A18D
00446F1B    83C4 08       add     esp,8
00446F1E    85C0          test    eax,eax
00446F20    EB 1C         jmp     short dumped_.00446F3E
00446F22    6A 10         push    10
00446F24    68 00904B00   push    dumped_.004B9000                ; seo elite
00446F29    68 58F74B00   push    dumped_.004BF758                ; your account is no longer permitted to use the full version of seo elite.
00446F2E    8BCE          mov     ecx,esi
00446F30    E8 D37D0500   call    dumped_.0049ED08
00446F35    6A 03         push    3
00446F37    8BCE          mov     ecx,esi
00446F39    E8 9E5E0500   call    dumped_.0049CDDC
00446F3E    68 60F54B00   push    dumped_.004BF560                ; d
00446F43    55            push    ebp
00446F44    E8 44320400   call    dumped_.0048A18D
00446F49    83C4 08       add     esp,8
00446F4C    85C0          test    eax,eax
00446F4E    EB 1C         jmp     short dumped_.00446F6C
00446F50    6A 10         push    10
00446F52    68 00904B00   push    dumped_.004B9000                ; seo elite
00446F57    68 C8F64B00   push    dumped_.004BF6C8                ; this product has already been licensed on another machine.\nif you own a licence, please contact our support team to help unlock the software.
00446F5C    8BCE          mov     ecx,esi
00446F5E    E8 A57D0500   call    dumped_.0049ED08

非常快速的修改完毕nop...
虽然还是需要输入邮箱但随便输就可以,静态分析2分钟,这样算是可以的了..の..表演收工..
效率把我那侄子惊讶的......

现在呢,正文开始!  ^_^

很奇怪的,在最后2个VirtualFree周围,会出现3个进程!推测,virtual***函数会创建1个新进程来工作???

不能上网没法查资料,
恰好壳程序可以跟踪,
那就..
试着过了几个VirtualAlloce,发现进程还是1个.
换对象,VirtualFree:莫名其妙的进程数,2,3,4,5,6各种可能全部都出现了....
恼了,enter(我确实是用的enter来看代码的)进去,发现VirtualFree最后调用的IDT,那么。。这.不应该啊!
怎么会出现这么多进程?试着重启+F4到VirtualFree前面,进程又多了..
看来不是Virtual***函数的问题, 思考,VirtualFree其间调用的系统R0阶来调用IDT的,无法跟踪,于是怀疑
R0有问题,再想这几天的卡巴问题,应该是被卡巴hook了!本来在运行到卡巴的hook代码处时候卡巴会截取
+处理然后继续运行,但是我把卡巴删除,virtual***在处理的过程中,被中断无法继续,我重启程序,开的是另
外一个procss,接着呢,就出现了N多进程の.
还有一种可能是这个壳有一些anti或者写入code的流程需要creatProcess,openProcess来获得句柄,但是我中断的时候还没有closehandle,同时这的OD只能中断1次就卡死,必须重启程序才可以下一次中断.于是。。运行的process就不会被关闭了.

PS:灵异的卡巴,看来重新安装系统是必要的了。。
再PS:侄子现在对我是顶礼膜拜,这种小事情也不用我高抬贵手了 ^_^~~

最后郑重的PS:现在才发现我的文笔实在是次,其实呢,我是总想写点什么来帮帮比我晚的兄弟入门的,可真正的无奈的写后,才发现想要传达的简单cracker思路和方法却还是没有凸显出来.也许吧,是因为我自己实在是太菜,对很多东西理解不清楚造成的....
明天网就好,还是忐忑不安的发了这一溜破烂吧...~.~

附件大小限制,只上传了原程序
上传的附件:
2008-3-16 18:57
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
?????,非新人则飘
     

请坚持看懂每一个asm指令~
F9运行直接进程结束,の...
F4到构建窗口代码处亦一样,于是怀疑程序有anti-debug.
一路跟踪顺利到达比较算法处,发现注册码被带到某dll  do somethings
仔细观察发现周围没有异样代码,只有3个call到dll中的不明位置,接着把dll亦拖入黑房子..


100060AC    6A 05         push    5
100060AE    EB 02         jmp     short 100060B2
100060B0    6A 01         push    1
100060B2    E8 89B1FFFF   call    10001240                                         ; 一路F8在这个call发现地址开始有大的变动.那就进去


10001303    8D42 FF       lea     eax,dword ptr ds:[edx-1]                         ; !!!下面一连串的异常错误...确定就是这个call了
10001306    83F8 16       cmp     eax,16
10001309    0F87 BA000000 ja      100013C9
1000130F    FF2485 D01300>jmp     near dword ptr ds:[eax*4+100013D0]
10001316    68 50C90010   push    1000C950                                         ; ASCII "Number base too big for representation
"
1000131B    E9 A1000000   jmp     100013C1
10001320    68 34C90010   push    1000C934                                         ; ASCII "Division by zero attempted
"
10001325    E9 97000000   jmp     100013C1
1000132A    68 18C90010   push    1000C918                                         ; ASCII "Overflow - Number too big
"
1000132F    E9 8D000000   jmp     100013C1
10001334    68 F8C80010   push    1000C8F8                                         ; ASCII "Internal result is negative
"
10001339    E9 83000000   jmp     100013C1
1000133E    68 E4C80010   push    1000C8E4                                         ; ASCII "Input format error
"
10001343    EB 7C         jmp     short 100013C1
10001345    68 CCC80010   push    1000C8CC                                         ; ASCII "Illegal number base
"
1000134A    EB 75         jmp     short 100013C1
1000134C    68 B0C80010   push    1000C8B0                                         ; ASCII "Illegal parameter usage
"
10001351    EB 6E         jmp     short 100013C1
10001353    68 A0C80010   push    1000C8A0                                         ; ASCII "Out of space
"
10001358    EB 67         jmp     short 100013C1
1000135A    68 80C80010   push    1000C880                                         ; ASCII "Even root of a negative number
"
1000135F    EB 60         jmp     short 100013C1
10001361    68 5CC80010   push    1000C85C                                         ; ASCII "Raising integer to negative power
"
10001366    EB 59         jmp     short 100013C1
10001368    68 3CC80010   push    1000C83C                                         ; ASCII "Attempt to take illegal root
"
1000136D    EB 52         jmp     short 100013C1
1000136F    68 0CC80010   push    1000C80C                                         ; ASCII "Integer operation attempted on Flash number
"
10001374    EB 4B         jmp     short 100013C1
10001376    68 FCC70010   push    1000C7FC                                         ; ASCII "Flash overflow
"
1000137B    EB 44         jmp     short 100013C1
1000137D    68 E8C70010   push    1000C7E8                                         ; ASCII "Numbers too big
"
10001382    EB 3D         jmp     short 100013C1
10001384    68 C8C70010   push    1000C7C8                                         ; ASCII "Log of a non-positive number
"
10001389    EB 36         jmp     short 100013C1
1000138B    68 A0C70010   push    1000C7A0                                         ; ASCII "Double to flash conversation failure
"
10001390    EB 2F         jmp     short 100013C1
10001392    68 88C70010   push    1000C788                                         ; ASCII "I/O buffer overflow
"
10001397    EB 28         jmp     short 100013C1
10001399    68 58C70010   push    1000C758                                         ; ASCII "MIRACL not initialised - no call to mirsys()
"
1000139E    EB 21         jmp     short 100013C1
100013A0    68 2CC70010   push    1000C72C                                         ; ASCII "Illegal Montgomery modulus (must be odd)
"
100013A5    EB 1A         jmp     short 100013C1
100013A7    68 0CC70010   push    1000C70C                                         ; ASCII "No Montgomery modulus defined
"
100013AC    EB 13         jmp     short 100013C1
100013AE    68 F8C60010   push    1000C6F8                                         ; ASCII "Exponent too big
"
100013B3    EB 0C         jmp     short 100013C1
100013B5    68 D8C60010   push    1000C6D8                                         ; ASCII "Number Base must be power of 2
"
100013BA    EB 05         jmp     short 100013C1
100013BC    68 A4C60010   push    1000C6A4                                         ; ASCII "Specified double length type isn't double length
"
100013C1    E8 6A000000   call    10001430
100013C6    83C4 04       add     esp,4
100013C9    6A 00         push    0
100013CB    E8 67580000   call    10006C37


把100060B2的call nop这个dll的全部保护就成空架子了。。

(它对断点检测的很厉害,一直用的硬件断,如果在其他机子出现问题,44硬件断点也许就可以了,不过在dll里面没有修改前一定不能在dll用断点,F8都很危险,F7还可以发现什么时候AG的)

crackme的说明要求初始化的时候弹出*****框,程序中的important可以使用,那就爆破吧,搞定算法亦可以.
程序code比较明晰,(asm写的?)直接看代码,发现MessageBoxA,の。。
略略一看知道程序未判断注册码的时候默认弹出

----------------------------
| You have potenti   |
| al, go ahead :DD  |
----------------------------

不是正确的注册码就一位一位的清楚这些字符,(看着他跳一下,一个字符没有了,那种心情啊.)
这个处理也是在dll中完成的
这儿的3个call就是判断+处理了,现在已经知道
00401087  |.  FF15 B04040>call    near dword ptr ds:[4040B0] ;判断
0040108D  |.  E8 90000000 call    Crackme2.00401122
00401092  |.  E8 CE000000 call    Crackme2.00401165 ;处理消息框
00401097  |.  C605 C54240>mov     byte ptr ds:[4042C5],1
[code]
以一种第9感推测,40108d是负责改写属性,
の..好运道,莫名其妙的想出程序的流程了:
首先用经典的方法读取s2License.key 9个字节(可能是比文件多1个字节),然后在crap0.dll里做一系列事情;),这块儿的代码96%是用来anti-debug的,接下来再进另一刑场,由得到的注册码来设置标志,接下来就是根据标志修改属性.万事俱备后则瞬间闪现程序的主窗口.
但程序未必是如此一溜儿小跑的!这只是推测..

确定大概流程后就容易点了,略略分析后知道
[code]
00401087  |.  FF15 B04040>call    near dword ptr ds:[4040B0] ;call到最前面就设置好的what_the函数(anti)顺便设置注册码的第一位09
0040108D  |.  E8 90000000 call    Crackme2.00401122;处理得到的9个字符使第二位开始的小于8位?(这儿是推测)
00401092  |.  E8 CE000000 call    Crackme2.00401165 ;根据注册码来做某事



我们的破解思路也就有了:
00401087的call修改dll则可,或者只用H*也可以
0040108D 是处理字符的,无关紧要
00401092则很重要了,看看这程序对DLL检测也那么严格,这儿估计更严,那就不爆破直接破解吧
00401165  /$  56          push    esi
00401166  |.  57          push    edi
00401167  |.  BE C0404000 mov     esi,Crackme2.004040C0
0040116C  |.  BF 31354000 mov     edi,Crackme2.00403531
00401171      AC          /lods    byte ptr ds:[esi]                               ;  前面那call算出来的注册码后7位若不是"2c"则对后面的一个标志做某事  - -
00401172      3C 2C       |cmp     al,2C
00401174      74 03       je      short Crackme2.00401179
00401176      AA          |stos    byte ptr es:[edi]
00401177  |.^ EB F8       \jmp     short Crackme2.00401171
00401179  |>  BF 4B354000 mov     edi,Crackme2.0040354B
0040117E  |>  AC          /lods    byte ptr ds:[esi]
0040117F  |.  3C 2C       |cmp     al,2C
00401181  |.  74 03       |je      short Crackme2.00401186
00401183  |.  AA          |stos    byte ptr es:[edi]
00401184  |.^ EB F8       \jmp     short Crackme2.0040117E                         ;  第一关:important   判断后7位字符是否0c开头,
00401186  |>  BF 54354000 mov     edi,Crackme2.00403554
0040118B  |>  AC          /lods    byte ptr ds:[esi]
0040118C  |.  3C 24       |cmp     al,24
0040118E  |.  74 03       |je      short Crackme2.00401193
00401190  |.  AA          |stos    byte ptr es:[edi]
00401191  |.^ EB F8       \jmp     short Crackme2.0040118B                         ;  第二关,message  判断后4位字符是否24开头
00401193  |>  5F          pop     edi
00401194  |.  5E          pop     esi
00401195  \.  C3          retn


最后得到可以使用的注册文件,

s2License.key
内容:
,,,,,$$$$

の..
这篇是根据note润色弄出来的,一定没有前面那些啰嗦,不过只是给一个思路(不一定要修改原程序)而已^_^~
AG~
上传的附件:
2008-3-16 18:59
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
***???,非新人则飘
     

请坚持看懂每一个asm指令~
坚持看懂每一个asm指令~
直接拖进黑匣子,随便选几个然后check.
暗黑(の。。是然后,这几天暗黑把我玩晕了)
Your registration info is invalid... Please support shareware authors by buying software!
我晕,这CRACKME还真会开玩笑..
看看入口知道是可敬可爱的ASM写的..^_^
一路小跑来到某地:(可以看看它离401000入口有多近)
00401162    A1 62214000   mov     eax,dword ptr ds:[402162]
00401167    6BC0 4D       imul    eax,eax,4D
0040116A    3D 6654F300   cmp     eax,0F35466
0040116F    75 20         jnz     short due-cm3.00401191
00401171    68 00200000   push    2000
00401176    68 01204000   push    due-cm3.00402001                                 ; ASCII "Duelist's Crackme #3"
0040117B    68 17204000   push    due-cm3.00402017                                 ; ASCII "Congratulations! Please send a screenshot of your solution to duelist@beer.com!"
00401180    6A 00         push    0
00401182    E8 55010000   call    <jmp.&USER32.MessageBoxA>
00401187    B8 01000000   mov     eax,1
0040118C  ^ E9 69FFFFFF   jmp     due-cm3.004010FA
00401191    68 00200000   push    2000
00401196    68 01204000   push    due-cm3.00402001                                 ; ASCII "Duelist's Crackme #3"
0040119B    68 68204000   push    due-cm3.00402068                                 ; ASCII "Your registration info is invalid... Please support shareware authors by buying software!"
004011A0    6A 00         push    0
004011A2    E8 35010000   call    <jmp.&USER32.MessageBoxA>

发现是这样判断
if(result*result*4d=0F35466?1:0)
printf("Congratulations! Please send a screenshot of your solution to duelist@beer.com");
else
printf("Your registration info is invalid... Please support shareware authors by buying software!");
の.
那就分析这个result是怎么来到的吧
在00401162查找参考对象(就是查找本领空调用这行的代码的地址。。晕晕乎乎了....)
(为什么在这儿查找是因为发现上面是个循环,最后一个JMP的目标在老前面,这是一种.の..第9感吧?^_^)
得到
参考位于 due-cm3:CODE 到 00401162,项目 0
地址=00401131
反汇编=je      short due-cm3.00401162
果然,附近就是算法循环

顺便把周围的也分析了:
00401117    33F6          xor     esi,esi
00401119    33D2          xor     edx,edx
0040111B    8935 5E214000 mov     dword ptr ds:[40215E],esi                        ; 清除temp
00401121    8935 62214000 mov     dword ptr ds:[402162],esi                        ; 清除temp
00401127    0FBE8E FE2040>movsx   ecx,byte ptr ds:[esi+4020FE]                     ; 从这儿可以看出4020fe是buffer,
0040112E    83F9 4D       cmp     ecx,4D                                           ; buffer中是把每个框都按照某个数字记录,最后用一个4d结尾.
00401131    74 2F         je      short due-cm3.00401162                           ; 到4d了就完工
00401133    890D 5E214000 mov     dword ptr ds:[40215E],ecx                        ; 把框值放到40215e
00401139    51            push    ecx
0040113A    FF75 08       push    dword ptr ss:[ebp+8]
0040113D    E8 D0010000   call    <jmp.&USER32.IsDlgButtonChecked>                 ; 这个API判断是不是选择了框,是则返回eax=0
00401142    46            inc     esi                                              ; API里面是是调用GetDlgItem来获得信息,SeedMessage来返回消息
00401143    83F8 00       cmp     eax,0                                            ; 其中2个API中的esi都是子函数保护寄存器,因此esi值等于进去前的esi,确定它是个循环标志
00401146  ^ 74 DF         je      short due-cm3.00401127                           ; 到这儿可以推测出算法,只有选择了某框之后,这个框代表的值才会参与下面的算法add到402162
00401148    A1 5E214000   mov     eax,dword ptr ds:[40215E]                        ; 最后得到的result,result*result*4d=0F35466则OK
0040114D    0FBE8E FE2040>movsx   ecx,byte ptr ds:[esi+4020FE]
00401154    0FAFC1        imul    eax,ecx
00401157    0FAFC6        imul    eax,esi
0040115A    0105 62214000 add     dword ptr ds:[402162],eax                        ; 这个框的值乘以下个框的值,再乘以下个框的ID(怎么说啊,反正就是这个意思),add到402162
00401160  ^ EB C5         jmp     short due-cm3.00401127
00401162    A1 62214000   mov     eax,dword ptr ds:[402162]
00401167    6BC0 4D       imul    eax,eax,4D
0040116A    3D 6654F300   cmp     eax,0F35466
0040116F    75 20         jnz     short due-cm3.00401191
00401171    68 00200000   push    2000
00401176    68 01204000   push    due-cm3.00402001                                 ; ASCII "Duelist's Crackme #3"
0040117B    68 17204000   push    due-cm3.00402017                                 ; ASCII "Congratulations! Please send a screenshot of your solution to duelist@beer.com!"
00401180    6A 00         push    0
00401182    E8 55010000   call    <jmp.&USER32.MessageBoxA>
00401187    B8 01000000   mov     eax,1
0040118C  ^ E9 69FFFFFF   jmp     due-cm3.004010FA
00401191    68 00200000   push    2000
00401196    68 01204000   push    due-cm3.00402001                                 ; ASCII "Duelist's Crackme #3"
0040119B    68 68204000   push    due-cm3.00402068                                 ; ASCII "Your registration info is invalid... Please support shareware authors by buying software!"
004011A0    6A 00         push    0
004011A2    E8 35010000   call    <jmp.&USER32.MessageBoxA>
004011A7    B8 00000000   mov     eax,0
004011AC  ^ E9 49FFFFFF   jmp     due-cm3.004010FA
004011B1    837D 10 01    cmp     dword ptr ss:[ebp+10],1                          ; 判断按钮
004011B5  ^ 0F84 5CFFFFFF je      due-cm3.00401117                                 ; ID=1即check则跳到前面判断
004011BB    837D 10 02    cmp     dword ptr ss:[ebp+10],2                          ; 按钮ID=2即close则exitprocess
004011BF    75 0F         jnz     short due-cm3.004011D0                           ; 不等则继续进入user32.dll继续等待用户输入
004011C1    E8 74000000   call    <jmp.&KERNEL32.ExitProcess>
004011C6    B8 01000000   mov     eax,1
004011CB  ^ E9 2AFFFFFF   jmp     due-cm3.004010FA
004011D0    B8 00000000   mov     eax,0

到4020fe把它的框值复制过来了
int table[18]={16,49,5E,15,27,26 ,21, 25, 1D ,59 ,53 ,37 ,31, 48 ,5D, 0C,  61 ,52, 4D}                                 

程序流程是
if (i=0;table[i]!=4d;i++)
    if (!IsDlgButtonChecked)
       buffer=buffer+table[i]*table[i+1]*i;
if(result*result*4d=0F35466?1:0)
printf("Congratulations! Please send a screenshot of your solution to duelist@beer.com");
else
printf("Your registration info is invalid... Please support shareware authors by buying software!");

这样稍稍计算就可以得到正确的框...答案就卖个关子,自己算方程式吧:-)
爆破点也很容易就找到了0040116F    75 20         jnz     short due-cm3.00401191

ps:我爱死ASM 了..

再PS:C中的幂怎么表述?不是^嘛?
是,那异或呢?
这种小问题突然想起来就赶紧记下来,不然一会儿不小心忘了就不好了。           |/:^]
上传的附件:
2008-3-16 19:00
0
雪    币: 209
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
实在是帅呆了
2008-3-16 20:07
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
真强人也!!
2008-3-17 09:49
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
文章很好,机器不好
2008-3-17 16:06
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
..
不好意思..
忘记贴一个小tip:
具体是这样的
我这菜鸟在演示追注册码的时候,找到个算码的地方,发现这个地方每个码都会算完马上比较,就告诉侄子写个脚步把这儿的所有[eax+edx]记录就可以了,2:00出去晚上回来发现他写了一下午脚本还是没有成功运行^_^
就想了个小,の..反正是很弱智的方法的了
在这个地址下条件断点,无条件记录所有的ds:[eax+edx]..
呵呵
2008-3-18 00:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gwh
13
我是新人,飘到Lz的地盘,长了很多知识,谢了
2008-4-14 23:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
咋这么长,还是看不懂
2008-4-15 00:15
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
实在太强大了,收下来慢慢看!
2008-7-14 23:11
0
雪    币: 32
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
非常感谢,收下慢慢看
2008-7-15 13:34
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
很不错,很强大,就是文字太多了
2009-5-15 11:26
0
雪    币: 286
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
新人飘入,学习了.
2012-2-20 10:56
0
游客
登录 | 注册 方可回帖
返回
//