0043404B|.8945 E8 MOV DWORD PTR SS:,EAX ;// 指令长度
0043404E|.837D 10 00 CMP DWORD PTR SS:,0 ;// 判断是不是危险指令, 见 _Disasm 原程序.
00434052|.74 76 JE SHORT CMD.004340CA ;// 将这条语句改成 JMP 4340CA, (74->EB), 就可以了
00434054|.F685 8DFAFFFF>TEST BYTE PTR SS:,30
0043405B|.74 6D JE SHORT CMD.004340CA
0043405D|.80BD 54F8FFFF>CMP BYTE PTR SS:,0
00434064|.75 04 JNZ SHORT CMD.0043406A
00434066|.33C0 XOR EAX,EAX
00434068|.EB 15 JMP SHORT CMD.0043407F
0043406A|>80BD 54F9FFFF>CMP BYTE PTR SS:,0
00434071|.75 07 JNZ SHORT CMD.0043407A
00434073|.B8 01000000 MOV EAX,1
00434078|.EB 05 JMP SHORT CMD.0043407F
0043407A|>B8 02000000 MOV EAX,2
0043407F|>C1E0 08 SHL EAX,8
00434082|.8D95 54F7FFFF LEA EDX,DWORD PTR SS:
00434088|.03C2 ADD EAX,EDX
0043408A|.53 PUSH EBX ; /Arg4
0043408B|.50 PUSH EAX ; |Arg3
0043408C|.8D8D DCFDFFFF LEA ECX,DWORD PTR SS: ; |
00434092|.68 B4484B00 PUSH CMD.004B48B4 ; |Arg2 = 004B48B4 ASCII "%s Do you REALLY want to execute this code at address %08X?"
00434097|.51 PUSH ECX ; |Arg1
00434098|.E8 2B130700 CALL CMD.004A53C8 ; \CMD.004A53C8, sprintf()生成字符串
0043409D|.83C4 10 ADD ESP,10
004340A0|.8D85 DCFDFFFF LEA EAX,DWORD PTR SS:
004340A6|.8B15 F4174D00 MOV EDX,DWORD PTR DS:
004340AC|.68 34010000 PUSH 134 ; /Style = MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2|MB_APPLMODAL
004340B1|.68 F0484B00 PUSH CMD.004B48F0 ; |Title = "Dangerous command"
004340B6|.50 PUSH EAX ; |Text
004340B7|.52 PUSH EDX ; |hOwner => 000A00CC ('zsmozsm - Main.exe - [CPU - m...',class='zsmozsm')
004340B8|.E8 F59B0700 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
004340BD|.83F8 06 CMP EAX,6 ; // 用户点 Yes, 继续执行
004340C0 74 08 JE SHORT CMD.004340CA
004340C2|.83C8 FF OR EAX,FFFFFFFF
004340C5|.E9 F8060000 JMP CMD.004347C2
004340CA|>8BBD 54FAFFFF MOV EDI,DWORD PTR SS: ; // 这里执行
004340D0|.81E7 F0000000 AND EDI,0F0
004340D6|.837D 10 02 CMP DWORD PTR SS:,2
修改 434052 处 74 为 EB, Copy to Execute, 保存文件 CMD2.EXE , 退出ollydbg.EXE.
用 CMD2.EXe 打开 Main.EXE , 忽略所有异常, F9,
在 412167 处异常, ExceptionCode = C000001E
Debug Option -- Exception -- Add last Exception -- Ignore custom Exception,
Shift + F9, 这个异常要经过好多次, 等一会儿, 仙剑就运行了.
http://www.chinadfcg.com/viewthread.php?tid=2033
http://www.chinadfcg.com/viewthread.php?tid=277
修正我的抗Antidbgod 1.10b2含全部插件下载
在上面的基础继续增加这个加强版,去除了讨厌的入口警告和危险指令提示,可以调试Acprotect1.x和某些刻意Antiod的软件。
这次应该没有问题了,大家帮忙测试一下.
直接覆盖上一版,设置一下插件和od工作路径。
用修改版OD脱DLL壳的问题:
请教脱DLL壳时如何在载入DLL后退出,即卸载laddll
因为我看到书上说到的DLL脱壳全部是用TRW,而我却不知道如何用OD来具体操作
脱DLL,研究了几天无果。
和脱EXE绝对不一样。
DLL调用时两次用到入口点的。载入DLL和卸掉DLL时各一次
根据看雪破解2要求,一般在第2次解压调用时脱壳。
可是教材完全是用TRW,我就是不会用OD操作。
如果和EXE操作步骤一样就好办了
载入DLL
停在
10001000/$8B4424 04 MOV EAX,DWORD PTR SS:
10001004|.A3 589A0010 MOV DWORD PTR DS:,EAX
10001009|.B8 01000000 MOV EAX,1
1000100E\.C2 0C00 RETN 0C
10001011 90 NOP
10001012 90 NOP
10001013 90 NOP
点菜单
查看
执行模块
右键相击对应模块
点跟随入口
可以得到入口程序
1000E001 >60 PUSHAD
1000E002 E8 03000000 CALL CAPTUREH.1000E00A
1000E007- E9 EB045D45 JMP 555DE4F7
1000E00C 55 PUSH EBP
1000E00D C3 RETN
1000E00E E8 01000000 CALL CAPTUREH.1000E014
1000E013 EB 5D JMP SHORT CAPTUREH.1000E072
1000E015 BB EDFFFFFF MOV EBX,-13
1000E01A 03DD ADD EBX,EBP
1000E01C 81EB 00E00000 SUB EBX,0E000
1000E022 83BD 22040000 0>CMP DWORD PTR SS:,0
1000E029 899D 22040000 MOV DWORD PTR SS:,EBX
1000E02F 0F85 65030000 JNZ CAPTUREH.1000E39A
1000E035 8D85 2E040000 LEA EAX,DWORD PTR SS:
但估计这是第一次解压DLL程序,DLL和EXE不同,无法跟踪。
教材中提到,卸载DLL时第2次调用解压。达到入口点
可能可以跟踪,但我不知道用OD如何卸掉DLL
兄弟是什么系统。莫非又是98在作怪
用的也是win98系统呀。对了,你用的OD是什么版本的,我的是10.0C汉化版 用原版OD后一切问题解决:
很简单,脱Dll的壳和EXE的方法一样,比如一个dll用UPX加的壳,你在载入的时候他会提示载入laddll,选是,然后选不分析,接下来就和脱EXE一样了,只要注意一下地址就行了,如EXE的虚拟地址是00400000,而Dll的地址是01000000的。但在修正入口的时候还是和EXE一样。如Dll入口地址是01001000的话,在修正入口点的时候应该是00001000才对。
你放上的附件是ASPACK2.12加的壳,脱壳后用FI查是C++编的,你先用OD载入这个dll,OD会提示用载入laddll,选是,然后选不继续分析,中断在壳的入口点。你先按F9运行程序,这时OD又会中断,在左下角提示dll初始化完成,你再按一下F9运行。这时Laddll就会启运一个程序窗口,你再关闭这个窗口,这个程序窗口就会卸载这个Dll了,这时OD又会中断在dll的入口,这时你就可以像脱EXE程序一样了。最后,谢谢你的程序(Dll),使我复习了一下脱Dll的方法并脱壳成功,只是不知能不能运行,现附上我脱的Dll:
我明白了,你用的是修改后的OD,现在你用没有修改过的OD试一试就不会有这个问题了。忘了说,我一般是用没有修改过的OD的。只是有时用一下。刚才我用修改过的OD载入也出现和你一样的问题,这个可能是二哥修改过的OD的Bug吧?
以上是战神和雪很冷的脱DLL壳讨论稿
转OllyDbg实用技巧六则
标题: OllyDbg实用技巧六则
作者:dOSKEY lEE
关键词: OllyDbg、OD、技巧
1、让跳转路径显示出来
打开Options\Debugging Option。弹出Debugging Option对话框,选择CPU页,选定“Show direction to jumps”、“Show jump path”和“Show grayed path if jump is not taken”。如此以来在Disassembler窗口就会显示跳转的路径了。
2、让OD显示MFC42.DLL中的函数
如果程序是用MFC进行的动态编译,那么在OD中将只能显示MFC42.DLL中的函数为:
00410E40|.E8 43000000CALL <JMP.&MFC42.#1576> 1576是函数在MFC42.DLL中的序号。打开Debug\Select import libraries,单击弹出的对话框中“Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序,你就可以看见函数名称变为:
00410E40|.E8 43000000CALL <JMP.&MFC42.#1576_?AfxWinMain@@Y>
IDA中分析出了来的东西一样了!呵呵,以后不用等待IDA的“细嚼慢咽”也可以轻松搞定MFC程序了。其他的DLL类似,如果有序号,可以在VC的LIB目录中找到相关的.LIB文件,加到OD中便可。如果你没有“MFC42.DLL”,你可以的到看学论坛的下载区找,我已经上传到那里了。
3、让OD轻松躲过“ANTI-DEBUG”
很多“ANTI-DEBUG”的程序都是在程序开始时来检查是否安装调试器的。用这种特性我们可以轻松的用OD的“Attach”绕过检查部分。如“X语言”,如果你哟内TRW2K/S-ICE/OD 直接加载它的话,程序回警告你安装了调试器并结束。但是我们在“X语言”开启后再运行OD,并用“Attach”系上它就就可以了,轻松通过检查。而且在OD系上它后仍然可以用CTRL+A进行分析。如此一来,快哉!:)
4、轻松对付调用“MessageBoxA”以及类似的模态对话框的程序
很多人都认为OD不好拦截“MessageBoxA”这类API函数。其实我们有个很简单的办法将API拦截下来,并且快速找到比较地点/主算法地点。首先用OD加载目标程序,如果不能加载,用上面的方法“Attach”目标程序。然后,F9运行目标程序,并且有意让目标程序显示“ MessageBox”,然后切换到OD中,F12暂停,如
0041201F|>53 PUSH EBX ; /Style
00412020|.57 PUSH EDI ; |Title
00412021|.FF75 08 PUSH ; |Text
00412024|.FF75 F4 PUSH ; |hOwner
00412027|.FF15 A8534100 CALL DWORD PTR DS:; \MessageBoxA
0041202D|.85F6 TEST ESI, ESI ; 停在此处
0041202F|.8BF8 MOV EDI, EAX
00412031|.74 05 JE SHORT 1551-CRA.00412038
F8单步一下,切换到“MessageBox”中,确认,被OD中断。我们可以看见上面的代码41201F处有一个“〉”,说明可以从某段代码跳转到此处,我们选择41201F这一行,在“Information”栏看见一句“JUMP FROM 412003”,右键单击,选择“GO TO JUMP FROM 412003”。回到412003,一般都是条件跳转,上面的内容就是比较的地方啦。:)
5、使用OD的TRACK功能
OD拥有强大的TRACK功能,在分析算法时十分有用。首先我们要设定OD的TRACK缓冲区大小,选择Option\Debugging Option,在弹出的对话框中选择TRACK页,“Size of run track buffer(byte/record)”,缓冲区大小,当然约大约好。其他的设置在我以前的OLLYDBG.INI中都已经设置好了。然后,开启目标程序,在DEBUG中选择“Open or clear run track”。然后我们就可以用CTRL+F11或CTRL+F12开启“Track into”和“Track over”了。当我们暂停程序的时候,可以用小键盘上的“+”,“-”,“*”来控制TRACK功能了。
“Track into”和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。
“Track over”和“Track into”类似,但是不进入CALL
“+”用来显示TRACK缓冲区中的下一条指令
“-”用来显示TRACK缓冲区中的上一条指令
“*”用来发返回当前指令
6、不是技巧的技巧
当你遇到花指令的时候一定会很头痛。但是如果你用OD进行分析的时候就会轻松得多。OD会自动标识出无效指令,即花指令。如果OD没有正确识别,你还可以用CTRL+↑/↓来单个 字节的移动。可以很有效的识别出花指令的所在。 这么齐全,呵呵.
非常好
谢谢前几楼的介绍,让我这个小菜鸟有一点光亮 非常感谢前辈! 我想新手看了以后应该有所收获的! 用过几次,但只会简单的。继续努力。 Originally posted by journeyan at 2005-5-1 08:12 PM:厉害,全啊~~~~
是呀!非常有用!感谢! 菜鸟取经
大虾请指教 厉害!!多谢!