科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道一步一步教你加密解密技术——静态分析技术

一步一步教你加密解密技术——静态分析技术

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

W32Dasm是一个强大的反汇编工具,操作简单,使用方便。通常被程序员使用,当然也可被用来Crack软件了,很适合Cracker使用。

作者:看雪 来源:看雪 2008年10月16日

关键字: 静态分析技术 加密解密

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

  第三节 IDA Pro简介

  开始前

  IDA Pro Avanced是一个极好的反汇编工具,它大的胜过了w32dasm。近来它的盗版已经在网上传播开了,你可以很轻松得到它。对于这方面的观点有如下几种:一些人认为这是好的,是自由的;而另一些人认为是可耻的,那些认为是可耻的人通常是这个软件的老用户,事实上他们买了那个程序,如果你花了$500买了那个程序的话,你就可以理解他们的反应了。 对于读者来说,你们做什么不是我的问题及我所关心的。而我的观点是如果认为非法的winzip软件同IDA Pro 4.0x一样好或坏。如果你使用非法的winzip,你就不应当使用非法的IDA Pro。

  I 介绍 几天前我烈军属了一篇关于解密程序的教程,而这篇也是一个对于高效的,极好的IDA Pro 4.0x教程。通常菜鸟不喜欢,而高手又崇拜它。不喜欢的原因是因为IDA相对于w32dasm来说有更多的附加功能和作用,有更大的复杂性

  在下面的教程中由于你过去可能喜欢使用w32dasm,我将尽力给出一个简单和清楚的解释来介绍如何使用IDA。也将试差回答"什么是最好的反汇编?"这里其实没有一个简单的回答。对于更多的高手来说可以读这个:向菜鸟100%解释IDA的使用过程。

  II. IDA: 一个高效的反汇编工具

  当你运行IDA Pro时,你所最先注意到的是它的界面比w32dasm更加专业,这里比w32dasm有更多的选项或更先进的地方。它的优点是可以更好的反汇编和更有深层分析。而缺点是使用IDA更困难。

  实际上IDA同w32dasm有很多相同的功能:可以快速到达指定的代码位置;可以看到跳到指定的位置的jmp的命令位置;可以看参考字符串;可以保存静态汇编等。

  现在让我们运行和反汇编一个小程序(我使用starclean.exe)一个窗口弹出来,那里有很多选项,不要动它,仅仅点击OK。让IDA来分析,当它结束后在name的选项中同w32dasm中参考字符串一样,查找"a"字符。在name窗口中搜索栏中按a,然后开始查找,一旦找到,按enter或双击它,它就将到达正确的位置。按ctrl+enter将到达下一个位置。参考字符串就在光标附近。IDA就可以到达相应的位置了。

  另一个同w32dasm相同的:jmp和call参考在IDA也是有效的。在w32dasm反汇编的代码同IDA中相同的。

  代码开始(w32dasm)

  *

  Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B50(C)

  | :00403B5F 81FAFC000000 cmp edx, 000000FC :00403B65 0F8478010000 je 00403CE3

  :00403B6B 8D8424B4000000 lea eax, dword ptr [esp+000000B4] :00403B72 6804010000

  push 00000104 :00403B77 50 push eax * Reference To: KERNEL32.GetModuleFileNameA,

  Ord:00E9h | :00403B78 8B2D88924000 mov ebp, dword ptr [00409288] :00403B7E 6A00

  push 00000000 :00403B80 FFD5 call ebp :00403B82 85C0 test eax, eax :00403B84 7516

  jne 00403B9C * Possible StringData Ref from Data Obj ->""

  | :00403B86 BE206A4000 mov esi, 00406A20 :00403B8B 8DBC24B4000000 lea edi, dword

  ptr [esp+000000B4] :00403B92 B905000000 mov ecx, 00000005 :00403B97 F3 repz :00403B98

  A5 movsd :00403B99 66A5 movsw :00403B9B A4 movsb结束结束

  代码开始(IDA Pro 4.0x)

  00403B5F

  loc_403B5F: ;CODE XREF: sub_403B00+50j 00403B5F cmp edx, 0FCh 00403B65 jz loc_403CE3

  00403B6B lea eax, [esp+1B8h+var_104] 00403B72 push 104h 00403B77 push eax 00403B78

  mov ebp, ds:GetModuleFileNameA 00403B7E push 0 00403B80 call ebp ;GetModuleFileNameA

  00403B82 test eax, eax 00403B84 jnz short loc_403B9C 00403B86 mov esi, offset

  aProgramNameUnk ;"<program name unknown>" 00403B8B lea edi, [esp+1B8h+var_104]

  00403B92 mov ecx, 5 00403B97 repe movsd 00403B99 movsw 00403B9B movsb 代码结束

  你在这里看到,IDA提供了更多的细节信息,它是更加清楚,用一个参考作为例子。

  在w32dasm中如下:

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:

  |:00403B50(C)

  在IDA Pro中如下:

  CODE XREF: sub_403B00+50j

  IDA provides 使用更短的行来提供更多的信息。

  1. 用一个jump (j)

  2. jump到代码的位置位于00403B50 (=403B00+50)

  3. 函数/call本身在403B00(403B00+50)

  4. jump在.code section

  如果参考的是一个call那么它将如下:

  CODE XREF: sub_403B00+50p

  另一个大的优点是IDA可以转换变量。你可以双击变量以找到它们保存的地址处: lea edi, [esp+1B8h+var_104]。

  功能中最有用的之一是使用近似查找。很容易解释:IDA尽力记住寄存器所关联的库函数。如下:

  代码开始 (IDA Pro)

  004012D2

  loc_4012D2: ;CODE XREF: sub_401280+5Fj 004012D2 movsx ecx, byte ptr [eax] 004012D5

  push eax 004012D6 lea ebp, [ebp+ecx*2+0] 004012DA call edi ;CharNextA ;Return

  a pointer to the next character in a

  ;string 004012DC cmp byte ptr [eax],

  0 004012DF jnz short loc_4012D2 代码结束

  代码开始(w32dasm)

  *

  Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004012DF(C)

  | :004012D2 0FBE08 movsx ecx, byte ptr [eax] :004012D5 50 push eax :004012D6 8D6C4D00

  lea ebp, dword ptr [ebp+2*ecx] :004012DA FFD7 call edi :004012DC 803800 cmp byte

  ptr [eax], 00 :004012DF 75F1 jne 004012D2代码结束

  你注意到它们的不同了吗?IDA将向解释每一件事情。

  在IDA中另一个同w32dasm近似的是十分简单的,如:"Goto code location" 等同于在IDA"Jump - Jump to adress" . 或者 "Goto entrypoint" 等同于在IDA"Jump - Jump to entry point" .

  那些就是在你了解IDA开始使用它前最为重要的东西。有时 ,IDA显示大量的"db",参考字符串,仅有代码。仅仅可以设好光标,按"c"键,IDA转换代码如下

  开始 (在按'C'之前)

  00401228

  dd offset unk_406130 0040122C db 8Bh ;?0040122D db 35h ;5 0040122E dd offset

  RegSetValueExA 00401232 db 6Ah ;j 00401233 db 1 ;00401234 db 6Ah ;j 00401235

  db 0 ;00401236 db 68h ;h 00401237 dd offset aName ;"Name" 0040123B db 51h ;

  Q 0040123C db 0FFh ;0040123D db 0D6h ;?0040123E db 8Bh ;?0040123F db 4Ch ;

  L 00401240 db 24h ;$ 00401241 db 8 ;00401242 db 68h ;h 代码结束

  开始 (在按'C'之前)

  0040122C

  mov esi, ds:RegSetValueExA 00401232 ;---------------------------------------------------------------------------

  00401232 push 1 00401234 push 0 00401236 push offset aName ;"Name" 0040123B ;

  --------------------------------------------------------------------------- 0040123B

  push ecx 0040123C call esi ;RegSetValueExA 0040123E mov ecx, [esp+8] 00401242

  push 100h 00401247 push offset unk_406030 0040124C ;---------------------------------------------------------------------------

  0040124C push 1 0040124E push 0 00401250 push offset aCode ;"Code" 00401255 ;

  --------------------------------------------------------------------------- 00401255

  push ecx 00401256 call esi ;RegSetValueExA 00401258 mov eax, [esp+8] 0040125C

  push eax 0040125D call ds:RegCloseKey 代码结束

  IDA另一个优点(快速相加):

  1. 能够对w32dasm无法反汇编的最难的软件进行反汇编(如加壳程序)

  2. 能够以.asm .sym 和甚至是 .exe及其它文件形式保存

  3. 压缩的静态汇编,可以节省大量的磁盘空间。

  4. 可以重命名函数

  5. 能够分析巨大的程序

  等等.... ;-)

  III. w32dasm??

  你看完了后你现在可以自问"如果IDA这么好看,为什么我还要使用w32dasm?"下面就是对于这个的解释:

  首先是速度,对于IDA来分析一个小程序是非常非常的快,但是如果分析一个大的exe它就要花费3个小时或更多的时间来全面分析exe。

  其次,如果你对于一个指定的搜索,IDA将很慢的,而在w32dasm中在文本方面中搜索是很快的。

  第三:当分析一个仅有简单的保护的程序时,w32dasm就为首选。因为你就不需要在IDA那些附加的功能了。

  上面的三个因素可以说明一切了 :-) 如果你知道其它的使用w32dasm原因的话,请告诉我。

  IV. 结束

  又一个教程结束了。享受IDA and w32dasm以及所有.....享受研究和保持学习和继续研究和破解吧。不是为了解密,仅是文章,写下你的文章,传播你的知识。对于解密这是重要的来说。不要用于解密吧。

  第四节 HIEW简介

  一、Hiew的运行

  在Hiew目录找到Hiew.exe,运行它,这时Hiew界面出现的是Hiew目录文件。

  此时在屏幕底部的命令行有相关提示,对应的是功能键F(n),如按F1出现的帮助:

  F2 - Hidden - 打开或关闭隐藏文件显示

  F3 - Name - 按文件排序

  F4 - Exten - 按扩展名排序

  F5 - Time - 按文件时间排序

  F6 - Size - 按文件大小排序

  F7 - Unsort - 未分类排序

  F8 - Revers - 反转排序

  F9 - Files - 查看曾打开的文件历史

  F10 - Filter - 设置过滤

  Ctrl \ - 来到驱动器的根目录

  Ctrl PgUp - 回到上一目录

  Insert - 打开/创建文件

  Alt-F1 - 选择驱动器

  Al-tF2 - 选择驱动器

  Alt-F4 - 重新读取目录文件

  Ctrl-F(n) - 将当前目录路径保存

  Ctrl-F(n+1) - 回到保存的目录中

  回车键 - 可进入子目录或从子目录退出

  二、Hiew的基本操作

  1、参考上表操作打开你需要修改的文件。

  2、此时按F1,屏幕又会出现相关的帮助信息。(在此略)

  3、打开文件后,观察屏幕底部的4 (Mode),此时按F4,将出现一对话框,让你选择Text(文本), Hex(十六进制)Decode(反汇编)模式。

  4、此时你可跟据需要选择相关的模式。在这我们以Decode(反汇编)模式为例,在此模式下,将出现汇编代码,你可修改这些代码。现在按 F3 (Edit)将进入编辑模式,按F5 (Goto)将跳到指定的地址(注:是偏移地址,具体请参考上一节W32Dasm的相关描述),按F7 (Search)是查找ASCII码或十六进制数据。

  5、F3 (Edit)将进入编辑模式后,移动光标到相应的行,按F2回车键,跳出一对话框,可修改汇编代码。修改好后,F9存盘(按回车后到下一行,再按ESC让对话框消失,然后按F9)。

  第五节 拆解教程

  破解工具:W32Dasm,Hiew;

  1、思路提示:首先要试运行要破解的程序,了解其一些提示信息,如:文本/NAG屏/按钮等等.最重要的就是出错信息 .如: "Wrong serial.."记下,因为你在后面要用到它,你需要它来找到call出错messagebox的地方.当 W32Dasm反编译后你会看到一屏幕难懂的汇编码 .你还记得刚要你记下的那个message么? 此时单击在工具栏里的串式数据参考SDR (=String Data Reference).这个功能可是非常有用的.

  在串式数据参考SDR中找到那个提示信息(它也许只显示了信息的一部分) ,此时双击它,来到相关代码处,再分析源代码。

  2、运行crackme,输入假的序列号,点击CHECK,出现错误提示:"Incorrect try again!! "记下。

  3、将crackmer备份一份,用W32DASM反汇编它。

  4、一旦完成反汇编 , 点串式数据参考(string data reference)按钮 , 在列出的字符串列表中找到 : "Incorrect try again!! " 并双击它 . (注:如代码中有多处有此字串,你再次双击后,光标将出现在下一代码上)

  5、关闭这个窗口回到主窗口 , 你应该能够看到下面这一行 :

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:

  |:00401595(C)

  |

  :004015AD 6A40 push 00000040

  * Possible StringData Ref from Data Obj ->"CrackMe"//错误提示窗口的标题

  |

  :004015AF 686C304000 push 0040306C

  * Possible StringData Ref from Data Obj ->"Incorrect try again!!"//错误提示处,我们来到这一行

  |

  :004015B4 6874304000 push 00403074

  :004015B9 8B4DE0 mov ecx, dword ptr [ebp-20]

  6、现在你必须从这行起向上找 , 直到找到有这样的命令为止 :cmp,jne,je,test 等等 .

  CMP = 比较 (如 CMP EAX, EBX) <- 比较EAX和EBX

  JE = 如果相等就跳转

  JNE = 如果不相等就跳转

  JL = 如果小于就跳转

  JLE = 如果小于等于就跳转

  JA = 如果大于就跳转

  JAE = 如果大于等于就跳转

  JMP = 无条件跳转

  7、注意这一行代码:

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:

  |:00401595(C)

  |

  :004015AD 6A40 push 00000040

  :00401595(C) 是代码位置而不是offset,表示指令由00401595一行跳转到此.此时你在利用菜单的转到代码位置功能或按shift+F12,在对话框中输入:00401595,你将来到此:

  :00401585 8D4DE4 lea ecx, dword ptr [ebp-1C]

  :00401588 51 push ecx

  :00401589 8D55F4 lea edx, dword ptr [ebp-0C]

  :0040158C 52 push edx

  * Reference To: KERNEL32.lstrcmpA, Ord:02FCh

  |

  :0040158D FF1500204000 Call dword ptr [00402000]

  :00401593 85C0 test eax, eax

  :00401595 7516 jne 004015AD

  8、此时你借助SOFTICE动态调试能很快找到序列号,在这我们今天用暴力法破解,注意 :

  :0040158D FF1500204000 Call dword ptr [00402000]//真假序列号比较核心(调用函数lsrcmpa比较)

  :00401593 85C0 test eax, eax//用eax当旗帜,如相等,则eax=0

  :00401595 7516 jne 004015AD//如不跳转则注册成功

  看明白了吗?要让程序接受任何注册码就只要把JNE (=不相等就跳)改成JE (=相等就跳).或把改成空指令nop(什么也不执行),这样前一各改法要注册就只能输入错误的注册码,后者可任意注册码。

  9、将绿色的光条移到 :00401595 7516 jne 004015AD上 , 在窗口底部有一行字指示这句命令的偏移地址 , 此处为 @Offset 00001595h. 这就是应该修改的地方了 .

  10、启动hiew, 打开crackme.exe,按 F4 然后选择 decode mode, 按 F5 输入偏移地址1595(@Offset 00001595h). 你应该看到下面这几行 :

  00401593: 85C0 test eax,eax

  00401595: 7516 jne .0004015AD

  11、这就是修改的地方了,按F3进入修正状态,在机器码处直接用7416代替7516,按F9存盘。或在这一行按F2或回车进入小汇编修改状态,输入正确的指令。

  12、第二种修改方法是用两个NOP指令(NOP指令机器码是90,是一个字节)代替机器码:7516,即改为:9090

  13、运行 crackme, 随便输入几个字符试试 . 成功了 ! (当然这只是对那些简单的程序有效)

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章