源**:
dword getselfimagesize(hmodule hmodule)
return dwimagesize;
} fs段指向teb(thread environment block )結構,fs+30h指向了peb(process environment block)結構,peb[0x0c]指向peb_ldr_data結構,該結構有三個成員均可用於列舉當前程序空間中的模組列表,區別在於載入順序、記憶體順序、初始化順序。在peb_ldr_data+0x1c地方就是一些動態連線庫的位址了,如第乙個指向ntdll.dll 第二個就 是我們需要的kernel32.dll的位址(mov ebp, [eax + 0x08] //ebp 就是kernel32.dll的位址了)
lods 裝入串.
把源串中的元素(字或位元組)逐一裝入al、ax或者eax中。(lodsb 傳送字元. lodsw 傳送字. lodsd 傳送雙字)
寫在後面的
teb[0x30]是乙個指向當前程序peb(process environment block)的指標。大家都這
麼說,可他們如何知道這個偏移的,你該上哪去找teb的資料結構定義,不同系統上
該結構定義一致嗎。windbg的dt命令:
> dt ntdll!*teb* (列出匹配萬用字元的結構名)
ntdll!_teb
... ...
> dt -v -r ntdll!_teb
struct _teb, 64 elements, 0xfb4 bytes
+0x000 nttib : struct _nt_tib, 8 elements, 0x1c bytes
+0x01c environmentpointer : ptr32 to void
+0x020 clientid : struct _client_id, 2 elements, 0x8 bytes
+0x028 activerpchandle : ptr32 to void
+0x02c threadlocalstoragepointer : ptr32 to void
+0x030 processenvironmentblock : ptr32 to struct _peb, 66 elements, 0x210 bytes
... ...
偏移、名稱、型別、大小等等一應俱全地列舉在此。
肯定有人見過這樣的**,之後eax將指向peb:
mov eax,fs:[18h]
mov eax,[eax+30h]
這樣的**居然也能成功獲取peb位址,惟一的解釋就是fs:[18h]與fs:0h指向同一處(注意方括號的使用)。teb結構第一成員是nt_tib結構,後者的self成員指向自身這個nt_tib結構,"碰巧"這個nt_tib結構是teb結構第一成員,於是可以認為self指向teb。self的偏移是0x18,就這麼簡單。
函式 數學函式
數學函式 abs degrees rand acos exp round asin floor sign atan log sin atn2 log10 sqrt ceiling pi square cos power tan cot radians abs 返回指定數值表示式的絕對值 正值 的數學...
sql數學函式
1.abs numeric expr 求絕對值 2.ceiling numeric expr 取大於等於指定值的最小整數 floor numeric expr 小於等於指定值得最大整數 3.exp float expr 取指數power numeric expr,power 返回power 次方sq...
Oracle 數學函式
round n,m 四捨五入,如果去掉m,則四捨五入到整數,如果m是正數,則四捨五入到小數點的m位,如果是負數,則四捨五入到小數點前。trunc n,m 該函式用於擷取數字。如果去掉m,就擷取小數部分,如果m是正數就擷取到小數點後的m位後,如果是負數,則擷取到小數點之前m位。mod n,m 取摸 f...