欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程资源 > 编程问答 >内容正文

编程问答

ida od双剑合璧=逆向无敌 -尊龙游戏旗舰厅官网

发布时间:2024/4/11 编程问答 24 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 ida od双剑合璧=逆向无敌 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
标 题: 【原创】ida od双剑合璧=逆向无敌
作 者: tennn
时 间: 2015-12-12,22:25:19
链 接: http://bbs.pediy.com/showthread.php?t=206437

我这一周学<软件逆向>是薛老师讲课, 大多挺深,我就列出一个典型的吧。 

准备工具: ollydbg  ida   vs2012  

---------------------------------
我们先把目标程序winasm_0.exe拖入peid 
主界面

那我们去输入表看看


也好像没什么特别值得关注的。

、那好 简单测试下程序   看有什么状况发生 

看 弹出对话框 那我们该想到什么?api断点!messagebox相关!

不急我们把它拖入od  直接ctrl a分析
入口点:

习惯性的我把它上下一翻、发现:

这不是我们要找的字符串吗?(
ps:
如果我没翻到 步骤应该会是:
  • 搜索字符串
  • 下api断点
  • 其它...

  • 我们截取关键代码分析:
    代码: cpu disasm 地址        十六进制数据            指令                                       profile  comments获取输入内容 00401066  |.  e8 bf000000   call        ;           \user32.getdlgitemtexta 0040106b      a3 13114000   mov dword ptr ds:[401113],eax            ;           mov dword ptr ds:[401113],eax 比较eax 00401070  |.  83f8 05       cmp eax,5                                ; 00401073  |.  75 13         jne short 00401088                       ; 比较 fubar? 00401075  |.  be 2a334000   mov esi,offset 0040332a                  ; 0040107a  |.  bf 41304000   mov edi,offset 00403041                  ;           ascii "fubar" 0040107f  |.  b9 06000000   mov ecx,6                                ; 00401084  |.  f3:a6         repe cmps byte ptr ds:[esi],byte ptr es: ;            看zf标志以决定转移与否 00401086  |.  74 19         je short 004010a1                        ; 00401088  |>  6a 00         push 0                                   ;           /type = mb_ok|mb_defbutton1|mb_applmodal 0040108a  |.  68 1f334000   push offset 0040331f                     ;           |caption = " try again" 0040108f  |.  68 0f334000   push offset 0040330f                     ;           |text = "no, not really." 00401094  |.  6a 00         push 0                                   ;           |howner = null 00401096  |.  e8 95000000   call            ;           \user32.messageboxa 0040109b  |.  33c0          xor eax,eax                              ; 0040109d  |.  c9            leave                                    ; 0040109e  |.  c2 1000       retn 10                                  ; 那好 我们暂且就这样分析 在地址 00401066 处f2断点   f9运行!
    那此时肯定会弹出对话框  我们随便输入点什么 以”15pb“为例  再点击 check
    会在刚刚所设断点处停下来:

    f8单步走走试试?

    首先肯定是获取我们输入的字符” 15pb“而后 继续f8单步 会发现 下不去了 !!
    左下角有提示 :” 访问冲突 正在写入到[00401113]....去跳过异常程序
    首先 根据提示 我们就可以判断” 内存访问异常“(这个没有标准 按逆向经验及知识面有各自的判断 )
    好办 !暴力破解,这个个人最喜欢了 不费脑子!
    左键选中
    代码: cpu disasm 地址        十六进制数据            指令                                       profile  comments 0040106b      a3 13114000   mov dword ptr ds:[401113],eax            ;           mov dword ptr ds:[401113],eax
  • 左键单击选中-右键-编辑-填充为nop(有些od可以直接del)  
  • 左键单击选中-右键-复制所有修改到可执行文件-”忽视所有警告“
  • 在所弹出窗口-右键-保存文件-确定-重名为”1“(保存在桌面)

  • 我们再点击”1.exe“,再次输入”15pb“  点击check!
    依然出错! 

    为什么?
    我们再重复 拖入od:
    附件 101838
    我们看红色选中框.这时估计就会有人提问了 上面不就有吗 为什么留在这儿说 故意充版面? 
    不不不! 一步一步来  我这篇逆向文章面向大部分人(普通人)  大牛们当然可以一眼定乾坤!
    普通人可不一样 所以 我得一点一点来 叙述要通俗易懂 尽量营造出菜鸟思维
    如果我直接这样~这样~这样~这样!再这样~那还写什么啊

    废话不多说 我们分析代码:
    代码: cpu disasm 地址        十六进制数据            指令                                       profile  comments eax与5相比较  00401070    83f8 05         cmp eax,5                                ; 判断zf标志位   若zf=0  跳转至地址“00401088”  显然是错的 00401073    75 13           jne short 00401088                       ; 00401075    be 2a334000     mov esi,offset 0040332a                  ; 0040107a    bf 41304000     mov edi,offset 00403041                  ;           ascii "fubar" ecx 一般做循环比较次数 6? 等等 与上面那个5有什么关系? 字符串自带反斜杠0 如果去掉呢?就是长度5 ! 我们再往下分析 0040107f    b9 06000000     mov ecx,6                                ; esi与字符串“fubar”相比较    00401084    f3:a6           repe cmps byte ptr ds:[esi],byte ptr es: ; je ? 结果很显然了 00401086    74 19           je short 004010a1                        ; 00401088    6a 00           push 0                                   ; 0040108a    68 1f334000     push offset 0040331f                     ;           ascii " try again" 0040108f    68 0f334000     push offset 0040330f                     ;           ascii "no, not really." 00401094    6a 00           push 0                                   ; 00401096    e8 95000000     call            ;           跳转至 user32.messageboxa 关掉od 我们用字符串”fubar“去试试  为什么? 你再想想看
    附件 101839
    ok ~ 成功!

    看到这里估计就会有人说了  就这么点 也想混优秀精华?没什么好看的 哼~! 
    回帖嘲讽下楼主 再右上角 深藏功与名。



    ----------------------
    楼主为了保住节操 亦为了不被嘲讽 遂再花点时间

    那么我们再进入节奏  我们从上面分析得到了那些关键信息?
  • 内存访问异常!在不可写处写数据“
  • ”peid导入表可疑函数:setunhandledexceptionfilter:设置异常处理函数“

  • 那么我们把它拖入ida分析此函数如何?

    选中函数”setunhandledexceptionfilter“回车-主窗口”空格“键

    我们再左键点击红色框选中处

    来到 

     依然 左键点击上图红色框选中处 

    来到真正的异常处理回调函数


    我们左键单击此行
    代码: .data:0040334a toplevelexceptionfilter db ',0        ; data xref: dialogfunc e1o 做如下操作:
    按”c“键  将数据转换为代码  
    按”d“键 转换dword类型
    可得到:

    此时 我们看见完整的反汇编代码  可以开始真正的分析了 。
    我们知道setunhandledexceptionfilter是设置异常处理函数 那么 我们自己制作一个demo如何? 那我们又要获得那些信息呢?
  • 获取异常中断值
  • 获取esi 即 第一条指令
  • 代码: .data:0040334e                 push    esi 说干就干 (ctrl f5运行)
    代码: long   __stdcall   callback(_exception_pointers*   pexcp)    {   //异常printf("%p\n",pexcp->exceptionrecord->exceptioncode);  printf("%p\n",pexcp->contextrecord->esi);   //esi辅助分析getchar();return   exception_execute_handler;    }int _tmain(int argc, _tchar* argv[]) {setunhandledexceptionfilter(callback); unsigned ueax,uebx,uecx,uedx,uebp;__asm  //使用__asm进行内联汇编{//使用mov指令将eax寄存器的内容保存到ueax变量mov ueax, eax  mov uebx, ebxmov uecx, ecxmov uedx, edxmov uebp,ebp}printf("eax=%x\tebx=%x\tecx=%x\tedx=%x\nuebp=%x\n", ueax, uebx, uecx, uedx,uebp);//设置异常int *f =0;*f = 9;system("pause");return 0; } 来我们回到ida反汇编代码:
    代码: ta:0040334a                 enter   0, 0 .data:0040334e                 push    esi        ;将结构体压入堆栈 .data:0040334f                 mov     esi, [ebp arg_0] ; 取结构体exception_pointers pexcp .data:00403352                 lodsd                   ; 取pexcp->exceptionrecord  此时esi 4 .data:00403353                 mov     eax, [eax]      ; 将pexcp->exceptionrecord->exceptioncode内容给eax .data:00403353                                         ; 即eax= c0000005 从demo得到 .data:00403355                 and     eax, 0deadffh   ; eax=5 .data:0040335a                 shl     eax, 5          ; eax=a0 .data:0040335d                 mov     ebx, eax        ; ebx=a0 .data:0040335f                 lea     eax, [eax 402faeh] ; 40304e  即 magic .data:00403365                 mov     esi, [esi]      ; 取 pexcp->contextrecord .data:00403367                 mov     [esi 9ch], eax  ; 取pexcp->contextrecord 9c 即pexcp->contextrecord->edi .data:0040336d                 add     eax, 2dch       ; eax=2ac .data:00403372                 mov     [ebx esi], eax  ; pexcp->contextrecord->esi=2ac .data:00403375                 mov     eax, 400fdfh    ; eax=400fdf .data:0040337a                 add     eax, ebx        ; eax=40107f .data:0040337c                 mov     [esi 0b8h], eax ;  pexcp->contextrecord->esi b8 .data:0040337c                                         ; 即  pexcp->contextrecord->eip=40107f 即做完异常处理函数后跳转到地址40107f  .data:00403382                 xor     eax, eax .data:00403384                 dec     eax .data:00403385                 pop     esi 分析完毕 那么此时根据所分析得到数据回到od  ctrl g 地址”40107f“ :

    得到

    耶~! 我们分析得到极其有用的三条数据(惯例 红色高亮!)
    代码: cpu disasm 地址        十六进制数据            指令                                       profile  comments 00401073   /75 13           jne short 00401088                       ; 00401075   |be 2a334000     mov esi,offset 0040332a                  ; 0040107a   |bf 41304000     mov edi,offset 00403041                  ;           ascii "fubar" 0040107f   |b9 06000000     mov ecx,6                                ; 00401084   |f3:a6           repe cmps byte ptr ds:[esi],byte ptr es: ; 00401086   |74 19           je short 004010a1                        ; 00401088   \6a 00           push 0                                   ; 0040108a    68 1f334000     push offset 0040331f                     ;           ascii " try again" 0040108f    68 0f334000     push offset 0040330f                     ;           ascii "no, not really." 00401094    6a 00           push 0                                   ; 00401096    e8 95000000     call            ;           跳转至 user32.messageboxa 0040109b    33c0            xor eax,eax                              ; 0040109d    c9              leave                                    ; 0040109e    c2 1000         retn 10                                  ; 004010a1    68 b90b0000     push 0bb9                                ; 004010a6    ff75 08         push dword ptr ss:[ebp 8]                ; 004010a9    e8 76000000     call             ;           跳转至 user32.getdlgitem 为什么? 不说~!算是我留的作业吧 不太难  好好思考下

    我们将它提取出来更好地去分析
    代码: cpu disasm 地址        十六进制数据            指令                                       profile  comments 循环比较5次 (忽视反斜杠0) 0040107f    b9 06000000     mov ecx,6                                ; 与字符串magic相比较  我们刚刚不是分析出来了么? 00401084    f3:a6           repe cmps byte ptr ds:[esi],byte ptr es: ; 跳转至地址“004010a1” 00401086    74 19           je short 004010a1                        ; 来 我们把字符串”magic“输入试试 

    成功!

    看到这里又会有熟悉ida的人说了 这傻×(友善地 ) 不知道可以f5 以及结构体分析么? 
    我当然知道    你不觉得经过上面的曲曲折折的分析 自己又不知不觉的提高了么(此话面对菜鸟 也包括我自己 哈哈 )
    ------------------------------
    物尽其用 我们做如下操作:
    shift f9 或菜单栏:

    再 按”ins“ -"add standard structure"-添加结构体 以”exception_pointers“ 为例(其实也有用到) 

    再来到异常处理函数 选中指令”无脑“ 按”t“:


    或直接 f5 得到代码  就不贴图了 

    完。
    -------
    标题有点霸气 勿喷哈哈~   回宿舍睡觉 估计关门了 要敲门。。。。

    ----------------
    程序: winasm_0.rar.*转载请注明来自看雪论坛@pediy.com

    总结

    以上是尊龙游戏旗舰厅官网为你收集整理的ida od双剑合璧=逆向无敌的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

    • 上一篇:
    • 下一篇:
    网站地图