Windows 逆向 Flashcards

1
Q

【.NET】

endfinally什么意思

A

表示finally或fault块的终结,并清空堆栈

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

【.NET】

ldc什么意思,下面分别什么意思:

ldc. i4
ldc. i4.m1
ldc. i4.1

A

载入,即入栈

ldc. i4 载入4字节
ldc. i4.m1 载入-1
ldc. i4.1 载入1

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

【破解】

外挂总是跳网址怎么办

A

下ShellExecuteA断点

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

【.NET】

一个方法,如果有返回值,ret执行时栈顶是什么样子的?
如果返回值是void,ret执行时栈顶是什么样子的?

A

如果有返回值,栈顶应有相应的值

如果返回值为void,ret执行时堆栈应为空

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

【.NET】

.stloc 6什么意思

A

从栈顶取值存入第6个寄存器

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

【破解】

遇到cmp ax,0xffff
意味着什么

A

85%都是vb用于判断的树枝,基本确定这个就是关键跳

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

【.NET】

请说出结构中程序头中字段的意思:
.assembly
.assembly extern
.module

A

.assembly 声明本程序集名称
.assembly extern 声明外部(被引用)程序集名称
.module 声明主模块名称

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

【.NET】

名称混淆都有哪些形式

A

乱码
无规律长字符串
无规律短字符串
()[]{}.形式

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

【.NET】

ldarg 2什么意思

A

载入第2个参数并入栈

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

【.NET】

源代码(IL或C#)中会多出某个特殊的属性定义来保护程序,怎么办

A
源代码(IL或C#)中会多出某个属性定义,把这个属性删除即可
(用round-tripping)
相关保护属性有:
DebuggerHiddenAttribute
DebuggerNonUserCodeAttribute
DebuugerStepThroughAttribute
SuppressIldasmAttribute
IL里面格式形如[DebuggerHiddenAttribute]或[assembly:DebuggerHiddenAttribute]
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

【.NET】

windows文件名只支持少数字符,且不支持乱码,某些符号,空字符串作为文件名来保护程序,该如何应对

A

在源文件中奖资源文件改名为Windows文件系统允许的名称,然后使用ildasm反编译,再次编译回可执行文件时,尽量将名称再修改回去,以保证源代码中对资源的调用正常

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

stfld 什么意思

A

从栈中取出待存数据和实例指针,并将数据存储到对应的字段中

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

【破解】

如何应对退出暗桩

A

用od的api插件-程序退出断点下断

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

【破解】

如何给代码区块(.text)赋予写权限(共2种方法)

A

方法1:dump找4000000,右键指定pe头,找到第一个区块(.text区块),看到charactoristics,把60000020改为E0000020

方法2:lordPE -> PE编辑器 -> 区段 ->编辑,把60000020改为E0000020

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

说出二次开发的常规流程

A
找个空白处
做个dll
exe中添加倒入函数
exe中添加个菜单选项
进入WndProc中hook这个函数
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

如何判断是不是网络验证

A

网络验证有延迟

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

如何手动分析花指令

A
用run跟踪(run trace)
在调试选项里把跟踪缓存调到最大
断下后在调试中点击开始跟踪
查看-run 跟踪,右键保存到文件
Ctrl+F12跟踪步过,就记录了走了那些命令
建议使用Imm
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

【.NET】

.text区块结构有什么

A
输入表
CLR头
MSIL代码,异常处理表(可选)
强名称的hash数据
元数据:
    元数据头
    元数据流
托管资源数据(可选)
非托管资源(可选)
运行时启动信息
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

OD中,如何让程序运行到光标所在位置
如何从制定位置开始运行
程序跑飞怎么办

A

F4
右键-此处设为新eip
在下面一行f2,去按钮【t】,激活全部线程

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

【.NET】

not是什么意思
neg是什么意思
二者什么关系

A

not:取反
neg:求补

补码就是对一个数取反再加1

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

暗桩的关键字符串有哪些

A
physicaldrive0: 跟随,00填充
破,破解
ntfs,format,本地磁盘,kill
debug,ollydbg
断首retn
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

【破解】

回想一下push大法绕过登陆

A
绕过网络验证登录,显示其他窗体:
右键查找二进制字符串,搜索hex,ff 25,易语言特征,
向上看那个过程,在第一个加载的窗体id下断(push xxxxxxxx),
这个窗体id是总窗口,我们需要登录后的窗口,右键查找命令,
push 10001,找到需要的窗口id(如果不是需要的窗体,查找下一个10001),
这样两个id都知道了,把第一个push窗口id换成登录成功那个id就可跳过登录。

push法窗体id找不到:
每个push段都有一个call,回车call会去jmp xxx的易语言体,主要在所有jmp处下断,看堆栈就能找到窗体id,如果有没加壳的窗体,可以依照它结合堆栈还原窗体

push法应对暗桩 ,od载入修改后有暗桩的程序:

自动退出暗桩:在api常用断点>程序退出下断,堆栈看下面返回到xxxx,跟随。

易语言一堆push表示创建窗体
特点:

push。。。
push。。。
push。。。
push。。。
mov 。。。
call 。。。
add esp 。。。这就是一个窗体或弹窗段
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

【.NET】

stind什么意思
stind.ref什么意思

A

间接存储:从栈顶先后取一个值和一个指针,并将该值存储到指针所指位置

stind.ref 存储一个对象引用

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

静态分析时怎么才能找到main函数

A

由于main函数实际要压入三个参数,所以在GetCommandlineA函数下面不远处可以找到有三个push的,就是main函数

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

【.NET】

starg 2什么意思

A

从栈顶取值并存到第2个参数

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Inter处理器是大端还是小端,小端是什么意思

A
小端
小端:高地址高位,低地址低位
如0x11223344,内存中就是
低地址------------>高地址
0x44,0x33,0x22,0x11
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

请画出pe文件格式简图

A
各种区块
区块表
pe头
dos stab
dos头
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

【.NET】

TypeDef的Extends项错误怎么办

A

CFF打开,在表中TypeDef的第一项处的Extends项改为0

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

用Alt+M在内存中搜ctrl+B字符串时,搜到了以后怎么做

A
在搜到的地址下内存访问断点或硬件断点
或
反汇编窗口搜索:push+搜到的地址
或
在反汇编窗口搜索常量:搜到的地址
或
反汇编窗口中哦过呢ctrl+b搜索:搜到的地址(小端)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

【破解】

脱壳后有的文件会自校验大小怎么办

A

设置api断点,GetfileSize,f9,看堆栈反汇编跟随,用户凌空下断点

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

【.NET】

ldfld 什么意思

A

从栈顶取实例指针,然后按照取字段并入栈

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

【.NET】

ldloca 2什么意思

A

载入第2个局部变量的引用并入栈

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

【.NET】

请说出以下各类说明的意思:
.namespace
.class
.method
.field
.data
.custom
A
.namespace    名称空间声明
.class    类声明
.method    方法声明
.field    字段声明
.data    数据(常量)声明
.custom    自定义属性声明
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

【.NET】

switch-case在.Net逆向中怎么用的

A

switch …
写法:

switch(Label1,Label2,Label3,...,LabelN)
......                              //Default case
Label1:
......
Label2:
......

switch 会建立跳转表,从栈顶取
根据这个的值选择跳转目标,值为0则跳到Label1

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

(A xor B)xor B = ?

A

A

异或的异或是本身

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

【破解】

如果程序检测到正在被调试怎么办?
说出三种方法

A

方法1:
反复重新载入,直到不出现提示为止,然后shift f9

方法2:
HIDEOD

方法3:
换个OD

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

【.NET】

localloc什么意思

A

分配一块局部内存,该指令从栈顶取块的大小,并将分配的内存块的托管指针入栈

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

IDA PRO快捷键考察:
把机器码变为汇编

从当前地址处解析成函数

解析成数据

解析成ASCII

取消把函数汇编成机器码

交叉引用

变成C伪代码

搜索文本

A

C 把机器码变为汇编

P 从当前地址处解析成函数

D 解析成数据

A 解析成ASCII

U 取消把函数汇编成机器码

X 交叉引用

F5 变成C伪代码

Alt+t 搜索文本,Ctrl+t查找下一个

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

【.NET】

下面都是什么意思?
manifest:
Program:
.ctor:
Main:
A

manifest:清单
Program:是一个Program类
.ctor:方法
Main:静态方法

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

【.NET】

如何反流程混淆

A

针对{smartassembly}:{smartassassin},{smartkill}
针对Dotfuscator:DeDot
万能反混淆神器De4Dot
如果2层壳,根据他的提示可以将其一层一层的脱掉,如下所示:(顺序不能错,只能先de4dot 文件名 -p mc,再de4dot 文件名 -p df)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
41
Q

【.NET】

请说出round-tripping的步骤

A

ildasm中dump后(勾选line numbers,其他默认):一个资源文件,一个IL文件
修改后直接将俩文件拖到ilasm图标上
用ilasm再编译回去,运行命令:
在SDK命令行中:

ilasm /resource=hellodump.res hellodump.IL #生成release版
ilasm /debug/resource=hellodump.res hellodump.IL #生成debug版

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
42
Q

函数调用大致包括几个步骤?

A

1、参数入栈
2、返回地址入栈
3、跳转到函数入口
4、栈桢调整:序言+结尾

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
43
Q

【破解】

易语言中,非独立编译的按钮事件在哪里?

A

【E】中的fnr段中

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

在OD中,发现这个函数名太不好记了,想要更改函数名,怎么办?

A

去函数地址,右键,编辑标签

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
45
Q
cmp bl,2D
je 00402D13
......
cmp bl,2B
je 00402D15
看到这段代码,应该想到什么?
A

就是把字符串转换成对应的整数

如将串“123456”转换成整数123456

46
Q

【.NET】

什么是流程混淆

A

目的是让反编译软件无法将IL转换为高级语言

scanid看,程序拖到de4dot,scanid看,再de4dot一次,把生成的cleaned放到univeral fixer,点fix assembly,把fix用reflector打开

47
Q
OD快捷键考察:
单步步过的快捷键
单步步入的快捷键
运行快捷键
条件断点快捷键
条件记录断点快捷键
暂停快捷键
跳转到地址快捷键
A
F8 单步步过的快捷键
F7 单步步入的快捷键
F9 运行快捷键
shift+F2 条件断点快捷键
shift+F4 条件记录断点快捷键
F12 暂停快捷键
ctrl+G 跳转到地址快捷键
48
Q

【.NET】

看结构用什么看

A

dnspy或cff explorer

49
Q
IDA PRO快捷键考察:
反汇编窗口切换文本跟图形
退到上一个操作地址
搜索地址或符号
重命名
注释
添加标签
列出所有标签
看见系统所有模块
A
空格:反汇编窗口切换文本跟图形,右键Group node可折叠
ESC:退到上一个操作地址
G    :搜索地址或符号
N    :重命名
;   :注释
Alt+M:添加标签
Ctrl+M:列出所有标签
Ctrl+S:看见系统所有模块
50
Q

【.NET】

如何根据reflector提示信息修改相应PE?

A

如果提示:Invalid number of data directories in NT header,就去可选头部的最后一项RVA数和大小,值改为0x10
如果提示:Module contains multiple #GUID heaps说明有2个#GUID,则在MetaData Header中的NumberOfStreams改为减少1个

51
Q

【.NET】

程序被一般编码了怎么办?

A

以IL形式查看方法可以清楚地看出还原过程

52
Q

【.NET】

token是干什么用的
token:0x06000001是什么意思

A

token是元数据项的唯一标识,是一个uint数值AABBBBBBh
前一个字节AA指出了它对应的表,后三个字节BBBBBB指出了它在表中的位置

特殊情况,AA=70时,对应的都是用户字符串,后三个字节对应该字符串在#US流中的偏移

IL不直接和内存打交道,而是采用token的方式

53
Q
用按钮事件下断点时,请分别说出以下语言的按钮事件怎么找?
vb&delphi
易语言
VC++
MFC
A

vb&delphi:用OD脚本
易语言:FF 55 FC 5F 5E或(edebug)FF25易语言体
VC++:sub eax,0xa
MFC:sub eax,0xa或MFC事件工具

54
Q

关键call的特点是什么?

A

95%的关键call是不能被跳过的,如果关键跳上面的call可以跳过,那么基本就不是关键call

55
Q

有的程序是cmd.exe,OD没法附加,怎么办

A

任务管理器右键,转到进程看进程名
仍然无法附加的话就exeinfo pe,右下角提取出来
还是没办法附加的花就在pchunter中挂起进程再附加

56
Q

遇到程序需要创建文件的,应该下什么api断点

A

createfileA

createfileW

57
Q

【.NET】

br 8是什么意思

A

从当前位置移动8个位置

58
Q

【.NET】

brtrue(或brinst) 8是什么意思?

A

value不为0,则跳转8个位置

59
Q

列出od找断点的12中方法?

A

1) api法
2) 字符串法
3) 使用其他汇编工具,如dede
4) 消息断点
5) 条件断点
6) 条件记录断点
7) 内存断点或硬件断点
8) 万能断点
9) 按钮事件
10) 特征码法
11) F12暂停法
12) Ctrl+N找函数

60
Q

内存断点如果假死怎么办

A

先硬件执行断点,再内存断点,鼠标放到程序,断下,F

8

61
Q

【.NET】

nop
dup
pop
分别什么意思

A

nop:空指令
dup:复制当前栈顶元素,若栈顶为空则出错
pop:出栈,若栈顶为空则出错

62
Q

请说出字符串法的9种方法

A
1、先脱壳
2、F9运行起来再找
3、中文搜索:开启强制搜索
4、从外面打开,od附加
5、去除花指令之后再找
6、Alt+M然后Ctrl+B
7、Alt+E去dll中搜
8、有可能在language文件夹中的ini文件中
9、edebug events调试
63
Q

有的软件打开后就消失了,程序会先退出,然后删除自身。怎么办

A

先退出,后删除,exitprocess下断(ff25或搜exitprocess或api),deletefile下断,断不下就搜函数名,deletefile,还断不下,就运行,在打开和删除中间空隙快速暂停,返回到用户,f8跟到结束,看什么时候结束或删除,按-号,找跳过,有时,就算跳过这个,后面还需要跳

64
Q

【.NET】

元数据是什么

A

描述数据的数据
1、元数据本身也是数据
2、它的功能是描述其他数据

元数据描述了一个模块声明或引用的所有项

65
Q

【.NET】

算数运算堆栈有什么变化?

A

算数运算会从栈顶取两个参数进行相应运算,并将结果入栈。

66
Q

【.NET】

程序强名称编码了怎么办

A

用{smartkill}

67
Q

【.NET】

如何应对名称混淆

A

反混淆也只是先分析,然后手动把名称改掉
方法1:对反编译代码修改,不改变原文件
Dis#的名称修改功能
dnspy右键也可编辑修改

方法2:
直接修改可执行文件的元数据,将#String流中的数据改为新的名称

68
Q

OD中向上翻变回去了是什么原因

A

中间那段根本不是代码也不是花指令,而是字符串!

数据与代码的混合使反汇编出现无意义代码。00其实是字符串的结尾。LoadLibrary的参数是指向字符串的指针,而那个返回值就指向字符串的首地址。所有的都解释得通了。

69
Q

neg eax
sub eax,eax
是什么意思?

A

eax=0时,eax=0

eax!=0时,eax=-1

70
Q

破解时,jxx关键跳上面如果不是call,而是cmp地址常量,和1或0比较,这种该怎么办?

A

地址常量 和0或1比较这种的,基本上jxx修改也只是自慰,需要查找地址常量参考,原来跟1比较就改成跟0比。
全部下断,留下cmp的,修改对比数(或者修改赋值)

这种方法不好使就数据跟随常量,下word写入硬件断点,断下,看上面会有个call,diy这个call,也可以进call去跟可疑码挨个试验

71
Q

破解的时候蓝屏怎么办,关机怎么办

A

蓝屏插件去蓝屏,pchunter防止关机

72
Q

【.NET】

如何手动去掉强名称

A

PE文件的元数据头中共有四处与程序集本身强名称相关的标识(dnspy可以看到)
1、CLR头(也叫Cor20Header或.NET目录)中的flags项,去除COMIMAGE_FLAGS_STRONGNAMESIGHNED标志;
2、CLR头中的StrongNameSignatiure RVA和Size都改为0
3、Assembly表中的Flags项,减去0x0001(PublicKey标识)
4、Assembly表中的Publickey项,只想Blob的偏移,用0填充

73
Q

有关注册表的程序什么思路?

A

方法1:
注册表也可以下api关闭注册表断点,反复f9堆栈找software。
找不到就运行,regedit,第三项,software看看存什么,注册,再看看存什么,
还是没有就可能要注册成功提示后写入注册表,想办法自慰提示成功,就写进去了。
然后下api regcreatkey断点,两种编码都下。读了假码,就一定会和真码对比

方法2:
直接搜software

方法3:
查看模块间调用,找reg

方法4:
RegQueryValueExA(W)下断

74
Q

易语言怎么干掉退出

易语言退出call的特点是什么

A

退出段首retn

特点:55开头,有俩call

75
Q

【.NET】

unaligned 8什么意思

A

前缀指令,意思是栈顶的指针数据大小为8字节

76
Q

【.NET】

如何使用工具取出强名称

A
方法1(去除):
推荐工具Strong Name Remove
载入程序后点Verify检测,
Patch用来清除本身强名称(只清除本身)
Patch Reference 用来去除引用信息(选中要去除的dll,只清除选中的dll的)

方法2(替换,通用性更强些):
工具:Re-Sign
sn.exe复制到c盘
cmd中

cd ....\
snk -k new.snk
其中new.snk就是要替换的签名文件用Re-Sign选择程序和snk

方法3:以上两种都不行的话就用{smartkill}

77
Q

od分析时,发现关键call被多次调用,这个发现有什么启发

A

直接修改关键call就可以一次性全部破解,进入关键call,mov eax,xxx;retn xx(xx根据原本返回多少就是多少)

78
Q

【.NET】

什么叫名称混淆

A
在#string流中做手脚,修改类型和成员名称
名称混淆可达到三个目的:
隐藏原作者编程意图,增加阅读难度
扰乱反编译软件的代码显示功能
增大通过反编译手段修改源程序的难度
79
Q

【.NET】

cpblk和initblk分别是什么意思?

A

cpblk:复制一块内存,按顺序从堆栈取三个操作数:
待复制内存块的字节大小
源地址
目标地址

initblk:初始化一块内存,按顺序从堆栈取三个操作数:
待初始化内存块的字节大小
初始化值
块的起始地址

80
Q

【.NET】

endfiter什么意思?

A

表示filter块的终结,从栈顶去4个字节整数值,
若该值为1,代表该异常应该被处理
若该值不为1,代表继续搜索合适的异常处理

81
Q
【.NET】
解释指令:
stobj
cpobj
newobj
castclass
A

stobj
依次从堆栈中获取值类型的值,以及值类型实例的指针,然后将该值存储在指针所指的实例中
cpobj
从栈中获取源和目标实例的指针,并将值类型的值从源复制到目标,源和目标都必须符合所标示的值类型
newobj
分配内存,创建某个类(不是值类型)的新实例,调用所标示的实例构造方法,并将对象引用入栈。若该构造方法需要参数,则从堆栈中取得这些参数
castclass
从栈中取初始类实例的对象引用,将其转换为所标示的类,然后将类实例的对象引用入栈

82
Q

【.NET】

ldc.i4.1
ldc.i4 10
接下来,写出如果1>10,则跳转8个位置

A

bge 8

83
Q

【.NET】

brfalse(brzero,brnull) 8是什么意思

A

如果value为0,则跳转8个位置

84
Q

【.NET】

leave 8什么意思

A

清空堆栈,从当前跳转8个位置

85
Q

【.NET】

逻辑条件检测cgt是怎样操作堆栈的?

A

检测是否大于

与比较跳转类似,但不跳转,仅将计算结果入栈(1:真,0:假)
它从栈上取两个数据,为栈顶元素

86
Q

【.NET】

请说明下面五个元数据流是干什么用的:
#~
#String
#Blob
#GUID
#US
A
#~
最重要的堆,几乎所有元数据信息都以表的形式存储于此,因此又叫元数据表流
#String
包含各种元数据名称(如类名,方法名,成员名,参数名),首部有一个0,以0结尾
#Blob
二进制数据堆,存储程序的非字符串信息,如常量值,方法的签名,强名称等
#GUID
存储说有全局唯一标识
#US
IL代码中使用的用户字符串,如ldstr调用的字符串
87
Q

【破解】

怎样用cff注入一个自己写的hello.dll

A

引入添加器,添加,hello.dll,单击引出函数,按名称引入,重建引入表

88
Q

【.NET】

ldind是什么意思

A

间接载入

从栈顶取出一个指针,载入该指针所指向的数值,并入栈

89
Q

【.NET】

解释指令:
ldnull
ldobj
ldstr

A

ldnull:读取空的对象引用,并入栈

ldobj :从堆栈获取值类型实例的托管指针(通过ldarga,ldloca,ldflda或ldsflda取得该指针),然后读取所标示的值类型的实例,并入栈。

ldstr :读入一个字符串,建立[mscorlib]System.String实例,并入栈
在IL中,可以用字符串表示,也可以用字节队列表示,如:
ldstr “hello”+”world”
ldstr bytearray(A1 00 A2 00 A3 00 A4 00 A5 00 A6 00)

90
Q

F2断点崩溃怎么办?

A

改用内存断点或硬件断点

91
Q

【.NET】

ldftn
ldvirftn
calli
干什么用的?

A
ldftn :
取得所标示方法的指针并入栈
ldvirftn :
从栈顶取对象引用(实例指针),并从相应的v-table中取得方法的指针并入栈
calli 
从栈顶获取方法的指针,并从栈中依次读取方法的参数,按所标示的方式调用方法。
92
Q

od怎样带壳破解?

A

api常用断点>取初始断点,意思是在程序已经解码与开始运行程序之间的空当下断,f9,断下了,有时需要多次f9才能到初始点,如何判断:看ctr b,如果不是add byte xxxx形式,说明已经解码

93
Q

怎样增加输入函数

A

用LordPE
1、PE编辑器->目录,点击输入表的”…”

2、在任意一个DLL上右键,添加导入表,输入DLL文件和函数名(如USER32.dll和MessageBoxA),点+,点OK,LordPE会新增一个区块存放新增的IID数据

3、之后回到【输入表】窗口,选中刚刚的DLL文件,勾选总是查看FirstThunk。则ThunkRVA的值就是该函数在IAT中的RVA地址,调用的时候代码就写call [基址+ThunkRVA],//此处的基质为当前文件的基址,如exe文件基址通常是400000,如果是代码修改在dll中,则需要重定位

4、之后随便找一个空白地方填上想要的字符串参数

push 0
push title字符串地址
push text字符串地址
push 0
call dword ptr [400000+ThunkRVA]
94
Q

怎样去掉nag

A

方法1:
exescope或resource hacker查看函数handle instance例如:100
然后od查找命令 push 0x64 (16进制100)

方法2:
od载入一步步跟到nag出现

方法3:4c法去除vb的nag:
每个vb都是push 地址开头,在数据中搜 (地址+0x4c),存储的是另一个地址2,去地址2上,第24(十进制的36)个字节是顺序标志,将上下两块顺序颠倒

95
Q

有时候修改mov eax,4由于字节长度关系会覆盖下面的指令,怎么办?

A

把会覆盖的代码放到下面填充部分,上面加一个mov eax,4,然后在要修改的地方jmp到填充位置,之后再jmp回去

96
Q

说说山寨网络验证的原理。

A

自己弄个服务器,修改程序指向自己的服务器

97
Q

在OD中diy一段汇编代码时,当复制上面的call xxx时,需要注意什么

A

call xxx中的xxx是会变的,需要手动改成正确的

98
Q
OD快捷键考察:
载入程序:
自动跑,步过:
重新载入:
分析代码:
复制二进制指令机器码:
复制所在地址:
执行到返回:
跳出程序领空,执行到用户代码:
A
载入程序:F3
自动跑,步过:Ctrl+F8
重新载入:Ctrl+F2
分析代码:Ctrl+A
复制二进制指令机器码:Shift+X
复制所在地址:Ctrl+X
执行到返回:Ctrl+F9
跳出程序领空,执行到用户代码:Alt+F9
99
Q

【.NET】

加密软件将元数据流表保存为未优化的#-流,大多数工具不支持解析该格式,怎么办?

A

需要再次编译程序,让ilasm将程序集的元数据表流恢复成#~

100
Q

没有401000怎么办

A

运行时,ctrl g输入recv,下断,回溯到10000000

101
Q

遇到读取配置文件的程序,有什么思路?

A

情况1:
API断点>ReadFile
情况2:
针对ini,GetPrivateProfileStringA下断,F9,Alt+F9

102
Q

GUID堆大小错误了怎么办?

【.NET】

A

修正方法1:使用ilasm再编译
修正方法2:使用CFF直接修改:
选中MetaData Strams节将#GUID项大小改为16即可

103
Q

【.NET】

看Module表,发现有一个无关的模块怎么办?

A

删除多余的模块数据即可
方法1:ildasm反编译导出IL,再次编译回去,就自动将多余的模块删除了,因为ilasm生成的程序是不会包含错误的元数据的

方法2:
step1:
修改Module记录数,
CFF中表头部看MaskSorted,记下偏移量
在winhex中去到偏移量的地址,MaskSorted是4字节,紧随其后的就是一个双字,就是Module的记录数了,修改这个记录数。
step2:
删除多余Module数据
CFF中看多余的那个Module偏移量,UltraEdit打开,选中要删除的那10个字节,右键cut
step3:
增加10字节空数据:在#~流的结尾,#String流开始前补上10字节空数据
104
Q

程序有次数限制怎么办

A

修改注册表或者:
第一步,把程序领空跳转全部备注y/n
第二部,运行到次数为0,对比看那个跳转变动

105
Q

明明已经确定算出的注册码是正确的,输入exe中就是错误,怎么办

A

试试把用户名和注册码调换一下

106
Q

【.NET】

什么是强名称,强名称有什么作用

A

弱名称三要素:程序集名称,版本号,地域信息
强名称 :在弱名称基础上再加一个要素:数字签名
强名称作用 :1、区分不同程序集(包括版本不同)2、标识原作者信息,确保代码不被篡改

107
Q

【.NET】

ldarga 2什么意思

A

载入第2个参数的地址

108
Q

IDA Pro中:

*v1 = 6是什么意思

A

[v1] = 6

109
Q

【.NET】

字符串资源保存在哪里?
图片资源保存在哪里?

A

字符串大多保存在#US流中,被ldstr指令直接引用

图片保存在.resources文件中

110
Q

怎样在程序上新增一个区块.hijack

A

CFF explorer:
1、节头部中选中一个区块,右键添加节(空白区),大小随便,如1000h,然后填上节名字.hijack
2、右键,重建映像大小,保存即可

111
Q
IDA Pro快捷键考察:
搜索16进制:
打开断点列表:
单步步入:
单步步过:
运行到函数返回地址:
运行到光标处:
A
搜索16进制:Alt+B,查找下一个Ctrl+b
打开断点列表:Ctrl+Alt+B
单步步入:F7
单步步过:F8
运行到函数返回地址:Ctrl+F7
运行到光标处:F4