FS寄存器和Kernel32.DLL基址获取方法

FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针 TLS Thread Local Storage
030 PEB结构地址(进程结构)
034 上个错误号
得到KERNEL32.DLL基址的方法
[cc lang=”asm”]assume fs:nothing          ;打开FS寄存器
mov eax,fs:[30h]            ;得到PEB结构地址
mov eax,[eax + 0ch]        ;得到PEB_LDR_DATA结构地址
mov esi,[eax + 1ch]        ;InInitializationOrderModuleList
lodsd                      ;得到KERNEL32.DLL所在LDR_MODULE[/cc]
结构的InInitializationOrderModuleList地址
mov edx,[eax + 8h]         ;得到BaseAddress,既Kernel32.dll基址

8086伪指令[收集]

同一个程序中,标号或变量只能定义一次.

标号有三种属性:段、偏移、类型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)

数值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG

TYPE    expression(or label)

如果表达式是变量,则回送该变量以字节数表示的类型:DB为 1, DW为 2, DD为 4…

如果表达式是标号,则回送该标号类型的数值:NEAR为 -1, FAR为 -2.

如果表达式是常量,则回送0.

array DW A110H,B02CH,C322H            ADD    AX, TYPE  array 等价于 ADD    AX, 2

LENGTH    variable 对于变量使用DUP的情况,将回送分配给该变量的单元数; 对其它情况则回送1.

fees DW 100 DUP(?)            MOV  CX, LEGNTH  fees 等价于MOV  CX, 100

SIZE    variable 回送分配给该变量的字节数

MOV    CX, SIZE  fees 等价于 MOV CX, 200

OFFSET    variable (or lable) 回送变量或标号的偏移地址.

MOV    BX,OFFSET OPER_ONE 等价于 LEA BX,OPER_ONE 语句 ,将OPER_ONE的偏移地址送入BX

SEG    variable(or lable) 回送变量或标号的段地址.

若OPER_ONE是DATA_SEG数据段中的一个变量,下面语句取得DATA_SEG段首地址

MOV    DS , SEG OPER_ONE 等价于 MOV    AX , DATA_SEG            MOV    DS , AX
继续阅读“8086伪指令[收集]”

关于INT 2E 转帖留用 关于ANTI-DEBUG&ANTI-ANTI-DEBUG

转至:http://www.pediy.com/kssd/pediy08/pediy8-682.htm

下面是反汇编ntdll.dll的NtCreateEvent部分 NtCreateEvent调用了int 2E

Exported fn(): NtCreateEvent – Ord:005Ah
Exported fn(): ZwCreateEvent – Ord:02E2h
:77F83219 B81E000000         mov eax, 0000001E
:77F8321E 8D542404           lea edx, dword ptr [esp+04]
:77F83222 CD2E             int 2E
:77F83224 C21400             ret 0014

int 2e的使用方法:

mov eax, service_id
lea edx, service_param
int 2e

Windows 2000 int 2e 功能表
共248个
EAX = function number
EDX = address of parameter block
0x0   AcceptConnectPort
0x1   AccessCheck
0x2   AccessCheckAndAuditAlarm
0x3   AccessCheckByType
0x4   AccessCheckByTypeAndAuditAlarm
0x5   AccessCheckByTypeResultList
0x6   AccessCheckByTypeResultListAndAuditAlarm
0x7   AccessCheckByTypeResultListAndAuditAlarmByHandle
继续阅读“关于INT 2E 转帖留用 关于ANTI-DEBUG&ANTI-ANTI-DEBUG”

Flags

O 溢出 D I 单中断 T S 正负 Z Zero A P 奇偶 C 进错位

11      10 9          8 7          6            4 2           0

熟记

OF 溢出标志

DF 增量标志

保证字串处理方向  摘自0Day 第二版P91

IF 单中断标志

SF 正负标志 同时也是 Single Step标志

用于保证目标进程每执行一条指令就能与调试进程进行一次通信(摘自加密与解密3 P496)

ZF  0标志

PF 奇偶标志

CF 进错位标志

CrackMe#71 浮点

晕啊..碰到一个考数学的…

004013EE  |> \DD45 F8       fld     qword ptr [ebp-8]
004013F1  |.  D9FE          fsin
004013F3  |.  DD5D A8       fstp    qword ptr [ebp-58]
004013F6  |.  DD45 F0       fld     qword ptr [ebp-10]
004013F9  |.  D9FE          fsin
004013FB  |.  DD5D A0       fstp    qword ptr [ebp-60]
004013FE  |.  DD45 A8       fld     qword ptr [ebp-58]
00401401  |.  DC4D A0       fmul    qword ptr [ebp-60]               ;  sin*sin
00401404  |.  DF2D 30304000 fild    qword ptr [403030]
0040140A  |.  DEC9          fmulp   st(1), st                        ;  *
0040140C  |.  83EC 08       sub     esp, 8
0040140F  |.  DD1C24        fstp    qword ptr [esp]
00401412  |.  E8 D1000000   call    <jmp.&CRTDLL.floor>
00401417  |.  83C4 08       add     esp, 8
0040141A  |.  DD5D 98       fstp    qword ptr [ebp-68]
0040141D  |.  D9EE          fldz                                     ;  将0.0装入st(0)
0040141F  |.  DC5D 98       fcomp   qword ptr [ebp-68]
00401422  |.  DFE0          fstsw   ax
00401424  |.  9E            sahf
00401425      75 05         jnz     short 0040142C
上面关键算法

继续阅读“CrackMe#71 浮点”