Advertisement
Miseryk

C++ ASM Flags

Jan 6th, 2021
923
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.83 KB | None | 0 0
  1. //VS 2019 Pro
  2. //Playing with ASM Flags
  3.  
  4. #include <iostream>
  5. #include <Windows.h>
  6. #include <intrin.h> //__readeflags
  7.  
  8. enum eFlags : DWORD
  9. {
  10.     CF = 0x1,
  11.     PF = 0x4,
  12.     AF = 0x10,
  13.     ZF = 0x40,
  14.     SF = 0x80,
  15.  
  16.     //Tr1ck
  17.     DF = 0x400,
  18.     OF = 0x800
  19. };
  20.  
  21. enum eFlagsStatus
  22. {
  23.     Untouch,
  24.     On,
  25.     Off
  26. };
  27.  
  28. __declspec(naked) void Pre()
  29. {
  30.     __asm
  31.     {
  32.         mov eax, 0x00000000
  33.         lahf
  34.         shr eax, 8
  35.  
  36.         ret
  37.     }
  38. }
  39.  
  40. __declspec(naked) void Pos()
  41. {
  42.     __asm
  43.     {
  44.         shl eax, 8
  45.         sahf
  46.  
  47.         ret
  48.     }
  49. }
  50.  
  51. DWORD ChangeASMFlags(DWORD BK, eFlagsStatus pCF, eFlagsStatus pPF, eFlagsStatus pAF, eFlagsStatus pZF, eFlagsStatus pSF)
  52. {
  53.     DWORD hRet = 2;
  54.  
  55.     if (pCF != eFlagsStatus::Untouch)
  56.     {
  57.         if (pCF == eFlagsStatus::On) hRet += eFlags::CF;
  58.     }
  59.     else
  60.     {
  61.         if (BK & eFlags::CF) hRet += eFlags::CF;
  62.     }
  63.  
  64.     if (pPF != eFlagsStatus::Untouch)
  65.     {
  66.         if (pPF == eFlagsStatus::On) hRet += eFlags::PF;
  67.     }
  68.     else
  69.     {
  70.         if (BK & eFlags::PF) hRet += eFlags::PF;
  71.     }
  72.  
  73.     if (pAF != eFlagsStatus::Untouch)
  74.     {
  75.         if (pAF == eFlagsStatus::On) hRet += eFlags::AF;
  76.     }
  77.     else
  78.     {
  79.         if (BK & eFlags::AF) hRet += eFlags::AF;
  80.     }
  81.  
  82.     if (pZF != eFlagsStatus::Untouch)
  83.     {
  84.         if (pZF == eFlagsStatus::On) hRet += eFlags::ZF;
  85.     }
  86.     else
  87.     {
  88.         if (BK & eFlags::ZF) hRet += eFlags::ZF;
  89.     }
  90.  
  91.     if (pSF != eFlagsStatus::Untouch)
  92.     {
  93.         if (pSF == eFlagsStatus::On) hRet += eFlags::SF;
  94.     }
  95.     else
  96.     {
  97.         if (BK & eFlags::SF) hRet += eFlags::SF;
  98.     }
  99.  
  100.     return hRet;
  101. }
  102.  
  103. void ChangeFlags_Way1()
  104. {
  105.     eFlagsStatus pSF = eFlagsStatus::On;
  106.     eFlagsStatus pZF = eFlagsStatus::Off;
  107.     eFlagsStatus pAF = eFlagsStatus::Untouch;
  108.     eFlagsStatus pPF = eFlagsStatus::Off;
  109.     eFlagsStatus pCF = eFlagsStatus::On;
  110.     DWORD BK = 0;
  111.  
  112.     Pre();
  113.  
  114.     __asm
  115.     {
  116.         mov BK, eax
  117.     }
  118.  
  119.     BK = ChangeASMFlags(BK, pCF, pPF, pAF, pZF, pSF);
  120.  
  121.     __asm
  122.     {
  123.         mov eax, BK
  124.     }
  125.  
  126.     Pos();
  127. }
  128.  
  129. __declspec(naked) void Pre2()
  130. {
  131.     __asm
  132.     {
  133.         pushfd
  134.         pop eax
  135.  
  136.         ret
  137.     }
  138. }
  139.  
  140. __declspec(naked) void Pos2()
  141. {
  142.     __asm
  143.     {
  144.         push eax
  145.         popfd
  146.  
  147.         ret
  148.     }
  149. }
  150.  
  151. /*DWORD ChangeASMFlags2(DWORD BK, eFlagsStatus pCF, eFlagsStatus pPF, eFlagsStatus pAF, eFlagsStatus pZF, eFlagsStatus pSF, eFlagsStatus pDF, eFlagsStatus pOF)
  152. {
  153.     //std::cout << std::hex << BK << std::endl;
  154.  
  155.     DWORD hRet = 770;
  156.  
  157.     if (pCF != eFlagsStatus::Untouch)
  158.     {
  159.         if (pCF == eFlagsStatus::On) hRet += eFlags::CF;
  160.     }
  161.     else
  162.     {
  163.         if (BK & eFlags::CF) hRet += eFlags::CF;
  164.     }
  165.  
  166.     if (pPF != eFlagsStatus::Untouch)
  167.     {
  168.         if (pPF == eFlagsStatus::On) hRet += eFlags::PF;
  169.     }
  170.     else
  171.     {
  172.         if (BK & eFlags::PF) hRet += eFlags::PF;
  173.     }
  174.  
  175.     if (pAF != eFlagsStatus::Untouch)
  176.     {
  177.         if (pAF == eFlagsStatus::On) hRet += eFlags::AF;
  178.     }
  179.     else
  180.     {
  181.         if (BK & eFlags::AF) hRet += eFlags::AF;
  182.     }
  183.  
  184.     if (pZF != eFlagsStatus::Untouch)
  185.     {
  186.         if (pZF == eFlagsStatus::On) hRet += eFlags::ZF;
  187.     }
  188.     else
  189.     {
  190.         if (BK & eFlags::ZF) hRet += eFlags::ZF;
  191.     }
  192.  
  193.     if (pSF != eFlagsStatus::Untouch)
  194.     {
  195.         if (pSF == eFlagsStatus::On) hRet += eFlags::SF;
  196.     }
  197.     else
  198.     {
  199.         if (BK & eFlags::SF) hRet += eFlags::SF;
  200.     }
  201.  
  202.     if (pDF != eFlagsStatus::Untouch)
  203.     {
  204.         if (pDF == eFlagsStatus::On) hRet += eFlags::DF;
  205.     }
  206.     else
  207.     {
  208.         if (BK & eFlags::DF) hRet += eFlags::DF;
  209.     }
  210.  
  211.     if (pOF != eFlagsStatus::Untouch)
  212.     {
  213.         if (pOF == eFlagsStatus::On) hRet += eFlags::OF;
  214.     }
  215.     else
  216.     {
  217.         if (BK & eFlags::OF) hRet += eFlags::OF;
  218.     }
  219.  
  220.     return hRet;
  221. }*/
  222.  
  223. /*
  224. * Direction Flag also with STD
  225. */
  226. /*DWORD ChangeASMFlags2(DWORD BK, eFlagsStatus pDF, eFlagsStatus pOF)
  227. {
  228.     //std::cout << std::hex << BK << std::endl;
  229.  
  230.     DWORD hRet = BK && 0xFF;
  231.  
  232.     hRet += 0x200;
  233.  
  234.     if (pDF != eFlagsStatus::Untouch)
  235.     {
  236.         if (pDF == eFlagsStatus::On) hRet += eFlags::DF;
  237.     }
  238.     else
  239.     {
  240.         if (BK & eFlags::DF) hRet += eFlags::DF;
  241.     }
  242.  
  243.     if (pOF != eFlagsStatus::Untouch)
  244.     {
  245.         if (pOF == eFlagsStatus::On) hRet += eFlags::OF;
  246.     }
  247.     else
  248.     {
  249.         if (BK & eFlags::OF) hRet += eFlags::OF;
  250.     }
  251.  
  252.     return hRet;
  253. }*/
  254.  
  255. //OF - Overflow Flag
  256. DWORD ChangeASMFlags3(DWORD BK, BOOL State)
  257. {
  258.     //std::cout << std::hex << BK << std::endl;
  259.  
  260.     DWORD hRet = BK;
  261.  
  262.     if (State)
  263.     {
  264.         if (!(BK & eFlags::OF))
  265.         {
  266.             hRet += eFlags::OF;
  267.         }
  268.     }
  269.     else
  270.     {
  271.         if (BK & eFlags::OF) hRet -= eFlags::OF;
  272.     }
  273.  
  274.     return hRet;
  275. }
  276.  
  277. void ChangeFlags_Trick()
  278. {
  279.     eFlagsStatus pOF = eFlagsStatus::Off;
  280.     eFlagsStatus pDF = eFlagsStatus::On;
  281.     DWORD BK = 0;
  282.  
  283.     //std::cin.get();
  284.  
  285.     Pre2();
  286.  
  287.     __asm
  288.     {
  289.         mov BK, eax
  290.     }
  291.  
  292.     //BK = ChangeASMFlags2(BK, pDF, pOF);
  293.     BK = ChangeASMFlags3(BK, true);
  294.  
  295.     __asm
  296.     {
  297.         mov eax, BK
  298.     }
  299.  
  300.     Pos2();
  301.  
  302.     __asm
  303.     {
  304.         jo _of
  305.     }
  306.  
  307.     if (__readeflags() & (1 << 10))
  308.     {
  309.         // D flags is set
  310.         goto _df;
  311.     }
  312.  
  313.     goto _out;
  314.  
  315. _df:
  316.     std::cout << "DIRECTION" << std::endl;
  317.     goto _out;
  318.  
  319. _of:
  320.     std::cout << "OVERFLOW" << std::endl;
  321.     goto _out;
  322.  
  323. _out:
  324.     __asm
  325.     {
  326.         nop
  327.     }
  328. }
  329.  
  330. int main()
  331. {
  332.     //ChangeFlags_Way1();
  333.     ChangeFlags_Trick();
  334.  
  335.     std::cout << "FIN" << std::endl;
  336.  
  337.     std::cin.get();
  338.  
  339.     return 0;
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement