当前位置:
凯发ag旗舰厅登录网址下载 >
编程资源
> 编程问答
>内容正文
编程问答
ida od双剑合璧=逆向无敌 -凯发ag旗舰厅登录网址下载
凯发ag旗舰厅登录网址下载
收集整理的这篇文章主要介绍了
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
作 者: 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:
如果我没翻到 步骤应该会是:
我们截取关键代码分析:
代码: cpu disasm 地址 十六进制数据 指令 profile comments获取输入内容 00401066 |. e8 bf000000 call
那此时肯定会弹出对话框 我们随便输入点什么 以”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
我们再点击”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
附件 101839
ok ~ 成功!
看到这里估计就会有人说了 就这么点 也想混优秀精华?没什么好看的 哼~!
回帖嘲讽下楼主 再右上角 深藏功与名。
----------------------
楼主为了保住节操 亦为了不被嘲讽 遂再花点时间
那么我们再进入节奏 我们从上面分析得到了那些关键信息?
那么我们把它拖入ida分析此函数如何?
选中函数”setunhandledexceptionfilter“回车-主窗口”空格“键
我们再左键点击红色框选中处
来到
依然 左键点击上图红色框选中处
来到真正的异常处理回调函数
我们左键单击此行
代码: .data:0040334a toplevelexceptionfilter db ',0 ; data xref: dialogfunc e1o 做如下操作:
按”c“键 将数据转换为代码
按”d“键 转换dword类型
可得到:
此时 我们看见完整的反汇编代码 可以开始真正的分析了 。
我们知道setunhandledexceptionfilter是设置异常处理函数 那么 我们自己制作一个demo如何? 那我们又要获得那些信息呢?
代码: 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
我们将它提取出来更好地去分析
代码: 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
总结
以上是凯发ag旗舰厅登录网址下载为你收集整理的ida od双剑合璧=逆向无敌的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。
- 上一篇:
- 下一篇: