写点什么

学习笔记 3

用户头像
Qx
关注
发布于: 2020 年 12 月 09 日

1.immlabel插件的原理?

利用od的标签功能,通过找到对应内容的地址,加上标签,使出现使用该内容的位置,有标签标注

2.od搜索不到字符串,但IDA能搜索到字符串原因?

(1)od搜索中文字符串一般是使用大佬编写的插件,这个插件的搜索中文字符串,是通过从模块基址开始遍历,找到mov ,lea,push指令,判断后面的立即数是否以\0为结尾,就把包括\0在内的前面内容当成字符串

if( (立即数!=NULL) && ( 1==1 || '\0'!=立即数 ) )



(2)在部分程序中字符串被存储在结构体中,其16进制编码格式有所变化,以字符串的形式读取的内容与本质内容出现区别,导致od搜索不到字符串

0040117D |. 68 11094800 push CrackMe0.00480911
#右键=》数据窗口中跟随=》立即数
#显示出字符串
00480911 01 00 00 00 08 00 00 00 D7 A2 B2 E1 CA A7 B0 DC ......注册失败
00480921 01 
#可以看到字符串的开头是01 00,按照一般的字符串读取方式,读取到\0就会停下

(3)而IDA对字符串的搜索有所不同,IDA直接对PE文件进行静态搜索,所以能直接搜索到字符串。

(4)同理(3),对于某些软件的加密,其字符串可以通过IDA进行搜索,那么有可能连记事本也可以搜索到其字符串,从而被破解。

3.如何让IDA和od都搜索不到字符串?

(1)使用工具编辑一个注册失败的16进制编码

D7 A2 B2 E1 CA A7 B0 DC 00 注册失败.

(2)编辑程序,放入IDA和od,发现搜索不到“注册失败”的中文,但程序运行能打印“注册失败”

#include<iostream>
int main(){
char str[]={0xD7 ,0xA2 ,0xB2 ,0xE1 ,0xCA ,0xA7 ,0xB0 ,0xDC ,0x00};
printf(str);
return 0;
}

(3)原因在于该代码运行时,str内的char字符被以临时变量的形式存储在堆栈中,而od和IDA的搜索所针对的位置不是堆栈,无法生效,导致搜索不到。

8: char str[] = { 0xD7 ,0xA2 ,0xB2 ,0xE1 ,0xCA ,0xA7 ,0xB0 ,0xDC ,0x00 };
007118F2 C6 45 EC D7 mov byte ptr [str],0D7h
007118F6 C6 45 ED A2 mov byte ptr [ebp-13h],0A2h
007118FA C6 45 EE B2 mov byte ptr [ebp-12h],0B2h
007118FE C6 45 EF E1 mov byte ptr [ebp-11h],0E1h
00711902 C6 45 F0 CA mov byte ptr [ebp-10h],0CAh
00711906 C6 45 F1 A7 mov byte ptr [ebp-0Fh],0A7h
0071190A C6 45 F2 B0 mov byte ptr [ebp-0Eh],0B0h
0071190E C6 45 F3 DC mov byte ptr [ebp-0Dh],0DCh
00711912 C6 45 F4 00 mov byte ptr [ebp-0Ch],0

(4)假如char数组str定义为全局变量,那在程序的存储位置就不是堆栈,od就能搜索到其位置。

9: printf(str);
00D818E8 68 34 A0 D8 00 push offset str (0D8A034h)
00D818ED E8 59 F7 FF FF call _printf (0D8104Bh)
00D818F2 83 C4 04 add esp,4

4.当易语言程序运用线程输出弹窗时,如何定位关键点?

(1)易语言程序代码

(2)在od中的运行情况,直接通过定义messageboxA的方法无法找到关键点,需要知道易语言的线程特征码

(3)找到特征码,右键->查找参考->选定命令,双击非红色部分

(4)跳转到线程内部,call位置的函数 ,选中部位用于传入线程地址参数,启动线程

(5)爆破:找到if对应je指令,对je指令右键,二进制,nop,单步运行弹出成功



用户头像

Qx

关注

是个人 2020.07.28 加入

是个宅

评论 (1 条评论)

发布
用户头像
嘿嘿,当个笔记本也不错。
2020 年 12 月 10 日 13:44
回复
没有更多了
学习笔记3