Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //VS 2019 Pro
- //Playing with ASM Flags
- #include <iostream>
- #include <Windows.h>
- #include <intrin.h> //__readeflags
- enum eFlags : DWORD
- {
- CF = 0x1,
- PF = 0x4,
- AF = 0x10,
- ZF = 0x40,
- SF = 0x80,
- //Tr1ck
- DF = 0x400,
- OF = 0x800
- };
- enum eFlagsStatus
- {
- Untouch,
- On,
- Off
- };
- __declspec(naked) void Pre()
- {
- __asm
- {
- mov eax, 0x00000000
- lahf
- shr eax, 8
- ret
- }
- }
- __declspec(naked) void Pos()
- {
- __asm
- {
- shl eax, 8
- sahf
- ret
- }
- }
- DWORD ChangeASMFlags(DWORD BK, eFlagsStatus pCF, eFlagsStatus pPF, eFlagsStatus pAF, eFlagsStatus pZF, eFlagsStatus pSF)
- {
- DWORD hRet = 2;
- if (pCF != eFlagsStatus::Untouch)
- {
- if (pCF == eFlagsStatus::On) hRet += eFlags::CF;
- }
- else
- {
- if (BK & eFlags::CF) hRet += eFlags::CF;
- }
- if (pPF != eFlagsStatus::Untouch)
- {
- if (pPF == eFlagsStatus::On) hRet += eFlags::PF;
- }
- else
- {
- if (BK & eFlags::PF) hRet += eFlags::PF;
- }
- if (pAF != eFlagsStatus::Untouch)
- {
- if (pAF == eFlagsStatus::On) hRet += eFlags::AF;
- }
- else
- {
- if (BK & eFlags::AF) hRet += eFlags::AF;
- }
- if (pZF != eFlagsStatus::Untouch)
- {
- if (pZF == eFlagsStatus::On) hRet += eFlags::ZF;
- }
- else
- {
- if (BK & eFlags::ZF) hRet += eFlags::ZF;
- }
- if (pSF != eFlagsStatus::Untouch)
- {
- if (pSF == eFlagsStatus::On) hRet += eFlags::SF;
- }
- else
- {
- if (BK & eFlags::SF) hRet += eFlags::SF;
- }
- return hRet;
- }
- void ChangeFlags_Way1()
- {
- eFlagsStatus pSF = eFlagsStatus::On;
- eFlagsStatus pZF = eFlagsStatus::Off;
- eFlagsStatus pAF = eFlagsStatus::Untouch;
- eFlagsStatus pPF = eFlagsStatus::Off;
- eFlagsStatus pCF = eFlagsStatus::On;
- DWORD BK = 0;
- Pre();
- __asm
- {
- mov BK, eax
- }
- BK = ChangeASMFlags(BK, pCF, pPF, pAF, pZF, pSF);
- __asm
- {
- mov eax, BK
- }
- Pos();
- }
- __declspec(naked) void Pre2()
- {
- __asm
- {
- pushfd
- pop eax
- ret
- }
- }
- __declspec(naked) void Pos2()
- {
- __asm
- {
- push eax
- popfd
- ret
- }
- }
- /*DWORD ChangeASMFlags2(DWORD BK, eFlagsStatus pCF, eFlagsStatus pPF, eFlagsStatus pAF, eFlagsStatus pZF, eFlagsStatus pSF, eFlagsStatus pDF, eFlagsStatus pOF)
- {
- //std::cout << std::hex << BK << std::endl;
- DWORD hRet = 770;
- if (pCF != eFlagsStatus::Untouch)
- {
- if (pCF == eFlagsStatus::On) hRet += eFlags::CF;
- }
- else
- {
- if (BK & eFlags::CF) hRet += eFlags::CF;
- }
- if (pPF != eFlagsStatus::Untouch)
- {
- if (pPF == eFlagsStatus::On) hRet += eFlags::PF;
- }
- else
- {
- if (BK & eFlags::PF) hRet += eFlags::PF;
- }
- if (pAF != eFlagsStatus::Untouch)
- {
- if (pAF == eFlagsStatus::On) hRet += eFlags::AF;
- }
- else
- {
- if (BK & eFlags::AF) hRet += eFlags::AF;
- }
- if (pZF != eFlagsStatus::Untouch)
- {
- if (pZF == eFlagsStatus::On) hRet += eFlags::ZF;
- }
- else
- {
- if (BK & eFlags::ZF) hRet += eFlags::ZF;
- }
- if (pSF != eFlagsStatus::Untouch)
- {
- if (pSF == eFlagsStatus::On) hRet += eFlags::SF;
- }
- else
- {
- if (BK & eFlags::SF) hRet += eFlags::SF;
- }
- if (pDF != eFlagsStatus::Untouch)
- {
- if (pDF == eFlagsStatus::On) hRet += eFlags::DF;
- }
- else
- {
- if (BK & eFlags::DF) hRet += eFlags::DF;
- }
- if (pOF != eFlagsStatus::Untouch)
- {
- if (pOF == eFlagsStatus::On) hRet += eFlags::OF;
- }
- else
- {
- if (BK & eFlags::OF) hRet += eFlags::OF;
- }
- return hRet;
- }*/
- /*
- * Direction Flag also with STD
- */
- /*DWORD ChangeASMFlags2(DWORD BK, eFlagsStatus pDF, eFlagsStatus pOF)
- {
- //std::cout << std::hex << BK << std::endl;
- DWORD hRet = BK && 0xFF;
- hRet += 0x200;
- if (pDF != eFlagsStatus::Untouch)
- {
- if (pDF == eFlagsStatus::On) hRet += eFlags::DF;
- }
- else
- {
- if (BK & eFlags::DF) hRet += eFlags::DF;
- }
- if (pOF != eFlagsStatus::Untouch)
- {
- if (pOF == eFlagsStatus::On) hRet += eFlags::OF;
- }
- else
- {
- if (BK & eFlags::OF) hRet += eFlags::OF;
- }
- return hRet;
- }*/
- //OF - Overflow Flag
- DWORD ChangeASMFlags3(DWORD BK, BOOL State)
- {
- //std::cout << std::hex << BK << std::endl;
- DWORD hRet = BK;
- if (State)
- {
- if (!(BK & eFlags::OF))
- {
- hRet += eFlags::OF;
- }
- }
- else
- {
- if (BK & eFlags::OF) hRet -= eFlags::OF;
- }
- return hRet;
- }
- void ChangeFlags_Trick()
- {
- eFlagsStatus pOF = eFlagsStatus::Off;
- eFlagsStatus pDF = eFlagsStatus::On;
- DWORD BK = 0;
- //std::cin.get();
- Pre2();
- __asm
- {
- mov BK, eax
- }
- //BK = ChangeASMFlags2(BK, pDF, pOF);
- BK = ChangeASMFlags3(BK, true);
- __asm
- {
- mov eax, BK
- }
- Pos2();
- __asm
- {
- jo _of
- }
- if (__readeflags() & (1 << 10))
- {
- // D flags is set
- goto _df;
- }
- goto _out;
- _df:
- std::cout << "DIRECTION" << std::endl;
- goto _out;
- _of:
- std::cout << "OVERFLOW" << std::endl;
- goto _out;
- _out:
- __asm
- {
- nop
- }
- }
- int main()
- {
- //ChangeFlags_Way1();
- ChangeFlags_Trick();
- std::cout << "FIN" << std::endl;
- std::cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement